@oracle-agent/oracle 0.35.55 → 0.35.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  2. package/dist/bin/desk-server.mjs +1 -1
  3. package/dist/cli/commands/chat.mjs +221 -221
  4. package/dist/cli/commands/data.mjs +1 -1
  5. package/dist/cli/commands/doctor.mjs +5 -5
  6. package/dist/cli/commands/eval.mjs +150 -150
  7. package/dist/cli/commands/farm.mjs +16 -16
  8. package/dist/cli/commands/model.mjs +223 -223
  9. package/dist/cli/commands/quickstart.mjs +6 -6
  10. package/dist/cli/commands/sign.mjs +14 -14
  11. package/dist/cli/commands/signer.mjs +32 -25
  12. package/dist/cli/commands/venues.mjs +2 -2
  13. package/dist/data/desk-data.mjs +22 -22
  14. package/dist/data/providers/farming.mjs +2 -2
  15. package/dist/index.mjs +31 -31
  16. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  17. package/dist/local-signer/index.mjs +5 -5
  18. package/dist/local-signer/runtime.mjs +21 -22
  19. package/dist/teams/index.mjs +7 -7
  20. package/dist/tui/standalone-client.mjs +102 -102
  21. package/package.json +1 -1
  22. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  23. package/public/oracle-splash/docs/connectors/index.html +2 -2
  24. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  25. package/public/oracle-splash/docs/index.html +3 -3
  26. package/public/oracle-splash/docs/reference/index.html +2 -2
  27. package/public/oracle-splash/docs/security/index.html +2 -2
  28. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  29. package/public/oracle-splash/download/index.html +3 -3
  30. package/public/oracle-splash/downloads/index.html +1 -1
  31. package/public/oracle-splash/index.html +6 -6
  32. package/server.json +2 -2
@@ -1,5 +1,5 @@
1
- var Hr=Object.defineProperty;var L=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var jr=(e,t)=>{for(var r in t)Hr(e,r,{get:t[r],enumerable:!0})};import{AsyncLocalStorage as zr}from"node:async_hooks";function Pe(e){let t=qr.getStore();if(!t||t.closed||!Vr.includes(e))return null;if(t.spans.length>=Gr)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var qr,Vr,Gr,At=L(()=>{qr=new zr,Vr=["http","retry","shared"],Gr=512});import te from"node:net";import Jr from"node:dns";function Oe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let p=c.split(":"),m=p.at(-1);if(m?.includes(".")){let f=m.split(".").map(Number);if(f.length!==4||f.some(d=>!Number.isInteger(d)||d<0||d>255))return null;p.splice(p.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return p.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:p.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let a=t.includes("::"),l=8-i.length-s.length;if(!a&&l!==0||a&&l<1)return null;let u=[...i,...Array(Math.max(0,l)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(c=>[c>>8,c&255]))}function Ue(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function He(e){if(te.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(te.isIPv6(e)){let t=Oe(e);if(!t)return!1;let r=Oe("::ffff:0:0");return Ue(t,r,96)?He([...t.slice(12)].join(".")):Ue(t,Oe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ue(t,Oe(o),i)):!1}return!1}function Wr(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(Kr.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=te.isIP(r);return n!==0&&!He(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function je(e,{lookupFn:t=Jr.promises.lookup}={}){let r=Wr(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:te.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!He(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function Xr(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function ze({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(f){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${f?.message||f}`);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 i=f=>String(f).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,a=f=>(Array.isArray(f)?f:[f]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(te.isIPv6(d.address)?6:4)})),l=(f,d,h)=>{s.set(i(f),a(typeof d=="string"?[{address:d,family:h}]:d))},u=f=>{let d=i(f);if(te.isIP(d))return[{address:d,family:te.isIPv6(d)?6:4}];let h=s.get(d);if(!h||!h.length)throw new Error(`refused: unpinned host ${f} during pinned fetch`);return h},c=Xr(),p=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new r({connect:{lookup(f,d,h){let g;try{g=u(f)}catch(y){return h(y)}return d?.all?h(null,g):h(null,g[0].address,g[0].family)}}}),m=Yr((f,d={})=>n(f,{...d,dispatcher:p}),l);return{dispatcher:p,fetch:m,pin:l,resolve:u,async close(){try{await p.destroy()}catch{}}}}function Yr(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[qe]=Object.freeze({pin:t}),e}function Ve(e){return typeof e=="function"&&typeof e[qe]?.pin=="function"}function vt(e,t,r){if(!Ve(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[qe].pin(t,r)}var Kr,qe,Pt=L(()=>{Kr=new Set(["localhost","metadata.google.internal","metadata.goog"]);qe=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Zr}from"node:crypto";import{types as q}from"node:util";function I(e){return Y(`HTTP JSON body refused: ${e}`)}function cn(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 q[t]=="function"&&q[t](e))}function ln(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,a=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>z.bytes)throw I("serialized byte limit exceeded");t.push(c)},l=c=>{if(Buffer.byteLength(c,"utf8")>z.bytes)throw I("serialized byte limit exceeded");return JSON.stringify(c)},u=(c,p)=>{if(n+=1,n>z.nodes)throw I("node limit exceeded");if(p>z.depth)throw I("depth limit exceeded");if(c===null){a("null");return}if(typeof c=="string"){a(l(c));return}if(typeof c=="boolean"){a(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw I("non-finite number");a(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw I("unsupported non-JSON value");if(q.isProxy(c))throw I("proxy value");if(cn(c))throw I("unsupported exotic object");if(s.has(c))throw I("cyclic value");s.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw I("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),h=0;for(;d!==null;){if(q.isProxy(d))throw I("proxy array prototype");if(h+=1,h>z.depth)throw I("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>z.arrayLength)throw I("array length limit exceeded");for(let y=0;y<c.length;y+=1){let b=Object.getOwnPropertyDescriptor(c,String(y));if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw I("array entries must be dense enumerable own data")}let g=0;for(let y in c){if(i+=1,i>z.fields)throw I("enumeration limit exceeded");if(Object.hasOwn(c,y)&&(g+=1,g>c.length))throw I("named array fields are unsupported")}if(g!==c.length)throw I("array entries must be dense enumerable own data");a("[");for(let y=0;y<c.length;y+=1)y&&a(","),u(Object.getOwnPropertyDescriptor(c,String(y)).value,p+1);a("]");return}let m=Object.getPrototypeOf(c);if(m!==Object.prototype&&m!==null)throw I("non-plain object");let f=[];for(let d in c){if(i+=1,i>z.fields)throw I("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>z.fields)throw I("field limit exceeded");let h=Object.getOwnPropertyDescriptor(c,d);if(!h||!Object.hasOwn(h,"value")||h.enumerable!==!0)throw I("object fields must be enumerable own data");f.push([d,h.value])}a("{");for(let d=0;d<f.length;d+=1)d&&a(","),a(l(f[d][0])),a(":"),u(f[d][1],p+1);a("}")}finally{s.delete(c)}};return u(e,0),t.join("")}function un(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(q.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 i=Object.getOwnPropertyDescriptor(e,n);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[n]=String(s)}return t}function dn(){return Object.assign(Object.create(null),{Accept:"application/json"})}function pn(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 fn(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Te(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Rt.get(e);return t||(t=Lt,Lt+=1,Rt.set(e,t)),`reference:${t}`}function $t(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?mn.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 Ct(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($t);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return $t(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&hn.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function gn(e,t,r,n={},o=null){let i=Zr("sha256"),s=(l,u)=>{let c=String(u);i.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),i.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
2
- `)};s("method",e),s("url",t),Object.keys(r||{}).map((l,u)=>({name:l.toLowerCase(),order:u,value:String(r[l])})).sort((l,u)=>l.name.localeCompare(u.name)||l.order-u.order).forEach((l,u)=>{s(`header-name-${u}`,l.name),s(`header-value-${u}`,l.value)}),s("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${l}`,n[l]??"-");return i.digest("hex")}function wn(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Tt):Math.min(250*2**e,Tt)+Math.floor(Math.random()*100)}function Y(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Je(e,t,r){return Y(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function re(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function bn(e){return e?e.byteLength??e.length??0:0}async function xn(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(re(e),!n))throw Je(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let p=await e.text(),m=Buffer.byteLength(p,"utf8");if(m>t){if(!n)throw Je(r,`body ${m} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let a=[],l=0,u=!1;try{for(;;){let{value:p,done:m}=await s.read();if(m)break;if(p&&(a.push(Buffer.from(p)),l+=bn(p),l>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw Je(r,`streamed ${l} bytes`,t);let c=Buffer.concat(a);return(u?c.subarray(0,t):c).toString("utf8")}function En(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function kn(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:l=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:c=!1,importUndici:p,validateResponse:m,signal:f,redirectPolicy:d="follow",maxRedirects:h=Ne}){let g=null,y=t,b=s?{lookupFn:s}:{};if(l&&!a&&!Ve(y))throw Y(`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 x=new AbortController,A=setTimeout(()=>x.abort(),i),R=f?_t?_t([f,x.signal]):f:x.signal,W=async(E,{status:P=null}={})=>{let O=await je(E,b);if(!O.ok)throw Y(P==null?`HTTP refused ${E}: ${O.error}`:`HTTP redirect to ${E} ${O.error}`,P==null?{}:{status:P});let X=new URL(E).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await ze({requireUndici:!0,...p?{importUndici:p}:{}})}catch(w){throw Y(P==null?`HTTP refused ${E}: ${w?.message||w}`:`HTTP redirect to ${E} refused: ${w?.message||w}`,P==null?{}:{status:P})}g.pin(X,O.addresses),y=g.fetch}else vt(y,X,O.addresses);return O};try{let E=String(e),P=Object.assign(Object.create(null),n||{});l&&await W(E);for(let O=0;O<=h;O+=1){let X=Object.assign(Object.create(null),{method:r,headers:P,body:o,signal:R,redirect:"manual",dispatcher:void 0}),w=await y(E,X);if((d==="error"||h===0)&&w.status>=300&&w.status<400)throw re(w),Y(`HTTP ${w.status} ${r} redirect refused`,{status:w.status,redirectRefused:!0});if(an.has(w.status)){let M=c===!0&&r==="POST"&&[307,308].includes(w.status)&&Ct(r,o);if(r!=="GET"&&r!=="HEAD"&&!M){re(w);let v=new Error(`HTTP ${w.status} ${r} ${E} redirected non-idempotent request`);throw v.status=w.status,v}if(O===h)throw re(w),Y(`HTTP ${w.status} ${r} redirect budget exhausted`,{status:w.status,redirectRefused:!0});let xt=w.headers?.get?.("location"),F;try{F=pn(xt,E)}catch(v){throw re(w),v}let ee=!fn(F,E);if(re(w),ee&&r==="POST"){let v=new Error(`HTTP ${w.status} ${r} cross-origin redirect refused`);throw v.status=w.status,v}if(ee&&c){let v=new Error(`HTTP ${w.status} ${r} cross-origin redirect refused`);throw v.status=w.status,v.retryable=!1,v}if(ee&&(P=dn(P)),l)await W(F,{status:w.status});else if(ee){let v=await je(F,b);if(!v.ok){let S=new Error(`HTTP redirect from ${E} ${v.error}`);throw S.status=w.status,S.retryable=!1,S}a&&v.addresses?.length&&(g||(g=await ze(p?{importUndici:p}:{})),g&&(g.pin(new URL(F).hostname,v.addresses),y=g.fetch))}E=F;continue}if(typeof m=="function")try{await m(w,{url:E})}catch(M){throw re(w),Y(M?.message||String(M))}let N=await xn(w,u,{url:E,onOversize:()=>x.abort()}),fe=En(N);if(!w.ok){let M=new Error(`HTTP ${w.status} ${r} ${E}`);throw M.status=w.status,M.retryAfter=w.headers?.get?.("retry-after")??null,M.body=fe??N.slice(0,300),M}return fe??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(E){if(x.signal.aborted&&!ge(f)){let P=E&&(typeof E=="object"||typeof E=="function")&&!q.isProxy(E)?E:null,O=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(O&&Object.hasOwn(O,"value")&&O.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 w=new Error("HTTP request timed out");throw Object.defineProperties(w,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),w}}throw E}finally{clearTimeout(A),g&&await g.close()}}async function $(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&q.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 S of Object.getOwnPropertyNames(t)){let k=Object.getOwnPropertyDescriptor(t,S);if(!(S==="toJSON"&&k&&Object.hasOwn(k,"value")&&k.value===void 0)){if(!r.has(S))throw new TypeError("HTTP options contain unknown fields");if(!k||!k.enumerable||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=S=>{if(t==null||!Object.hasOwn(t,S))return;let k=Object.getOwnPropertyDescriptor(t,S);if(!k||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain own data properties");return k.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 i=n("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=n("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>Ne))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Ne}`);if(a==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=a??"follow",c=u==="error"?0:l??Ne;for(let S of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let k=n(S);if(k!==void 0&&typeof k!="boolean")throw new TypeError(`HTTP ${S} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let m=n("signal");if(m!==void 0){if(q.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ge(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let S of["importUndici","lookupFn","validateResponse"]){let k=n(S);if(k!==void 0&&typeof k!="function")throw new TypeError(`HTTP ${S} must be a function`)}let f=n("fetchImpl"),d=f||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let h=i??12e3,g=(o||"GET").toUpperCase(),y=n("headers"),b=un(y),x=Object.assign(Object.create(null),b);Object.keys(x).some(S=>S.toLowerCase()==="accept")||(x.Accept="application/json");let A=n("body");A!=null&&typeof A!="string"&&(Object.keys(x).find(k=>k.toLowerCase()==="content-type")||(x["Content-Type"]="application/json"),A=ln(A));let R=s??en,W=n("lookupFn"),E=!f,P=n("untrustedUrl")===!0,O=n("sameOriginRedirectsOnly")===!0,X=n("importUndici"),w=n("validateResponse"),N=m,fe=p??null,M=async()=>{let S;for(let k=0;k<=R;k++){N&&nn.call(N);let Et=Pe("http");try{let j=await kn(e,{fetchImpl:d,method:g,headers:x,body:A,timeoutMs:h,lookupFn:W,realFetch:E,untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,importUndici:X,validateResponse:w,signal:N,redirectPolicy:u,maxRedirects:c});return Et?.("succeeded"),j}catch(j){S=j;let ae=Be=>{if(!j||typeof j!="object"&&typeof j!="function"||q.isProxy(j))return;let me=Object.getOwnPropertyDescriptor(j,Be);return me&&Object.hasOwn(me,"value")?me.value:void 0},ve=ae("status");Et?.("failed",ve);let Dr=ae("oracleTimeout")===!0||ae("name")==="AbortError"||ae("name")==="TimeoutError"||ge(N),Fr=new Set([408,425,429]),Br=ae("retryable")===!1?!1:ve!=null?Fr.has(ve)||Qr.has(ve)&&Ot.has(g):!Dr&&Ot.has(g);if(k===R||!Br)throw j;let kt=wn(k,ae("retryAfter")),Ur=Pe("retry"),St=!1;try{N?await new Promise((Be,me)=>{let It,he=()=>{clearTimeout(It),Nt.call(N,"abort",he),me(sn(N)||new DOMException("Aborted","AbortError"))};if(ge(N)){he();return}It=setTimeout(()=>{Nt.call(N,"abort",he),Be()},kt),on.call(N,"abort",he,{once:!0}),ge(N)&&he()}):await yn(kt),St=!0}finally{Ur?.(St?"succeeded":"failed")}}}throw S};if(!(n("dedupe")!==!1&&!N&&Ct(g,A)))return M();let F=gn(g,e,x,{untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,redirectPolicy:u,maxRedirects:c,timeoutMs:h,retries:R,fetchImpl:Te(d),realFetch:E,lookupFn:Te(W),importUndici:Te(X),validateResponse:Te(w)},A),ee=Ge.get(F);if(ee){let S=Pe("shared");try{let k=await ee;return S?.("succeeded"),k}catch(k){throw S?.("failed"),k}}let v=M().finally(()=>Ge.delete(F));return Ge.set(F,v),v}var Qr,Ot,en,Tt,tn,rn,nn,on,Nt,_t,ge,sn,an,Ne,si,z,Ge,Rt,Lt,mn,hn,yn,B=L(()=>{At();Pt();Qr=new Set([408,425,429,500,502,503,504]),Ot=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),en=2,Tt=4e3,tn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,rn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,nn=AbortSignal.prototype.throwIfAborted,on=EventTarget.prototype.addEventListener,Nt=EventTarget.prototype.removeEventListener,_t=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ge=e=>e?tn.call(e):!1,sn=e=>e?rn.call(e):void 0,an=new Set([301,302,303,307,308]),Ne=3,si=64*1024,z=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ge=new Map,Rt=new WeakMap,Lt=1;mn=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),hn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);yn=e=>new Promise(t=>setTimeout(t,e))});import{createHash as In,createHmac as An,timingSafeEqual as di}from"node:crypto";function Ke(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ke).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ke(e[r])}`).join(",")}}`}function Dt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Ft(e=process.env){return Dt(process.env)||Dt(e)}function Tn(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Nn(e){let t=Tn(e);return In("sha256").update(Ke(t)).digest("hex")}function _n(e,t=Ft()){return t?An("sha256",t).update(String(e)).digest("hex"):""}function D(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let l=Number(o),u=i==null?l+Pn:Number(i),c=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||c<=0||c>On)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...a,preparedAt:l,expiresAt:u,prepareVersion:vn},f=Nn(m),d=Ft(n),h=d?_n(f,d):void 0,g={...m,prepareHash:f};return h&&(g.prepareMac=h),g}var vn,Pn,On,ce=L(()=>{vn=2,Pn=300*1e3,On=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{types as Bt}from"node:util";function Rn(e){if(!e||typeof e!="object"||Bt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function _e(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(Bt.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=_e(s.value,t,r+1)}return o}if(!Rn(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);n[o]=_e(i.value,t,r+1)}return n}var Ut=L(()=>{});function Cn({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"?$n:Ln}async function ne(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Cn(t);return _e(await $(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function We(e={}){return ne({type:"allMids"},e)}async function le(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ne(t,e)}var Ln,$n,we=L(()=>{B();Ut();Ln="https://api.hyperliquid.xyz/info",$n="https://api.hyperliquid-testnet.xyz/info"});async function jt(e={}){let t=Date.now();if(ye.dexs&&t-ye.at<6e4&&!e.fetchImpl)return ye.dexs;let r=await ne({type:"perpDexs"},e);return ye={at:t,dexs:Array.isArray(r)?r:[]},ye.dexs}async function zt(e="",t={}){let r=e||"",n=Date.now(),o=Ht.get(r);if(o&&n-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ne({type:"metaAndAssetCtxs",dex:e},t):await le(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],l={at:n,universe:s,ctxs:a};return Ht.set(r,l),l}function Fn(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return Dn[r]??t}function Re(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let r=t%10;if(r!==0&&r!==1)return null;let n=Math.floor(t/10),o=Vt+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function qt(e,t){let r=Xe(e),n=Xe(t);if(r==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(n!==0&&n!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*r+n;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=Vt+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:r,side:n,coin:`#${o}`,assetId:i}}function Xe(e){if(typeof e=="number")return Number.isSafeInteger(e)&&e>=0?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}async function Ye(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let u=e.coin==null?null:Re(e.coin);if(e.coin!=null&&!u)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let c=e.outcome==null?null:qt(e.outcome,0).outcome;if(c!=null&&u&&u.outcome!==c)throw new Error("hl-assets: coin does not match outcome");let p=e.outcomeSide==null?null:Bn(e.outcomeSide,"outcomeSide"),m=c??u?.outcome;if(e.outcome!=null&&e.coin==null&&p==null)throw new Error("hl-assets: outcomeSide required");let f=p??u?.side;if(f==null)throw new Error("hl-assets: outcomeSide required");if(m==null)throw new Error("hl-assets: outcome identity required");let d=qt(m,f);if(u&&(u.outcome!==d.outcome||u.side!==d.side))throw new Error("hl-assets: coin does not match outcome side");let h=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:d.coin,assetId:d.assetId,encoding:d.encoding,outcome:d.outcome,side:d.side,szDecimals:h,maxLeverage:1,dex:null,markPx:null}}let r=String(e.coin||e.symbol||e.name||"").trim();if(!r)throw new Error("hl-assets: coin required");if(r.includes(":")){let[u,...c]=r.split(":"),p=c.join(":");if(!u||!p)throw new Error(`hl-assets: bad builder coin ${r}`);let m=Fn(u),f=await jt(t),d=f.findIndex(R=>R&&R.name===m);if(d<1)throw new Error(`hl-assets: unknown builder dex "${u}"`);let{universe:h,ctxs:g}=await zt(m,t),y=h.findIndex(R=>R.name===`${m}:${p}`);if(y<0)throw new Error(`hl-assets: ${r} not in dex ${m} meta`);let b=h[y];if(b.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let x=Mn+d*1e4+y,A=g[y]||{};return{kind:"hip3",coin:b.name||r,assetId:x,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:m,dexName:f[d]?.fullName||m,dexIndex:d,indexInMeta:y,markPx:A.markPx??null}}let{universe:n,ctxs:o}=await zt("",t),i=r.toUpperCase(),s=n.findIndex(u=>u.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let u=await jt(t);for(let c=1;c<u.length;c++){let p=u[c];if(!p?.name)continue;let m=`${p.name}:${i}`;try{return await Ye({coin:m},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=n[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let l=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:l.markPx??null}}function Bn(e,t){let r=Xe(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var Vt,Mn,ye,Ht,Dn,Ze=L(()=>{we();Vt=1e8,Mn=1e5,ye={at:0,dexs:null},Ht=new Map;Dn=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function T(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Gt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function oe(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let r=T(e,t);if(r==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(r)&&!/^0x[0-9a-fA-F]+$/.test(r))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(r)}`);try{return BigInt(r)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(r)}`)}}function Qe(e,t="amount"){let r=oe(e,t);if(r<=0n)throw new Error(`${t} must be positive`);return r}function C(e,t,r="amount"){let n=T(e,r);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${r} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${r} has more than ${t} decimal places, which would lose precision`);let l=BigInt((s||"0")+a.padEnd(t,"0"));return o?-l:l}var Le=L(()=>{});function qn(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function Jt(e,t){let r=T(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(r))throw new Error(`hl: ${t} must be a positive decimal`);let[n,o=""]=r.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function U(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>U(n,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${U(e[n],t)}`).join(",")}}`}function Vn(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,r=e.orderWire;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: declared order wire required");if(t==="limit"){let i=r.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||U(r,"declared order type")!==U({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(U(r,"declared order type")!==U({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!n)throw new Error("hl: unsupported declared order type");let o=r.trigger?.triggerPx;if(o==null||U(r,"declared order type")!==U({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function Gn(e,t,r){let n=Jt(e.s,"signed size"),o=Jt(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,a=C(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let l=C(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>l)throw new Error("hl: notional exceeds cap")}function Jn(e,t){let r=e.action.builder;if(r==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: signed order builder must be structured");let n=Z(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Gt(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=oe(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=C(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function Kt(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(T(e.s,"hl: signed size")!==T(t.size,"hl: size"))throw new Error("hl: signed size must match");if(T(e.p,"hl: signed price")!==T(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(U(e.t,"signed order type")!==U(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function Wt(e,t,r,n,o){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(T(e.s,"hl: bracket protection size")!==T(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(T(e.p,"hl: bracket protection price")!==T(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(T(i.triggerPx,"hl: triggerPx")!==T(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function Kn(e){let t=String(e||"").replace(/\/$/,"");if(!Un.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function et(e){return Re(e)!=null}function Wn(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(et(r)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(r)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(r)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Xn(e,t,r){let n=Array.isArray(r.hlMarkets)?r.hlMarkets:[];if(n.length){if(!n.some(s=>{if(typeof s=="string"){let[a,l]=String(s).split(":");return a===e&&Number(l)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(et(e)){let i=Array.isArray(r.coins)?r.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(r.coins)?r.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function Xt(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: structured artifact required");let n=Z(r.kind,"kind",48),o=jn[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=Kn(r.submitTo);if(Object.prototype.hasOwnProperty.call(r,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(r.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!r.action||typeof r.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(r.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(r.action.type!==zn[n])throw new Error("hl: action type must match kind");let a=r.notionalUsd??0;if(Hn.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let l=Z(r.coin,"coin",64),u=r.assetId??r.assetIndex;if(!Number.isSafeInteger(u)||u<0)throw new Error("hl: assetId required");if(n==="hip4-order"||u>=1e8){let c=Re(l);if(!c||c.coin!==l)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(c.assetId!==u)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(Wn(l,t),Xn(l,u,t),n==="hip4-order"&&!et(l))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(r.side!=="buy"&&r.side!=="sell")throw new Error("hl: side must be buy or sell");if(r.action.type!=="order"||!Array.isArray(r.action.orders))throw new Error("hl: signed orders are required");Vn(r);let c=r.action.orders;if(n==="perp-bracket"){let p=r.takeProfitPx,m=r.stopLossPx,f=1+(p==null?0:1)+(m==null?0:1);if(f<2||c.length!==f||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");Kt(c[0],r,u);let d=1;p!=null&&Wt(c[d++],r,u,p,"tp"),m!=null&&Wt(c[d],r,u,m,"sl")}else{if(c.length!==1)throw new Error("hl: exactly one signed order is required");if(r.grouping!=="na"||r.action.grouping!==r.grouping)throw new Error("hl: signed grouping must match declared grouping");Kt(c[0],r,u)}Gn(c[0],r,t),Jn(r,t),a=T(r.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let c=r.leverage;if(!Number.isSafeInteger(c)||c<1)throw new Error("hl: leverage must be a positive integer");let p=t.maxLeverage==null?50:t.maxLeverage;if(typeof p!="number"||!Number.isSafeInteger(p)||p<1)throw new Error("hl: maxLeverage must be a positive integer");if(c>p)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let c=r.action.cancels;if(!Array.isArray(c)||c.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(c[0].a)||c[0].a!==u)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(r.orderId)||r.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(c[0].o)||c[0].o!==r.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==u)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(r.action.leverage)||r.action.leverage!==r.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(r.marginMode))throw new Error("hl: declared margin mode required");let c=r.marginMode==="cross";if(typeof r.action.isCross!="boolean"||r.action.isCross!==c)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==u)throw new Error("hl: signed margin asset must match assetId");let c=Z(r.usd,"margin usd",64),p=C(c,6,"hl: margin usd");if(oe(r.action.ntli,"hl: signed margin ntli")!==p)throw new Error("hl: signed margin amount must match usd");if(typeof r.isBuy!="boolean"||r.action.isBuy!==r.isBuy)throw new Error("hl: signed margin isBuy must match");let f=C(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),d=p<0n?-p:p;if(d>f)throw new Error("hl: margin notional exceeds cap");a=qn(d,6)}}if(n==="builder-fee-approval"){let l=Z(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(l))throw new Error("hl: builder address required");if(Z(r.action.builder,"signed builder",42).toLowerCase()!==l)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(d=>String(d).toLowerCase()):[]).includes(l))throw new Error("hl: builder not allowed");let c=Z(r.maxFeeRate,"maxFeeRate",32);if(Z(r.action.maxFeeRate,"signed maxFeeRate",32)!==c)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(c))throw new Error("hl: builder fee rate must be a percent");let p=C(c.slice(0,-1),12,"hl: builder fee percent"),m=C(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(m<0n||p*100n>m)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let f=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==f||r.action.hyperliquidChain!==r.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(r.signatureChainId!=="0x66eee"||r.action.signatureChainId!==r.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let l=n==="hype-undelegate";if(typeof r.action.isUndelegate!="boolean"||r.action.isUndelegate!==l)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(r.action.wei??r.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(a??r.action.wei??0),notional:String(a??0),fee:"0",kind:n,actionType:r.action.type,amount:String(r.action.wei??a??0),coin:r.coin||null,submitTo:i})}var Un,Hn,jn,zn,Z,Yt=L(()=>{Le();Ze();Un=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),Hn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),jn=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"}),zn=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"}),Z=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function Zn(e){let t=e.owner||e.user||e.from||e.recipient;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("hl: owner/user address required for local-signer envelope");return String(t).toLowerCase()}function Zt(e,t={},r={}){let n=String(e?.kind||""),o=Yn[n];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(r.nowMs??Date.now()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a=String(e.submitTo||"").replace(/\/$/,""),l={version:1,surface:"hl",action:o,owner:Zn(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${n}:${e.nonce}`),expiresAtMs:i+s,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:n,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:a,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return Xt(l,{coins:t.coins||["*"],hip4:!0,maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,maxLeverage:t.maxLeverage??50,hlBuilders:t.hlBuilders||(e.builderFee?.address?[e.builderFee.address]:[]),maxBuilderFeeBps:t.maxBuilderFeeBps??e.builderFee?.bps}),l}var Yn,Qt=L(()=>{Yt();Yn=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 Qn,JsonRpcProvider as eo}from"ethers";function so(e){return io.test(String(e||""))}async function tt(e,{contract:t=to,rpc:r=no,chainId:n=ro,balanceOf:o}={}){if(!so(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new eo(r,n,{staticNetwork:!0}),s=new Qn(t,oo,i);return BigInt(await s.balanceOf(e))}var to,ro,no,oo,io,rt=L(()=>{to="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",ro=999,no="https://rpc.hyperliquid.xyz/evm",oo=["function balanceOf(address owner) view returns (uint256)"],io=/^0x[a-fA-F0-9]{40}$/});import{existsSync as ao,readFileSync as co,lstatSync as lo}from"node:fs";import{homedir as er}from"node:os";import{join as nt}from"node:path";function uo(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[tr])return String(e[tr]);let t=e.ORACLE_CONFIG_DIR||nt(er(),".config","oracle");return nt(t,"fee-recipient")}return nt(er(),".config","oracle","fee-recipient")}function rr(e=process.env){try{let t=uo(e);if(!ao(t)||lo(t).isSymbolicLink())return"";let r=co(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var Fi,tr,nr=L(()=>{rt();Fi=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),tr="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var ur={};jr(ur,{HL_BUILDER_ADDRESS_ENV:()=>$e,HL_BUILDER_DEFAULT_FEE_BPS:()=>po,HL_BUILDER_FEE_ENV:()=>it,HL_BUILDER_FEE_TIERS:()=>be,HL_BUILDER_MAX_FEE_BPS:()=>ot,HL_PERP_MAX_SIG_FIGS:()=>or,HL_PERP_PRICE_DECIMALS:()=>ir,HL_SIGNATURE_CHAIN_ID:()=>Ce,MARGIN_MODE:()=>xe,ORDER_TYPES:()=>_,TIF:()=>Ee,formatPerpPrice:()=>V,formatPerpSize:()=>lr,hlBuilderFeeBpsForKind:()=>cr,hlPerpAssetInfo:()=>ue,hlPrepareApproveAgent:()=>xo,hlPrepareBracketOrder:()=>Io,hlPrepareBuilderApproval:()=>bo,hlPrepareCancelOrder:()=>Eo,hlPreparePerpOrder:()=>lt,hlPrepareUpdateIsolatedMargin:()=>So,hlPrepareUpdateLeverage:()=>ko,resolveBuilderFee:()=>at});function sr(e,t){if(typeof e=="number"){if(Number.isSafeInteger(e)&&e>=0)return e}else if(typeof e=="string"&&/^(?:0|[1-9]\d*)$/.test(e)){let r=Number(e);if(Number.isSafeInteger(r))return r}throw new Error(`hl-perps: ${t} must be a non-negative safe integer`)}function fo(e,t){let r=sr(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function mo(e={}){let t={...e};if(t.side==null)return t;if(t.side===0||t.side===1){if(t.outcomeSide!=null&&t.outcomeSide!==t.side)throw new Error("hl-perps: side conflict with outcomeSide");return t.outcomeSide=t.side,delete t.side,t}throw new Error("hl-assets: side must be 0 or 1")}function ar(e,{defaultBuy:t=!1}={}){if(e.side!=null){if(typeof e.side!="string")throw new Error("hl-perps: side must be buy or sell");let r=e.side.toLowerCase();if(r!=="buy"&&r!=="sell")throw new Error("hl-perps: side must be buy or sell");let n=r==="buy";if(e.isBuy!=null&&(typeof e.isBuy!="boolean"||e.isBuy!==n))throw new Error("hl-perps: side and isBuy conflict");return n}if(e.isBuy==null&&t)return!0;if(typeof e.isBuy!="boolean")throw new Error("hl-perps: isBuy must be boolean when side is omitted");return e.isBuy}function cr(e="perp"){if(e==="perp"||e==="main")return be.perp;if(e==="spot")return be.spot;if(e==="hip3")return be.hip3;if(e==="outcome"||e==="hip4")return be.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function at({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[$e]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${$e} must be an EVM address`);let o=rr(e);if(!o||o!==n)return null;let i=e?.[it],s=cr(r),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${it} must be a positive number in 0.1 bps increments`);if(a>ot)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${ot} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${r}`);let l=Math.round(a*10),u=(l/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:n,f:l},disclosure:{address:n,bps:a,percent:`${u}%`}}}async function ho(e,t={},r={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await ne({type:"maxBuilderFee",user:n,builder:e.disclosure.address},r));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function go(e,t={},r={}){if(!e)return{exempt:!1,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{exempt:!1,status:"wallet-required"};try{let o=r.holderBalance||tt;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ct(e,t,{roundDown:r=null}={}){let n=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof n!="string"||!/^-?\d+(\.\d+)?$/.test(n))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=n.startsWith("-"),[i,s=""]=n.replace(/^-/,"").split(".");if(s.length<=t){let d=s.replace(/0+$/,"");return(o?"-":"")+(d?`${i}.${d}`:i)}let a=s.slice(0,t),l=Number(s[t]),u=BigInt(i+a),c=s.slice(t).replace(/0+$/,"")!=="";r===!0||(r===!1?c&&(u+=1n):l>=5&&(u+=1n));let p=u.toString().padStart(t+1,"0"),f=(t===0?p:`${p.slice(0,-t)}.${p.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+f}function wo(e,t,r={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let n=typeof e=="number"?String(e):e;if(!n.includes("."))return n;let o=Number(n);if(!Number.isFinite(o)||o===0)return n;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return ct(n,s,r)}function V(e,t,r={}){let n=ir-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return ct(wo(e,or,r),n,r)}function lr(e,t){let r=ct(e,Number(t??0));if(BigInt(r.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(r)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return r}function yo(e,t){let r=(c,p)=>{let m=String(c).trim();if(!/^\d+(?:\.\d+)?$/.test(m))throw new Error(`hl-perps: ${p} must be a positive decimal`);let[f,d=""]=m.split(".");return{raw:BigInt(f+d),decimals:d.length}},n=r(e,"size"),o=r(t,"price"),i=n.raw*o.raw,s=n.decimals+o.decimals,a=i.toString().padStart(s+1,"0");if(s===0)return a;let l=a.slice(0,-s),u=a.slice(-s).replace(/0+$/,"");return u?`${l}.${u}`:l}async function ue(e={},t={}){let r=await Ye(e,t);return{coin:r.coin,assetId:r.assetId,szDecimals:r.szDecimals,maxLeverage:r.maxLeverage,markPx:r.markPx,kind:r.kind,dex:r.dex??null,dexName:r.dexName??null,outcome:r.outcome??null,side:r.side??null}}function st(e,{tif:t=Ee.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case _.LIMIT:return{limit:{tif:t}};case _.MARKET:return{limit:{tif:Ee.IOC}};case _.STOP_MARKET:case _.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:V(r,o),tpsl:e===_.STOP_MARKET?"sl":"tp"}};case _.STOP_LIMIT:case _.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:V(r,o),tpsl:e===_.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function ie(e,t,r={}){let n=r.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Ce,submitTo:n?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange",note:"Sign locally via Oracle local-signer or a wallet. Hosted Oracle does not submit."}}function de(e,t={},r={}){let n={...e};try{n.localSignerEnvelope=Zt(n,t,r),n.prepared=!0,n.signing="awaiting-hl-signer"}catch(o){n.prepared=!1,n.localSignerEnvelope=null,n.localSignerBlockedReason=String(o?.message||o).slice(0,200),n.signing="blocked"}return n.oraclePrepared=!!n.localSignerEnvelope,D(n,{provider:e.provider||"hl-perps",kind:e.kind})}function bo(e={},t={}){let r=at({env:t.env});if(!r)throw new Error(`hl-perps: ${$e} is required`);let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Ce,maxFeeRate:r.disclosure.percent,builder:r.disclosure.address,nonce:n};return de({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:r.disclosure,...ie(o,n,t)},e,t)}function xo(e={},t={}){let r=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error("hl-perps: agentAddress required");let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Ce,agentAddress:r.toLowerCase(),agentName:o,nonce:n};return D({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:r.toLowerCase(),agentName:o,...ie(i,n,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function lt(e={},t={}){let r=await ue(e,t);if(e.type!=null&&(typeof e.type!="string"||!e.type))throw new Error("hl-perps: order type must be a string");let n=e.type??_.LIMIT;if(typeof n!="string"||!n)throw new Error("hl-perps: order type must be a string");let o=ar(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=lr(e.size??e.sz,r.szDecimals),a;if(n===_.MARKET){let b=Number(r.markPx);if(!Number.isFinite(b)){let W=await We(t);b=Number(W?.[r.coin]??W?.[String(r.assetId)]??NaN)}if(!Number.isFinite(b))throw new Error("hl-perps: no mark price available for a market order");let x=Number(e.maxSlippageBps??50);if(!Number.isInteger(x)||x<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(x>100)throw new Error(`hl-perps: maxSlippageBps ${x} exceeds the hard 100 bps cap`);let A=o?b*(1+x/1e4):b*(1-x/1e4);a=V(A,r.szDecimals,{roundDown:o});let R=Math.abs(Number(a)/b-1)*1e4;if(R>x+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${R.toFixed(2)} bps from mark, above the ${x} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=V(e.price??e.limitPx,r.szDecimals)}let l=st(n,{tif:e.tif??(n===_.MARKET?Ee.IOC:Ee.GTC),triggerPx:e.triggerPx,szDecimals:r.szDecimals}),u={a:r.assetId,b:o,p:a,s,r:i,t:l};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");u.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let c={type:"order",orders:[u],grouping:e.grouping??"na"},p=at({env:t.env,kind:r.kind}),m=await go(p,e,t),f=m.exempt?null:p,d=await ho(f,e,t),h=d.approved?f:null;h&&(c.builder=h.wire);let g=Number(e.nonce??Date.now()),y=yo(s,a);return de({provider:"hl-perps",venue:"hyperliquid",kind:r.kind==="outcome"?"hip4-order":r.kind==="hip3"?"hip3-order":"perp-order",coin:r.coin,assetId:r.assetId,assetKind:r.kind,outcome:r.outcome??null,outcomeSide:r.side??null,dex:r.dex??null,dexName:r.dexName??null,side:o?"buy":"sell",orderType:n,price:a,size:s,reduceOnly:i,notionalUsd:y,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:h?.disclosure??null,holderExempt:m.exempt,holderVerificationStatus:m.status,builderApprovalRequired:f&&!h?{...p.disclosure,...d}:null,...ie(c,g,t)},e,t)}async function Eo(e={},t={}){let r=await ue(mo(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=sr(n,"orderId"),i={type:"cancel",cancels:[{a:r.assetId,o}]};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:r.coin,assetId:r.assetId,orderId:o,...ie(i,Number(e.nonce??Date.now()),t)},e,t)}async function ko(e={},t={}){let r=await ue(e,t),n=fo(e.leverage,"leverage");if(r.maxLeverage!=null&&n>r.maxLeverage)throw new Error(`hl-perps: ${r.coin} allows at most ${r.maxLeverage}x, requested ${n}x`);if(e.marginMode!=null&&typeof e.marginMode!="string")throw new Error("hl-perps: marginMode must be a string");let o=(e.marginMode||xe.CROSS).toLowerCase();if(o!==xe.CROSS&&o!==xe.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===xe.CROSS,leverage:n};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:r.coin,assetId:r.assetId,leverage:n,marginMode:o,maxLeverage:r.maxLeverage,liquidationWarning:n>=20?`${n}x liquidates on roughly a ${(100/n).toFixed(2)}% adverse move before fees`:null,...ie(i,Number(e.nonce??Date.now()),t)},e,t)}async function So(e={},t={}){let r=await ue(e,t),n=e.usd??e.amountUsd;if(n==null)throw new Error("hl-perps: usd amount required");if(typeof n!="number"&&typeof n!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof n=="number"?String(n):n;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=C(o,6,"hl-perps: usd"),s=ar(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:r.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:r.coin,assetId:r.assetId,isBuy:s,usd:o,...ie(a,Number(e.nonce??Date.now()),t)},e,t)}async function Io(e={},t={}){let r=await lt(e,t),n=await ue(e,t),o=r.side==="buy",i=[r.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:n.assetId,b:!o,p:V(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:st(_.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:V(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:st(_.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:n.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...r.action.builder?{builder:r.action.builder}:{}};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:n.coin,assetId:n.assetId,side:r.side,price:r.price,size:r.size,reduceOnly:r.reduceOnly,orderType:r.orderType,notionalUsd:r.notionalUsd,legs:i.length,entry:{side:r.side,price:r.price,size:r.size},takeProfitPx:e.takeProfitPx==null?null:V(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:V(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ie(s,Number(e.nonce??Date.now()),t)},e,t)}var or,ir,Ce,po,ot,$e,it,be,_,Ee,xe,ut=L(()=>{we();Ze();Le();ce();Qt();rt();nr();or=5,ir=6,Ce="0x66eee",po=2,ot=10,$e="ORACLE_HL_BUILDER_ADDRESS",it="ORACLE_HL_BUILDER_FEE_BPS",be=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),_=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Ee=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),xe=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});B();var Sn="https://yields.llama.fi";async function Mt(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Sn).replace(/\/$/,""),n=await $(`${r}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(n?.data)?n.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...n,data:o.slice(0,i)}}ce();we();var ki=24*365;ut();B();B();B();B();import{Interface as pt,getAddress as gs,isAddress as ws}from"ethers";B();var dt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var rs=new Map(Object.values(dt).map(e=>[e.chainId,e]));import{Interface as Ao,getAddress as us}from"ethers";var ds=new Ao(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ce();var dr=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Es=Object.freeze({42161:{name:"arbitrum",api:dr[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:dr[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var ks=`0x${"0".repeat(64)}`,Ss=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Is=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),As=new pt(["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"]),vs=new pt(["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)"]),Ps=new pt(["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)"]),Os=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});B();B();ce();Le();var vo=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ke=14,pr=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`lighter: bounded ${t} required`);return e};function pe(e,t,r){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${r} must be exact numeric ${t}`)}function ft(e){let t=String(e||"").replace(/\/$/,"");if(!vo.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function fr(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("lighter: structured artifact required");let n=pr(r.kind,"kind",48);if(n!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=ft(r.submitTo),i=r.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(oe(r.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let a=Number(oe(r.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: clientOrderIndex required");pe(r.orderType,0,"orderType"),pe(r.timeInForce,1,"timeInForce"),pe(r.reduceOnly,0,"reduceOnly"),pe(r.triggerPrice,0,"triggerPrice"),pe(r.orderExpiry,-1,"orderExpiry");let l=pr(r.symbol||r.coin,"symbol",32),u=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(u.length&&!u.includes(l)&&!u.includes(String(i))&&!u.includes("*"))throw new Error("lighter: market not allowed");if(r.side!=="buy"&&r.side!=="sell")throw new Error("lighter: side must be buy or sell");let c=Qe(r.baseAmount,"lighter: baseAmount"),p=Qe(r.price,"lighter: price");if(c>BigInt(Number.MAX_SAFE_INTEGER)||p>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let m=Number(c),f=Number(p),d=Number(r.sizeDecimals??0),h=Number(r.priceDecimals??0);if(!Number.isInteger(d)||d<0||d>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=d+h,y=c*p,b=C(r.notionalUsd,g,"lighter: notionalUsd");if(b<=0n)throw new Error("lighter: notionalUsd required");if(y!==b)throw new Error("lighter: notionalUsd must match size and price");let x=C(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(y>x)throw new Error("lighter: notional exceeds cap");let A=T(r.notionalUsd,"lighter: notionalUsd");return pe(r.txType,ke,"txType"),Object.freeze({unit:"usd",value:String(A),notional:String(A),fee:"0",kind:n,symbol:l,marketIndex:i,side:r.side,baseAmount:m,price:f,submitTo:o,actionType:"create-order",amount:String(A)})}function Po(e){let t=e.owner||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("lighter: owner address required for local-signer envelope");return String(t).toLowerCase()}function mr(e,t={},r={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let n=Number(r.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=ft(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:Po(t),destination:"lighter",tradeId:String(t.tradeId||`lighter:${e.symbol}:${e.marketIndex}:${e.clientOrderIndex}`),expiresAtMs:n+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"lighter-delta-neutral",artifact:{kind:"lighter-order",symbol:e.symbol,marketIndex:e.marketIndex,side:e.side,baseAmount:e.baseAmount,price:e.price,notionalUsd:e.notionalUsd,sizeDecimals:e.sizeDecimals??0,priceDecimals:e.priceDecimals??0,clientOrderIndex:e.clientOrderIndex,txType:e.txType??ke,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return fr(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}function hr(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function De(e={},t,r){let n=String(t||""),o=hr(e);if(o){let s=Se(o[n]);if(s==null)throw new Error(`${r}: held spot required for ${n}`);return s}let i=Se(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${r}: prepare requires spotSize of held spot`);return i}function Fe(e={},t=[],r){let n=hr(e);if(t.length>1){if(!n)throw new Error(`${r}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Se(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(n){let o=t[0];if(o&&Se(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(Se(e.spotSize??e.spotHeldSize)==null)throw new Error(`${r}: live loop requires spotSize of held spot`)}var mt=Number.MAX_SAFE_INTEGER,Me=String(mt);function Se(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=mt?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,r=""]=e.split(".");if(t.length>Me.length||t.length===Me.length&&t>Me||t===Me&&/[1-9]/.test(r))return null;let n=Number(e);return Number.isFinite(n)&&n>0&&n<=mt?n:null}var wr="https://mainnet.zklighter.elliot.ai",yr="https://testnet.zklighter.elliot.ai";function Oo(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?yr:wr}function Q(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function To(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function br(e){let t=Q(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function No(e,t,r=4){let n=Q(e),o=Q(t),i=Number.isInteger(Number(r))?Number(r):4;if(!(n>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let s=10**i;return Math.floor(n/o*s+1e-12)}function gr(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function xr(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 s of n){let a=gr(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of r){if(String(s.exchange||"")!=="lighter")continue;let a=gr(s.market_id);if(a==null)continue;let l=o.get(a),u=Q(l?.mark_price??l?.index_price),c=Q(s.rate),p=String(s.symbol||l?.symbol||"").trim();!p||c==null||!(u>0)||i.push({coin:p,symbol:p,marketIndex:a,funding:c,markPx:u,openInterest:Q(l?.open_interest)??0,sizeDecimals:Number(l?.supported_size_decimals??l?.size_decimals??4),priceDecimals:Number(l?.supported_price_decimals??l?.price_decimals??2),fundingAprPct:br(c)})}return i}function Er(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let r=Q(e.funding);if(r==null)throw new Error("lighter: funding required");let n=br(r),o=r>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Q(t),markPx:e.markPx,fundingHourly:r,fundingAprPct:n,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?No(t,e.markPx,e.sizeDecimals):0,price:Math.round(Number(e.markPx)*10**Number(e.priceDecimals||0)),sizeDecimals:e.sizeDecimals,priceDecimals:e.priceDecimals,verdict:o?n>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry on Lighter. Armed via official sendTx. Not automated."};if(!(i.notionalUsd>0))throw new Error("lighter: notionalUsd must be > 0");return i}async function kr(e={}){let t=Oo(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,i]=await Promise.all([$(`${t}/api/v1/funding-rates`,n),$(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:i}}catch(o){throw r.abort(o),o}}async function ht(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:n,books:o}=await kr(t),i=xr(n,o).filter(s=>s.funding>0).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,r);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(n?.funding_rates)?n.funding_rates.filter(s=>s.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function gt(e={},t={}){let r=String(e.coin||e.symbol||"").trim();if(!r)throw new Error("lighter: coin required");let n=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await kr(t),s=xr(o,i).find(a=>a.symbol===r);if(!s)throw new Error(`lighter: ${r} not in Lighter funding`);return Er(s,n)}async function _o(e={},t={}){Ir(e,t,"lighter");let r=Ar(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let n=e.accountIndex,o=await gt(e,t);if(o.verdict==="skip")return D({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=De(e,o.coin,"lighter");if(!Sr.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),l=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),u=To(BigInt(o.baseAmount)*BigInt(o.price),l);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let c={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:u,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:n,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:ke,submitTo:`${a?yr:wr}/api/v1/sendTx`,signed:!1,broadcast:!1},p=null,m=null;try{p=mr(c,{...e,maxNotionalUsd:r},t)}catch(d){m=String(d?.message||d).slice(0,200)}return D({...c,prepared:!!p,signing:p?"awaiting-lighter-signer":"blocked",localSignerEnvelope:p,localSignerBlockedReason:m,oraclePrepared:!!p},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Sr=/^0x[0-9a-fA-F]{40}$/;function Ir(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function Ro(e,t,r){Ir(e,t,r)}function Lo(e={}){if(e.halted===!0)throw new Error("lighter: loop is halted");let t=e.mode==="live"?"live":"shadow",r=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],n=e.maxCoins??1;if(typeof n!="number"&&!(typeof n=="string"&&/^(?:0|[1-9]\d*)$/.test(n)))throw new Error("lighter: maxCoins must be an integer");let o=Number(n);if(!Number.isSafeInteger(o))throw new Error("lighter: maxCoins must be an integer");if(o<1||o>8)throw new Error("lighter: maxCoins must be between 1 and 8");let i=Ar(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&r.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&Fe(e,r,"lighter"),t==="live"&&!Sr.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:r,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function Ar(e,t){let r=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!r)throw new Error(`${t}: maxNotionalUsd out of bounds`);let n=Number(e);if(!(n>0)||n>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return n}async function vr(e={},t={}){Ro(e,t,"lighter");let r=Lo(e),n=await ht({limit:e.limit??16},t),o=new Set(r.allowlist),i=[],s=Math.floor(r.maxNotionalUsd/r.maxCoins);for(let a of n.candidates){if(o.size&&!o.has(a.symbol)&&!o.has(a.coin))continue;let l=Er(a,s);if(l.verdict!=="carry")continue;if(i.length>=r.maxCoins)break;if(r.mode==="shadow"){i.push({...l,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let u=await _o({coin:l.symbol,notionalUsd:l.notionalUsd,maxNotionalUsd:s,owner:e.owner,accountIndex:r.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...u,mode:"live",surface:"lighter"})}return{loop:!0,mode:r.mode,surface:"lighter",signer:"lighter",considered:n.considered,actions:i,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var $o=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);var Ie=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."}]),Co={"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."},Mo={"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."},Do={"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 se(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function G(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function Fo(e){let t=G(e.symbol,"").toUpperCase(),r=G(e.exposure,"").toLowerCase(),n=se(e.apy)??0,o=se(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 Bo(e,t){let r=se(e.tvlUsd)??0,n=G(e.ilRisk,"").toLowerCase(),o=G(e.predictions?.predictedClass,"").toLowerCase(),i=t==="stable-loop"?3:t==="collateral-hedge"?6:9;return r<1e6?i+=6:r<1e7&&(i+=3),(n.includes("yes")||n.includes("high"))&&(i+=3),o.includes("down")&&(i+=2),Math.min(35,Math.max(0,i))}function Uo(e){let t=Fo(e);if(!t)return null;let r=se(e.apy)??0,n=se(e.apyBase)??0,o=Math.max(0,se(e.apyReward)??Math.max(0,r-n)),i=Math.max(0,se(e.tvlUsd)??0),s=Bo(e,t),a=t==="stable-loop"?4:t==="collateral-hedge"?6:0,l=t==="stable-loop"?0:t==="collateral-hedge"?4:5,u=i<5e6?1.2:.5,c=r-a-l-u-s,p=c<1?"Avoid":r>80||i<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",m=G(e.project),f=G(e.symbol),d=G(e.chain);return{id:G(e.pool,`${d}:${m}:${f}`),recipe:t,label:`${m} ${f}`,chain:d,project:m,symbol:f,tvlUsd:i,rewardApr:o,nativeApr:n,estimatedBorrowApr:a,estimatedFundingApr:l,gasApr:u,riskHaircut:s,netApr:c,verdict:p,exposure:G(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:Co[t],monitor:Mo[t],prepareSteps:[`Verify ${m} contracts and reward terms on ${d}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Do[t]],source:"DeFiLlama yields"}}async function Pr(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),n=Number(e.minTvl??2e6),o=new Date().toISOString(),i="read-only discovery and prepare-plan design; no signing or broadcast";try{let s=await Mt({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),a=Array.isArray(s?.data)?s.data:[],l=a.map(Uo).filter(u=>u!==null).filter(u=>u.tvlUsd>=n).filter(u=>u.rewardApr+u.nativeApr<=300).sort((u,c)=>c.netApr-u.netApr||c.tvlUsd-u.tvlUsd).slice(0,r);return{configured:!0,live:!0,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:a.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:l,posture:i}}catch(s){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(s?.message||s),candidates:[],posture:i}}}function H(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 Or(e={}){let t=H(e.wallets,5,1,500),r=H(e.tasksWeekly,6,0,500),n=H(e.hoursWeekly,4,0,168),o=H(e.hourlyCost,25,0,1e4),i=H(e.gasPerTask,.4,0,1e4),s=H(e.bridgeMonthly,12,0,1e5),a=H(e.expectedReward,900,0,1e7),l=H(e.probability,22,0,100)/100,u=H(e.sybilHaircut,25,0,100)/100,c=H(e.lockupMonths,6,0,120),p=r*t*4.33,m=p*i,f=n*4.33*o,d=m+f+s,h=Math.max(0,1-c*.015),g=t*a*l,y=g*(1-u)*h,b=y-d,x=d>0?b/d*100:null,A=t*a>0?d/(t*a*(1-u)*(h||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:i,bridgeMonthly:s,expectedReward:a,probabilityPct:l*100,sybilHaircutPct:u*100,lockupMonths:c},monthlyTasks:p,monthlyGas:m,laborMonthly:f,monthlyCost:d,lockupDiscount:h,grossExpectedValue:g,adjustedExpectedValue:y,netExpectedValue:b,roiPct:x,breakevenProbabilityPct:A,verdict:b>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}we();ce();function J(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Tr(e){let t=J(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function Ho(e,t,r=4){let n=J(e),o=J(t),i=Number.isInteger(Number(r))?Number(r):4;if(!(n>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let s=10**i;return String(Math.floor(n/o*s+1e-12)/s)}function Nr(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],r=Array.isArray(e?.[1])?e[1]:[],n=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},s=r[o]||{},a=String(i.name||"").trim(),l=J(s.funding),u=J(s.markPx??s.oraclePx),c=J(s.openInterest)??0;!a||l==null||!(u>0)||n.push({coin:a,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:l,markPx:u,oraclePx:J(s.oraclePx),openInterest:c,fundingAprPct:Tr(l)})}return n}function _r(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let r=J(e.funding);if(r==null)throw new Error("hl-delta-neutral: funding required");let n=Tr(r),o=r>0,i={coin:e.coin,notionalUsd:J(t),markPx:e.markPx,fundingHourly:r,fundingAprPct:n,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?Ho(t,e.markPx,e.szDecimals):"0",verdict:o?n>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function wt(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),n=Number(e.minOpenInterest??0),o=await le(t),i=Nr(o).filter(s=>s.funding>0&&s.openInterest>=n).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,r);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function yt(e={},t={}){let r=String(e.coin||"").trim();if(!r)throw new Error("hl-delta-neutral: coin required");let n=Number(e.notionalUsd??e.notional??1e3),o=await le(t),i=Nr(o).find(s=>s.coin===r);if(!i)throw new Error(`hl-delta-neutral: ${r} not in Hyperliquid meta`);return _r(i,n)}async function jo(e={},t={}){Lr(e,t,"hl-delta-neutral");let r=$r(e.maxNotionalUsd??25e3,"hl-delta-neutral"),n=await yt(e,t);if(n.verdict==="skip")return D({...n,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=De(e,n.coin,"hl-delta-neutral");if(!Rr.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(n.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(ut(),ur)),s=await i({coin:n.coin,side:n.perpSide,size:n.perpSize,type:e.orderType||"limit",price:e.price??n.markPx,owner:e.owner,maxNotionalUsd:r},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(s?.signed===!0||s?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let a=s?.localSignerEnvelope||null,l=s?.localSignerBlockedReason||null;return D({...n,prepared:!!a,surface:"hl",hedge:s,localSignerEnvelope:a,localSignerBlockedReason:l,signed:!1,broadcast:!1,signing:a?"awaiting-hl-signer":"blocked",oraclePrepared:!!a},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var Rr=/^0x[0-9a-fA-F]{40}$/;function Lr(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function zo(e,t,r){Lr(e,t,r)}function qo(e={}){if(e.halted===!0)throw new Error("hl-delta-neutral: loop is halted");let t=e.mode==="live"?"live":"shadow",r=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],n=e.maxCoins??1;if(typeof n!="number"&&!(typeof n=="string"&&/^(?:0|[1-9]\d*)$/.test(n)))throw new Error("hl-delta-neutral: maxCoins must be an integer");let o=Number(n);if(!Number.isSafeInteger(o))throw new Error("hl-delta-neutral: maxCoins must be an integer");if(o<1||o>8)throw new Error("hl-delta-neutral: maxCoins must be between 1 and 8");let i=$r(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&r.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&Fe(e,r,"hl-delta-neutral"),t==="live"&&!Rr.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:r,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function $r(e,t){let r=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!r)throw new Error(`${t}: maxNotionalUsd out of bounds`);let n=Number(e);if(!(n>0)||n>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return n}async function Cr(e={},t={}){zo(e,t,"hl-delta-neutral");let r=qo(e),n=await wt({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(r.allowlist),i=[],s=Math.floor(r.maxNotionalUsd/r.maxCoins);for(let a of n.candidates){if(o.size&&!o.has(a.coin))continue;let l=_r(a,s);if(l.verdict!=="carry")continue;if(i.length>=r.maxCoins)break;if(r.mode==="shadow"){i.push({...l,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let u=await jo({coin:l.coin,notionalUsd:l.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:s,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...u,mode:"live",surface:"hl"})}return{loop:!0,mode:r.mode,surface:"hl",signer:"hl",considered:n.considered,actions:i,nextWaitMs:r.intervalMs,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var bt=`oracle farm <methods|discover|airdrop|carry|loop|lighter> [options]
1
+ var Hr=Object.defineProperty;var R=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var jr=(e,t)=>{for(var r in t)Hr(e,r,{get:t[r],enumerable:!0})};import{AsyncLocalStorage as zr}from"node:async_hooks";function Pe(e){let t=qr.getStore();if(!t||t.closed||!Vr.includes(e))return null;if(t.spans.length>=Gr)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var qr,Vr,Gr,vt=R(()=>{qr=new zr,Vr=["http","retry","shared"],Gr=512});import te from"node:net";import Kr from"node:dns";function Oe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let p=c.split(":"),m=p.at(-1);if(m?.includes(".")){let f=m.split(".").map(Number);if(f.length!==4||f.some(d=>!Number.isInteger(d)||d<0||d>255))return null;p.splice(p.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return p.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:p.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let a=t.includes("::"),l=8-i.length-s.length;if(!a&&l!==0||a&&l<1)return null;let u=[...i,...Array(Math.max(0,l)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(c=>[c>>8,c&255]))}function Ue(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function He(e){if(te.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(te.isIPv6(e)){let t=Oe(e);if(!t)return!1;let r=Oe("::ffff:0:0");return Ue(t,r,96)?He([...t.slice(12)].join(".")):Ue(t,Oe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ue(t,Oe(o),i)):!1}return!1}function Wr(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(Jr.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=te.isIP(r);return n!==0&&!He(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function je(e,{lookupFn:t=Kr.promises.lookup}={}){let r=Wr(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:te.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!He(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function Xr(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function ze({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(f){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${f?.message||f}`);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 i=f=>String(f).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,a=f=>(Array.isArray(f)?f:[f]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(te.isIPv6(d.address)?6:4)})),l=(f,d,h)=>{s.set(i(f),a(typeof d=="string"?[{address:d,family:h}]:d))},u=f=>{let d=i(f);if(te.isIP(d))return[{address:d,family:te.isIPv6(d)?6:4}];let h=s.get(d);if(!h||!h.length)throw new Error(`refused: unpinned host ${f} during pinned fetch`);return h},c=Xr(),p=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new r({connect:{lookup(f,d,h){let g;try{g=u(f)}catch(y){return h(y)}return d?.all?h(null,g):h(null,g[0].address,g[0].family)}}}),m=Yr((f,d={})=>n(f,{...d,dispatcher:p}),l);return{dispatcher:p,fetch:m,pin:l,resolve:u,async close(){try{await p.destroy()}catch{}}}}function Yr(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[qe]=Object.freeze({pin:t}),e}function Ve(e){return typeof e=="function"&&typeof e[qe]?.pin=="function"}function At(e,t,r){if(!Ve(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[qe].pin(t,r)}var Jr,qe,Pt=R(()=>{Jr=new Set(["localhost","metadata.google.internal","metadata.goog"]);qe=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Zr}from"node:crypto";import{types as q}from"node:util";function I(e){return Y(`HTTP JSON body refused: ${e}`)}function cn(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 q[t]=="function"&&q[t](e))}function ln(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,a=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>z.bytes)throw I("serialized byte limit exceeded");t.push(c)},l=c=>{if(Buffer.byteLength(c,"utf8")>z.bytes)throw I("serialized byte limit exceeded");return JSON.stringify(c)},u=(c,p)=>{if(n+=1,n>z.nodes)throw I("node limit exceeded");if(p>z.depth)throw I("depth limit exceeded");if(c===null){a("null");return}if(typeof c=="string"){a(l(c));return}if(typeof c=="boolean"){a(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw I("non-finite number");a(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw I("unsupported non-JSON value");if(q.isProxy(c))throw I("proxy value");if(cn(c))throw I("unsupported exotic object");if(s.has(c))throw I("cyclic value");s.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw I("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),h=0;for(;d!==null;){if(q.isProxy(d))throw I("proxy array prototype");if(h+=1,h>z.depth)throw I("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>z.arrayLength)throw I("array length limit exceeded");for(let y=0;y<c.length;y+=1){let b=Object.getOwnPropertyDescriptor(c,String(y));if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw I("array entries must be dense enumerable own data")}let g=0;for(let y in c){if(i+=1,i>z.fields)throw I("enumeration limit exceeded");if(Object.hasOwn(c,y)&&(g+=1,g>c.length))throw I("named array fields are unsupported")}if(g!==c.length)throw I("array entries must be dense enumerable own data");a("[");for(let y=0;y<c.length;y+=1)y&&a(","),u(Object.getOwnPropertyDescriptor(c,String(y)).value,p+1);a("]");return}let m=Object.getPrototypeOf(c);if(m!==Object.prototype&&m!==null)throw I("non-plain object");let f=[];for(let d in c){if(i+=1,i>z.fields)throw I("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>z.fields)throw I("field limit exceeded");let h=Object.getOwnPropertyDescriptor(c,d);if(!h||!Object.hasOwn(h,"value")||h.enumerable!==!0)throw I("object fields must be enumerable own data");f.push([d,h.value])}a("{");for(let d=0;d<f.length;d+=1)d&&a(","),a(l(f[d][0])),a(":"),u(f[d][1],p+1);a("}")}finally{s.delete(c)}};return u(e,0),t.join("")}function un(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(q.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 i=Object.getOwnPropertyDescriptor(e,n);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[n]=String(s)}return t}function dn(){return Object.assign(Object.create(null),{Accept:"application/json"})}function pn(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 fn(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Te(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Lt.get(e);return t||(t=Rt,Rt+=1,Lt.set(e,t)),`reference:${t}`}function Ct(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?mn.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 $t(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(Ct);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Ct(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&hn.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function gn(e,t,r,n={},o=null){let i=Zr("sha256"),s=(l,u)=>{let c=String(u);i.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),i.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
2
+ `)};s("method",e),s("url",t),Object.keys(r||{}).map((l,u)=>({name:l.toLowerCase(),order:u,value:String(r[l])})).sort((l,u)=>l.name.localeCompare(u.name)||l.order-u.order).forEach((l,u)=>{s(`header-name-${u}`,l.name),s(`header-value-${u}`,l.value)}),s("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${l}`,n[l]??"-");return i.digest("hex")}function wn(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Tt):Math.min(250*2**e,Tt)+Math.floor(Math.random()*100)}function Y(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ke(e,t,r){return Y(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function re(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function bn(e){return e?e.byteLength??e.length??0:0}async function xn(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(re(e),!n))throw Ke(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let p=await e.text(),m=Buffer.byteLength(p,"utf8");if(m>t){if(!n)throw Ke(r,`body ${m} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let a=[],l=0,u=!1;try{for(;;){let{value:p,done:m}=await s.read();if(m)break;if(p&&(a.push(Buffer.from(p)),l+=bn(p),l>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw Ke(r,`streamed ${l} bytes`,t);let c=Buffer.concat(a);return(u?c.subarray(0,t):c).toString("utf8")}function En(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function kn(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:l=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:c=!1,importUndici:p,validateResponse:m,signal:f,redirectPolicy:d="follow",maxRedirects:h=Ne}){let g=null,y=t,b=s?{lookupFn:s}:{};if(l&&!a&&!Ve(y))throw Y(`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 x=new AbortController,v=setTimeout(()=>x.abort(),i),L=f?_t?_t([f,x.signal]):f:x.signal,W=async(E,{status:P=null}={})=>{let O=await je(E,b);if(!O.ok)throw Y(P==null?`HTTP refused ${E}: ${O.error}`:`HTTP redirect to ${E} ${O.error}`,P==null?{}:{status:P});let X=new URL(E).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await ze({requireUndici:!0,...p?{importUndici:p}:{}})}catch(w){throw Y(P==null?`HTTP refused ${E}: ${w?.message||w}`:`HTTP redirect to ${E} refused: ${w?.message||w}`,P==null?{}:{status:P})}g.pin(X,O.addresses),y=g.fetch}else At(y,X,O.addresses);return O};try{let E=String(e),P=Object.assign(Object.create(null),n||{});l&&await W(E);for(let O=0;O<=h;O+=1){let X=Object.assign(Object.create(null),{method:r,headers:P,body:o,signal:L,redirect:"manual",dispatcher:void 0}),w=await y(E,X);if((d==="error"||h===0)&&w.status>=300&&w.status<400)throw re(w),Y(`HTTP ${w.status} ${r} redirect refused`,{status:w.status,redirectRefused:!0});if(an.has(w.status)){let M=c===!0&&r==="POST"&&[307,308].includes(w.status)&&$t(r,o);if(r!=="GET"&&r!=="HEAD"&&!M){re(w);let A=new Error(`HTTP ${w.status} ${r} ${E} redirected non-idempotent request`);throw A.status=w.status,A}if(O===h)throw re(w),Y(`HTTP ${w.status} ${r} redirect budget exhausted`,{status:w.status,redirectRefused:!0});let xt=w.headers?.get?.("location"),F;try{F=pn(xt,E)}catch(A){throw re(w),A}let ee=!fn(F,E);if(re(w),ee&&r==="POST"){let A=new Error(`HTTP ${w.status} ${r} cross-origin redirect refused`);throw A.status=w.status,A}if(ee&&c){let A=new Error(`HTTP ${w.status} ${r} cross-origin redirect refused`);throw A.status=w.status,A.retryable=!1,A}if(ee&&(P=dn(P)),l)await W(F,{status:w.status});else if(ee){let A=await je(F,b);if(!A.ok){let S=new Error(`HTTP redirect from ${E} ${A.error}`);throw S.status=w.status,S.retryable=!1,S}a&&A.addresses?.length&&(g||(g=await ze(p?{importUndici:p}:{})),g&&(g.pin(new URL(F).hostname,A.addresses),y=g.fetch))}E=F;continue}if(typeof m=="function")try{await m(w,{url:E})}catch(M){throw re(w),Y(M?.message||String(M))}let N=await xn(w,u,{url:E,onOversize:()=>x.abort()}),fe=En(N);if(!w.ok){let M=new Error(`HTTP ${w.status} ${r} ${E}`);throw M.status=w.status,M.retryAfter=w.headers?.get?.("retry-after")??null,M.body=fe??N.slice(0,300),M}return fe??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(E){if(x.signal.aborted&&!ge(f)){let P=E&&(typeof E=="object"||typeof E=="function")&&!q.isProxy(E)?E:null,O=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(O&&Object.hasOwn(O,"value")&&O.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 w=new Error("HTTP request timed out");throw Object.defineProperties(w,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),w}}throw E}finally{clearTimeout(v),g&&await g.close()}}async function C(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&q.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 S of Object.getOwnPropertyNames(t)){let k=Object.getOwnPropertyDescriptor(t,S);if(!(S==="toJSON"&&k&&Object.hasOwn(k,"value")&&k.value===void 0)){if(!r.has(S))throw new TypeError("HTTP options contain unknown fields");if(!k||!k.enumerable||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=S=>{if(t==null||!Object.hasOwn(t,S))return;let k=Object.getOwnPropertyDescriptor(t,S);if(!k||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain own data properties");return k.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 i=n("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=n("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>Ne))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Ne}`);if(a==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=a??"follow",c=u==="error"?0:l??Ne;for(let S of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let k=n(S);if(k!==void 0&&typeof k!="boolean")throw new TypeError(`HTTP ${S} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let m=n("signal");if(m!==void 0){if(q.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ge(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let S of["importUndici","lookupFn","validateResponse"]){let k=n(S);if(k!==void 0&&typeof k!="function")throw new TypeError(`HTTP ${S} must be a function`)}let f=n("fetchImpl"),d=f||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let h=i??12e3,g=(o||"GET").toUpperCase(),y=n("headers"),b=un(y),x=Object.assign(Object.create(null),b);Object.keys(x).some(S=>S.toLowerCase()==="accept")||(x.Accept="application/json");let v=n("body");v!=null&&typeof v!="string"&&(Object.keys(x).find(k=>k.toLowerCase()==="content-type")||(x["Content-Type"]="application/json"),v=ln(v));let L=s??en,W=n("lookupFn"),E=!f,P=n("untrustedUrl")===!0,O=n("sameOriginRedirectsOnly")===!0,X=n("importUndici"),w=n("validateResponse"),N=m,fe=p??null,M=async()=>{let S;for(let k=0;k<=L;k++){N&&nn.call(N);let Et=Pe("http");try{let j=await kn(e,{fetchImpl:d,method:g,headers:x,body:v,timeoutMs:h,lookupFn:W,realFetch:E,untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,importUndici:X,validateResponse:w,signal:N,redirectPolicy:u,maxRedirects:c});return Et?.("succeeded"),j}catch(j){S=j;let ae=Be=>{if(!j||typeof j!="object"&&typeof j!="function"||q.isProxy(j))return;let me=Object.getOwnPropertyDescriptor(j,Be);return me&&Object.hasOwn(me,"value")?me.value:void 0},Ae=ae("status");Et?.("failed",Ae);let Dr=ae("oracleTimeout")===!0||ae("name")==="AbortError"||ae("name")==="TimeoutError"||ge(N),Fr=new Set([408,425,429]),Br=ae("retryable")===!1?!1:Ae!=null?Fr.has(Ae)||Qr.has(Ae)&&Ot.has(g):!Dr&&Ot.has(g);if(k===L||!Br)throw j;let kt=wn(k,ae("retryAfter")),Ur=Pe("retry"),St=!1;try{N?await new Promise((Be,me)=>{let It,he=()=>{clearTimeout(It),Nt.call(N,"abort",he),me(sn(N)||new DOMException("Aborted","AbortError"))};if(ge(N)){he();return}It=setTimeout(()=>{Nt.call(N,"abort",he),Be()},kt),on.call(N,"abort",he,{once:!0}),ge(N)&&he()}):await yn(kt),St=!0}finally{Ur?.(St?"succeeded":"failed")}}}throw S};if(!(n("dedupe")!==!1&&!N&&$t(g,v)))return M();let F=gn(g,e,x,{untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,redirectPolicy:u,maxRedirects:c,timeoutMs:h,retries:L,fetchImpl:Te(d),realFetch:E,lookupFn:Te(W),importUndici:Te(X),validateResponse:Te(w)},v),ee=Ge.get(F);if(ee){let S=Pe("shared");try{let k=await ee;return S?.("succeeded"),k}catch(k){throw S?.("failed"),k}}let A=M().finally(()=>Ge.delete(F));return Ge.set(F,A),A}var Qr,Ot,en,Tt,tn,rn,nn,on,Nt,_t,ge,sn,an,Ne,si,z,Ge,Lt,Rt,mn,hn,yn,B=R(()=>{vt();Pt();Qr=new Set([408,425,429,500,502,503,504]),Ot=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),en=2,Tt=4e3,tn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,rn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,nn=AbortSignal.prototype.throwIfAborted,on=EventTarget.prototype.addEventListener,Nt=EventTarget.prototype.removeEventListener,_t=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ge=e=>e?tn.call(e):!1,sn=e=>e?rn.call(e):void 0,an=new Set([301,302,303,307,308]),Ne=3,si=64*1024,z=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ge=new Map,Lt=new WeakMap,Rt=1;mn=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),hn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);yn=e=>new Promise(t=>setTimeout(t,e))});import{createHash as In,createHmac as vn,timingSafeEqual as di}from"node:crypto";function Je(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Je).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Je(e[r])}`).join(",")}}`}function Dt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Ft(e=process.env){return Dt(process.env)||Dt(e)}function Tn(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Nn(e){let t=Tn(e);return In("sha256").update(Je(t)).digest("hex")}function _n(e,t=Ft()){return t?vn("sha256",t).update(String(e)).digest("hex"):""}function D(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let l=Number(o),u=i==null?l+Pn:Number(i),c=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||c<=0||c>On)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...a,preparedAt:l,expiresAt:u,prepareVersion:An},f=Nn(m),d=Ft(n),h=d?_n(f,d):void 0,g={...m,prepareHash:f};return h&&(g.prepareMac=h),g}var An,Pn,On,ce=R(()=>{An=2,Pn=300*1e3,On=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{types as Bt}from"node:util";function Ln(e){if(!e||typeof e!="object"||Bt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function _e(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(Bt.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=_e(s.value,t,r+1)}return o}if(!Ln(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);n[o]=_e(i.value,t,r+1)}return n}var Ut=R(()=>{});function $n({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"?Cn:Rn}async function ne(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=$n(t);return _e(await C(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function We(e={}){return ne({type:"allMids"},e)}async function le(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ne(t,e)}var Rn,Cn,we=R(()=>{B();Ut();Rn="https://api.hyperliquid.xyz/info",Cn="https://api.hyperliquid-testnet.xyz/info"});async function jt(e={}){let t=Date.now();if(ye.dexs&&t-ye.at<6e4&&!e.fetchImpl)return ye.dexs;let r=await ne({type:"perpDexs"},e);return ye={at:t,dexs:Array.isArray(r)?r:[]},ye.dexs}async function zt(e="",t={}){let r=e||"",n=Date.now(),o=Ht.get(r);if(o&&n-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ne({type:"metaAndAssetCtxs",dex:e},t):await le(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],l={at:n,universe:s,ctxs:a};return Ht.set(r,l),l}function Fn(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return Dn[r]??t}function Le(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let r=t%10;if(r!==0&&r!==1)return null;let n=Math.floor(t/10),o=Vt+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function qt(e,t){let r=Xe(e),n=Xe(t);if(r==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(n!==0&&n!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*r+n;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=Vt+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:r,side:n,coin:`#${o}`,assetId:i}}function Xe(e){if(typeof e=="number")return Number.isSafeInteger(e)&&e>=0?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}async function Ye(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let u=e.coin==null?null:Le(e.coin);if(e.coin!=null&&!u)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let c=e.outcome==null?null:qt(e.outcome,0).outcome;if(c!=null&&u&&u.outcome!==c)throw new Error("hl-assets: coin does not match outcome");let p=e.outcomeSide==null?null:Bn(e.outcomeSide,"outcomeSide"),m=c??u?.outcome;if(e.outcome!=null&&e.coin==null&&p==null)throw new Error("hl-assets: outcomeSide required");let f=p??u?.side;if(f==null)throw new Error("hl-assets: outcomeSide required");if(m==null)throw new Error("hl-assets: outcome identity required");let d=qt(m,f);if(u&&(u.outcome!==d.outcome||u.side!==d.side))throw new Error("hl-assets: coin does not match outcome side");let h=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:d.coin,assetId:d.assetId,encoding:d.encoding,outcome:d.outcome,side:d.side,szDecimals:h,maxLeverage:1,dex:null,markPx:null}}let r=String(e.coin||e.symbol||e.name||"").trim();if(!r)throw new Error("hl-assets: coin required");if(r.includes(":")){let[u,...c]=r.split(":"),p=c.join(":");if(!u||!p)throw new Error(`hl-assets: bad builder coin ${r}`);let m=Fn(u),f=await jt(t),d=f.findIndex(L=>L&&L.name===m);if(d<1)throw new Error(`hl-assets: unknown builder dex "${u}"`);let{universe:h,ctxs:g}=await zt(m,t),y=h.findIndex(L=>L.name===`${m}:${p}`);if(y<0)throw new Error(`hl-assets: ${r} not in dex ${m} meta`);let b=h[y];if(b.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let x=Mn+d*1e4+y,v=g[y]||{};return{kind:"hip3",coin:b.name||r,assetId:x,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:m,dexName:f[d]?.fullName||m,dexIndex:d,indexInMeta:y,markPx:v.markPx??null}}let{universe:n,ctxs:o}=await zt("",t),i=r.toUpperCase(),s=n.findIndex(u=>u.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let u=await jt(t);for(let c=1;c<u.length;c++){let p=u[c];if(!p?.name)continue;let m=`${p.name}:${i}`;try{return await Ye({coin:m},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=n[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let l=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:l.markPx??null}}function Bn(e,t){let r=Xe(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var Vt,Mn,ye,Ht,Dn,Ze=R(()=>{we();Vt=1e8,Mn=1e5,ye={at:0,dexs:null},Ht=new Map;Dn=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function T(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Gt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function oe(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let r=T(e,t);if(r==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(r)&&!/^0x[0-9a-fA-F]+$/.test(r))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(r)}`);try{return BigInt(r)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(r)}`)}}function Qe(e,t="amount"){let r=oe(e,t);if(r<=0n)throw new Error(`${t} must be positive`);return r}function $(e,t,r="amount"){let n=T(e,r);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${r} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${r} has more than ${t} decimal places, which would lose precision`);let l=BigInt((s||"0")+a.padEnd(t,"0"));return o?-l:l}var Re=R(()=>{});function qn(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function Kt(e,t){let r=T(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(r))throw new Error(`hl: ${t} must be a positive decimal`);let[n,o=""]=r.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function U(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>U(n,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${U(e[n],t)}`).join(",")}}`}function Vn(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,r=e.orderWire;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: declared order wire required");if(t==="limit"){let i=r.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||U(r,"declared order type")!==U({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(U(r,"declared order type")!==U({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!n)throw new Error("hl: unsupported declared order type");let o=r.trigger?.triggerPx;if(o==null||U(r,"declared order type")!==U({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function Gn(e,t,r){let n=Kt(e.s,"signed size"),o=Kt(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,a=$(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let l=$(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>l)throw new Error("hl: notional exceeds cap")}function Kn(e,t){let r=e.action.builder;if(r==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: signed order builder must be structured");let n=Z(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Gt(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=oe(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=$(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function Jt(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(T(e.s,"hl: signed size")!==T(t.size,"hl: size"))throw new Error("hl: signed size must match");if(T(e.p,"hl: signed price")!==T(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(U(e.t,"signed order type")!==U(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function Wt(e,t,r,n,o){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(T(e.s,"hl: bracket protection size")!==T(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(T(e.p,"hl: bracket protection price")!==T(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(T(i.triggerPx,"hl: triggerPx")!==T(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function Jn(e){let t=String(e||"").replace(/\/$/,"");if(!Un.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function et(e){return Le(e)!=null}function Wn(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(et(r)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(r)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(r)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Xn(e,t,r){let n=Array.isArray(r.hlMarkets)?r.hlMarkets:[];if(n.length){if(!n.some(s=>{if(typeof s=="string"){let[a,l]=String(s).split(":");return a===e&&Number(l)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(et(e)){let i=Array.isArray(r.coins)?r.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(r.coins)?r.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function Xt(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: structured artifact required");let n=Z(r.kind,"kind",48),o=jn[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=Jn(r.submitTo);if(Object.prototype.hasOwnProperty.call(r,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(r.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!r.action||typeof r.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(r.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(r.action.type!==zn[n])throw new Error("hl: action type must match kind");let a=r.notionalUsd??0;if(Hn.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let l=Z(r.coin,"coin",64),u=r.assetId??r.assetIndex;if(!Number.isSafeInteger(u)||u<0)throw new Error("hl: assetId required");if(n==="perp-bracket"&&u>=1e8)throw new Error("hl: brackets are not supported on outcome markets");if(n==="hip4-order"||u>=1e8){let c=Le(l);if(!c||c.coin!==l)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(c.assetId!==u)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(Wn(l,t),Xn(l,u,t),n==="hip4-order"&&!et(l))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(r.side!=="buy"&&r.side!=="sell")throw new Error("hl: side must be buy or sell");if(r.action.type!=="order"||!Array.isArray(r.action.orders))throw new Error("hl: signed orders are required");Vn(r);let c=r.action.orders;if(n==="perp-bracket"){let p=r.takeProfitPx,m=r.stopLossPx,f=1+(p==null?0:1)+(m==null?0:1);if(f<2||c.length!==f||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");Jt(c[0],r,u);let d=1;p!=null&&Wt(c[d++],r,u,p,"tp"),m!=null&&Wt(c[d],r,u,m,"sl")}else{if(c.length!==1)throw new Error("hl: exactly one signed order is required");if(r.grouping!=="na"||r.action.grouping!==r.grouping)throw new Error("hl: signed grouping must match declared grouping");Jt(c[0],r,u)}Gn(c[0],r,t),Kn(r,t),a=T(r.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let c=r.leverage;if(!Number.isSafeInteger(c)||c<1)throw new Error("hl: leverage must be a positive integer");let p=t.maxLeverage==null?50:t.maxLeverage;if(typeof p!="number"||!Number.isSafeInteger(p)||p<1)throw new Error("hl: maxLeverage must be a positive integer");if(c>p)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let c=r.action.cancels;if(!Array.isArray(c)||c.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(c[0].a)||c[0].a!==u)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(r.orderId)||r.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(c[0].o)||c[0].o!==r.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==u)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(r.action.leverage)||r.action.leverage!==r.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(r.marginMode))throw new Error("hl: declared margin mode required");let c=r.marginMode==="cross";if(typeof r.action.isCross!="boolean"||r.action.isCross!==c)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==u)throw new Error("hl: signed margin asset must match assetId");let c=Z(r.usd,"margin usd",64),p=$(c,6,"hl: margin usd");if(oe(r.action.ntli,"hl: signed margin ntli")!==p)throw new Error("hl: signed margin amount must match usd");if(typeof r.isBuy!="boolean"||r.action.isBuy!==r.isBuy)throw new Error("hl: signed margin isBuy must match");let f=$(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),d=p<0n?-p:p;if(d>f)throw new Error("hl: margin notional exceeds cap");a=qn(d,6)}}if(n==="builder-fee-approval"){let l=Z(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(l))throw new Error("hl: builder address required");if(Z(r.action.builder,"signed builder",42).toLowerCase()!==l)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(d=>String(d).toLowerCase()):[]).includes(l))throw new Error("hl: builder not allowed");let c=Z(r.maxFeeRate,"maxFeeRate",32);if(Z(r.action.maxFeeRate,"signed maxFeeRate",32)!==c)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(c))throw new Error("hl: builder fee rate must be a percent");let p=$(c.slice(0,-1),12,"hl: builder fee percent"),m=$(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(m<0n||p*100n>m)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let f=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==f||r.action.hyperliquidChain!==r.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(r.signatureChainId!=="0x66eee"||r.action.signatureChainId!==r.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let l=n==="hype-undelegate";if(typeof r.action.isUndelegate!="boolean"||r.action.isUndelegate!==l)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(r.action.wei??r.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(a??r.action.wei??0),notional:String(a??0),fee:"0",kind:n,actionType:r.action.type,amount:String(r.action.wei??a??0),coin:r.coin||null,submitTo:i})}var Un,Hn,jn,zn,Z,Yt=R(()=>{Re();Ze();Un=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),Hn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),jn=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"}),zn=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"}),Z=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function Zn(e){let t=e.owner||e.user||e.from||e.recipient;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("hl: owner/user address required for local-signer envelope");return String(t).toLowerCase()}function Zt(e,t={},r={}){let n=String(e?.kind||""),o=Yn[n];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(r.nowMs??Date.now()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a=String(e.submitTo||"").replace(/\/$/,""),l={version:1,surface:"hl",action:o,owner:Zn(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${n}:${e.nonce}`),expiresAtMs:i+s,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:n,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:a,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return Xt(l,{coins:t.coins||["*"],hip4:!0,maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,maxLeverage:t.maxLeverage??50,hlBuilders:t.hlBuilders||(e.builderFee?.address?[e.builderFee.address]:[]),maxBuilderFeeBps:t.maxBuilderFeeBps??e.builderFee?.bps}),l}var Yn,Qt=R(()=>{Yt();Yn=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 Qn,JsonRpcProvider as eo}from"ethers";function so(e){return io.test(String(e||""))}async function tt(e,{contract:t=to,rpc:r=no,chainId:n=ro,balanceOf:o}={}){if(!so(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new eo(r,n,{staticNetwork:!0}),s=new Qn(t,oo,i);return BigInt(await s.balanceOf(e))}var to,ro,no,oo,io,rt=R(()=>{to="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",ro=999,no="https://rpc.hyperliquid.xyz/evm",oo=["function balanceOf(address owner) view returns (uint256)"],io=/^0x[a-fA-F0-9]{40}$/});import{existsSync as ao,readFileSync as co,lstatSync as lo}from"node:fs";import{homedir as er}from"node:os";import{join as nt}from"node:path";function uo(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[tr])return String(e[tr]);let t=e.ORACLE_CONFIG_DIR||nt(er(),".config","oracle");return nt(t,"fee-recipient")}return nt(er(),".config","oracle","fee-recipient")}function rr(e=process.env){try{let t=uo(e);if(!ao(t)||lo(t).isSymbolicLink())return"";let r=co(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var Fi,tr,nr=R(()=>{rt();Fi=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),tr="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var ur={};jr(ur,{HL_BUILDER_ADDRESS_ENV:()=>Ce,HL_BUILDER_DEFAULT_FEE_BPS:()=>po,HL_BUILDER_FEE_ENV:()=>it,HL_BUILDER_FEE_TIERS:()=>be,HL_BUILDER_MAX_FEE_BPS:()=>ot,HL_PERP_MAX_SIG_FIGS:()=>or,HL_PERP_PRICE_DECIMALS:()=>ir,HL_SIGNATURE_CHAIN_ID:()=>$e,MARGIN_MODE:()=>xe,ORDER_TYPES:()=>_,TIF:()=>Ee,formatPerpPrice:()=>V,formatPerpSize:()=>lr,hlBuilderFeeBpsForKind:()=>cr,hlPerpAssetInfo:()=>ue,hlPrepareApproveAgent:()=>xo,hlPrepareBracketOrder:()=>Io,hlPrepareBuilderApproval:()=>bo,hlPrepareCancelOrder:()=>Eo,hlPreparePerpOrder:()=>lt,hlPrepareUpdateIsolatedMargin:()=>So,hlPrepareUpdateLeverage:()=>ko,resolveBuilderFee:()=>at});function sr(e,t){if(typeof e=="number"){if(Number.isSafeInteger(e)&&e>=0)return e}else if(typeof e=="string"&&/^(?:0|[1-9]\d*)$/.test(e)){let r=Number(e);if(Number.isSafeInteger(r))return r}throw new Error(`hl-perps: ${t} must be a non-negative safe integer`)}function fo(e,t){let r=sr(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function mo(e={}){let t={...e};if(t.side==null)return t;if(t.side===0||t.side===1){if(t.outcomeSide!=null&&t.outcomeSide!==t.side)throw new Error("hl-perps: side conflict with outcomeSide");return t.outcomeSide=t.side,delete t.side,t}throw new Error("hl-assets: side must be 0 or 1")}function ar(e,{defaultBuy:t=!1}={}){if(e.side!=null){if(typeof e.side!="string")throw new Error("hl-perps: side must be buy or sell");let r=e.side.toLowerCase();if(r!=="buy"&&r!=="sell")throw new Error("hl-perps: side must be buy or sell");let n=r==="buy";if(e.isBuy!=null&&(typeof e.isBuy!="boolean"||e.isBuy!==n))throw new Error("hl-perps: side and isBuy conflict");return n}if(e.isBuy==null&&t)return!0;if(typeof e.isBuy!="boolean")throw new Error("hl-perps: isBuy must be boolean when side is omitted");return e.isBuy}function cr(e="perp"){if(e==="perp"||e==="main")return be.perp;if(e==="spot")return be.spot;if(e==="hip3")return be.hip3;if(e==="outcome"||e==="hip4")return be.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function at({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[Ce]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${Ce} must be an EVM address`);let o=rr(e);if(!o||o!==n)return null;let i=e?.[it],s=cr(r),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${it} must be a positive number in 0.1 bps increments`);if(a>ot)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${ot} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${r}`);let l=Math.round(a*10),u=(l/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:n,f:l},disclosure:{address:n,bps:a,percent:`${u}%`}}}async function ho(e,t={},r={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await ne({type:"maxBuilderFee",user:n,builder:e.disclosure.address},r));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function go(e,t={},r={}){if(!e)return{exempt:!1,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{exempt:!1,status:"wallet-required"};try{let o=r.holderBalance||tt;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ct(e,t,{roundDown:r=null}={}){let n=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof n!="string"||!/^-?\d+(\.\d+)?$/.test(n))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=n.startsWith("-"),[i,s=""]=n.replace(/^-/,"").split(".");if(s.length<=t){let d=s.replace(/0+$/,"");return(o?"-":"")+(d?`${i}.${d}`:i)}let a=s.slice(0,t),l=Number(s[t]),u=BigInt(i+a),c=s.slice(t).replace(/0+$/,"")!=="";r===!0||(r===!1?c&&(u+=1n):l>=5&&(u+=1n));let p=u.toString().padStart(t+1,"0"),f=(t===0?p:`${p.slice(0,-t)}.${p.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+f}function wo(e,t,r={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let n=typeof e=="number"?String(e):e;if(!n.includes("."))return n;let o=Number(n);if(!Number.isFinite(o)||o===0)return n;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return ct(n,s,r)}function V(e,t,r={}){let n=ir-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return ct(wo(e,or,r),n,r)}function lr(e,t){let r=ct(e,Number(t??0));if(BigInt(r.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(r)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return r}function yo(e,t){let r=(c,p)=>{let m=String(c).trim();if(!/^\d+(?:\.\d+)?$/.test(m))throw new Error(`hl-perps: ${p} must be a positive decimal`);let[f,d=""]=m.split(".");return{raw:BigInt(f+d),decimals:d.length}},n=r(e,"size"),o=r(t,"price"),i=n.raw*o.raw,s=n.decimals+o.decimals,a=i.toString().padStart(s+1,"0");if(s===0)return a;let l=a.slice(0,-s),u=a.slice(-s).replace(/0+$/,"");return u?`${l}.${u}`:l}async function ue(e={},t={}){let r=await Ye(e,t);return{coin:r.coin,assetId:r.assetId,szDecimals:r.szDecimals,maxLeverage:r.maxLeverage,markPx:r.markPx,kind:r.kind,dex:r.dex??null,dexName:r.dexName??null,outcome:r.outcome??null,side:r.side??null}}function st(e,{tif:t=Ee.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case _.LIMIT:return{limit:{tif:t}};case _.MARKET:return{limit:{tif:Ee.IOC}};case _.STOP_MARKET:case _.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:V(r,o),tpsl:e===_.STOP_MARKET?"sl":"tp"}};case _.STOP_LIMIT:case _.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:V(r,o),tpsl:e===_.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function ie(e,t,r={}){let n=r.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:$e,submitTo:n?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange",note:"Sign locally via Oracle local-signer or a wallet. Hosted Oracle does not submit."}}function de(e,t={},r={}){let n={...e};try{n.localSignerEnvelope=Zt(n,t,r),n.prepared=!0,n.signing="awaiting-hl-signer"}catch(o){n.prepared=!1,n.localSignerEnvelope=null,n.localSignerBlockedReason=String(o?.message||o).slice(0,200),n.signing="blocked"}return n.oraclePrepared=!!n.localSignerEnvelope,D(n,{provider:e.provider||"hl-perps",kind:e.kind})}function bo(e={},t={}){let r=at({env:t.env});if(!r)throw new Error(`hl-perps: ${Ce} is required`);let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:$e,maxFeeRate:r.disclosure.percent,builder:r.disclosure.address,nonce:n};return de({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:r.disclosure,...ie(o,n,t)},e,t)}function xo(e={},t={}){let r=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error("hl-perps: agentAddress required");let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:$e,agentAddress:r.toLowerCase(),agentName:o,nonce:n};return D({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:r.toLowerCase(),agentName:o,...ie(i,n,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function lt(e={},t={}){let r=await ue(e,t);if(e.type!=null&&(typeof e.type!="string"||!e.type))throw new Error("hl-perps: order type must be a string");let n=e.type??_.LIMIT;if(typeof n!="string"||!n)throw new Error("hl-perps: order type must be a string");let o=ar(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=lr(e.size??e.sz,r.szDecimals),a;if(n===_.MARKET){let b=Number(r.markPx);if(!Number.isFinite(b)){let W=await We(t);b=Number(W?.[r.coin]??W?.[String(r.assetId)]??NaN)}if(!Number.isFinite(b))throw new Error("hl-perps: no mark price available for a market order");let x=Number(e.maxSlippageBps??50);if(!Number.isInteger(x)||x<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(x>100)throw new Error(`hl-perps: maxSlippageBps ${x} exceeds the hard 100 bps cap`);let v=o?b*(1+x/1e4):b*(1-x/1e4);a=V(v,r.szDecimals,{roundDown:o});let L=Math.abs(Number(a)/b-1)*1e4;if(L>x+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${L.toFixed(2)} bps from mark, above the ${x} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=V(e.price??e.limitPx,r.szDecimals)}let l=st(n,{tif:e.tif??(n===_.MARKET?Ee.IOC:Ee.GTC),triggerPx:e.triggerPx,szDecimals:r.szDecimals}),u={a:r.assetId,b:o,p:a,s,r:i,t:l};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");u.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let c={type:"order",orders:[u],grouping:e.grouping??"na"},p=at({env:t.env,kind:r.kind}),m=await go(p,e,t),f=m.exempt?null:p,d=await ho(f,e,t),h=d.approved?f:null;h&&(c.builder=h.wire);let g=Number(e.nonce??Date.now()),y=yo(s,a);return de({provider:"hl-perps",venue:"hyperliquid",kind:r.kind==="outcome"?"hip4-order":r.kind==="hip3"?"hip3-order":"perp-order",coin:r.coin,assetId:r.assetId,assetKind:r.kind,outcome:r.outcome??null,outcomeSide:r.side??null,dex:r.dex??null,dexName:r.dexName??null,side:o?"buy":"sell",orderType:n,price:a,size:s,reduceOnly:i,notionalUsd:y,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:h?.disclosure??null,holderExempt:m.exempt,holderVerificationStatus:m.status,builderApprovalRequired:f&&!h?{...p.disclosure,...d}:null,...ie(c,g,t)},e,t)}async function Eo(e={},t={}){let r=await ue(mo(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=sr(n,"orderId"),i={type:"cancel",cancels:[{a:r.assetId,o}]};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:r.coin,assetId:r.assetId,orderId:o,...ie(i,Number(e.nonce??Date.now()),t)},e,t)}async function ko(e={},t={}){let r=await ue(e,t),n=fo(e.leverage,"leverage");if(r.maxLeverage!=null&&n>r.maxLeverage)throw new Error(`hl-perps: ${r.coin} allows at most ${r.maxLeverage}x, requested ${n}x`);if(e.marginMode!=null&&typeof e.marginMode!="string")throw new Error("hl-perps: marginMode must be a string");let o=(e.marginMode||xe.CROSS).toLowerCase();if(o!==xe.CROSS&&o!==xe.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===xe.CROSS,leverage:n};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:r.coin,assetId:r.assetId,leverage:n,marginMode:o,maxLeverage:r.maxLeverage,liquidationWarning:n>=20?`${n}x liquidates on roughly a ${(100/n).toFixed(2)}% adverse move before fees`:null,...ie(i,Number(e.nonce??Date.now()),t)},e,t)}async function So(e={},t={}){let r=await ue(e,t),n=e.usd??e.amountUsd;if(n==null)throw new Error("hl-perps: usd amount required");if(typeof n!="number"&&typeof n!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof n=="number"?String(n):n;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=$(o,6,"hl-perps: usd"),s=ar(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:r.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:r.coin,assetId:r.assetId,isBuy:s,usd:o,...ie(a,Number(e.nonce??Date.now()),t)},e,t)}async function Io(e={},t={}){let r=await lt(e,t),n=await ue(e,t),o=r.side==="buy",i=[r.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:n.assetId,b:!o,p:V(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:st(_.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:V(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:st(_.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:n.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...r.action.builder?{builder:r.action.builder}:{}};return de({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:n.coin,assetId:n.assetId,side:r.side,price:r.price,size:r.size,reduceOnly:r.reduceOnly,orderType:r.orderType,notionalUsd:r.notionalUsd,legs:i.length,entry:{side:r.side,price:r.price,size:r.size},takeProfitPx:e.takeProfitPx==null?null:V(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:V(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ie(s,Number(e.nonce??Date.now()),t)},e,t)}var or,ir,$e,po,ot,Ce,it,be,_,Ee,xe,ut=R(()=>{we();Ze();Re();ce();Qt();rt();nr();or=5,ir=6,$e="0x66eee",po=2,ot=10,Ce="ORACLE_HL_BUILDER_ADDRESS",it="ORACLE_HL_BUILDER_FEE_BPS",be=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),_=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Ee=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),xe=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});B();var Sn="https://yields.llama.fi";async function Mt(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Sn).replace(/\/$/,""),n=await C(`${r}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(n?.data)?n.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...n,data:o.slice(0,i)}}ce();we();var ki=24*365;ut();B();B();B();B();import{Interface as pt,getAddress as gs,isAddress as ws}from"ethers";B();var dt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var rs=new Map(Object.values(dt).map(e=>[e.chainId,e]));import{Interface as vo,getAddress as us}from"ethers";var ds=new vo(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ce();var dr=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Es=Object.freeze({42161:{name:"arbitrum",api:dr[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:dr[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var ks=`0x${"0".repeat(64)}`,Ss=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Is=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),vs=new pt(["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"]),As=new pt(["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)"]),Ps=new pt(["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)"]),Os=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});B();B();ce();Re();var Ao=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ke=14,pr=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`lighter: bounded ${t} required`);return e};function pe(e,t,r){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${r} must be exact numeric ${t}`)}function ft(e){let t=String(e||"").replace(/\/$/,"");if(!Ao.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function fr(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("lighter: structured artifact required");let n=pr(r.kind,"kind",48);if(n!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=ft(r.submitTo),i=r.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(oe(r.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let a=Number(oe(r.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: clientOrderIndex required");pe(r.orderType,0,"orderType"),pe(r.timeInForce,1,"timeInForce"),pe(r.reduceOnly,0,"reduceOnly"),pe(r.triggerPrice,0,"triggerPrice"),pe(r.orderExpiry,-1,"orderExpiry");let l=pr(r.symbol||r.coin,"symbol",32),u=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(u.length&&!u.includes(l)&&!u.includes(String(i))&&!u.includes("*"))throw new Error("lighter: market not allowed");if(r.side!=="buy"&&r.side!=="sell")throw new Error("lighter: side must be buy or sell");let c=Qe(r.baseAmount,"lighter: baseAmount"),p=Qe(r.price,"lighter: price");if(c>BigInt(Number.MAX_SAFE_INTEGER)||p>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let m=Number(c),f=Number(p),d=Number(r.sizeDecimals??0),h=Number(r.priceDecimals??0);if(!Number.isInteger(d)||d<0||d>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=d+h,y=c*p,b=$(r.notionalUsd,g,"lighter: notionalUsd");if(b<=0n)throw new Error("lighter: notionalUsd required");if(y!==b)throw new Error("lighter: notionalUsd must match size and price");let x=$(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(y>x)throw new Error("lighter: notional exceeds cap");let v=T(r.notionalUsd,"lighter: notionalUsd");return pe(r.txType,ke,"txType"),Object.freeze({unit:"usd",value:String(v),notional:String(v),fee:"0",kind:n,symbol:l,marketIndex:i,side:r.side,baseAmount:m,price:f,submitTo:o,actionType:"create-order",amount:String(v)})}function Po(e){let t=e.owner||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("lighter: owner address required for local-signer envelope");return String(t).toLowerCase()}function mr(e,t={},r={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let n=Number(r.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=ft(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:Po(t),destination:"lighter",tradeId:String(t.tradeId||`lighter:${e.symbol}:${e.marketIndex}:${e.clientOrderIndex}`),expiresAtMs:n+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"lighter-delta-neutral",artifact:{kind:"lighter-order",symbol:e.symbol,marketIndex:e.marketIndex,side:e.side,baseAmount:e.baseAmount,price:e.price,notionalUsd:e.notionalUsd,sizeDecimals:e.sizeDecimals??0,priceDecimals:e.priceDecimals??0,clientOrderIndex:e.clientOrderIndex,txType:e.txType??ke,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return fr(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}function hr(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function De(e={},t,r){let n=String(t||""),o=hr(e);if(o){let s=Se(o[n]);if(s==null)throw new Error(`${r}: held spot required for ${n}`);return s}let i=Se(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${r}: prepare requires spotSize of held spot`);return i}function Fe(e={},t=[],r){let n=hr(e);if(t.length>1){if(!n)throw new Error(`${r}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Se(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(n){let o=t[0];if(o&&Se(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(Se(e.spotSize??e.spotHeldSize)==null)throw new Error(`${r}: live loop requires spotSize of held spot`)}var mt=Number.MAX_SAFE_INTEGER,Me=String(mt);function Se(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=mt?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,r=""]=e.split(".");if(t.length>Me.length||t.length===Me.length&&t>Me||t===Me&&/[1-9]/.test(r))return null;let n=Number(e);return Number.isFinite(n)&&n>0&&n<=mt?n:null}var wr="https://mainnet.zklighter.elliot.ai",yr="https://testnet.zklighter.elliot.ai";function Oo(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?yr:wr}function Q(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function To(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function br(e){let t=Q(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function No(e,t,r=4){let n=Q(e),o=Q(t),i=Number.isInteger(Number(r))?Number(r):4;if(!(n>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let s=10**i;return Math.floor(n/o*s+1e-12)}function gr(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function xr(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 s of n){let a=gr(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of r){if(String(s.exchange||"")!=="lighter")continue;let a=gr(s.market_id);if(a==null)continue;let l=o.get(a),u=Q(l?.mark_price??l?.index_price),c=Q(s.rate),p=String(s.symbol||l?.symbol||"").trim();!p||c==null||!(u>0)||i.push({coin:p,symbol:p,marketIndex:a,funding:c,markPx:u,openInterest:Q(l?.open_interest)??0,sizeDecimals:Number(l?.supported_size_decimals??l?.size_decimals??4),priceDecimals:Number(l?.supported_price_decimals??l?.price_decimals??2),fundingAprPct:br(c)})}return i}function Er(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let r=Q(e.funding);if(r==null)throw new Error("lighter: funding required");let n=br(r),o=r>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Q(t),markPx:e.markPx,fundingHourly:r,fundingAprPct:n,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?No(t,e.markPx,e.sizeDecimals):0,price:Math.round(Number(e.markPx)*10**Number(e.priceDecimals||0)),sizeDecimals:e.sizeDecimals,priceDecimals:e.priceDecimals,verdict:o?n>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry on Lighter. Armed via official sendTx. Not automated."};if(!(i.notionalUsd>0))throw new Error("lighter: notionalUsd must be > 0");return i}async function kr(e={}){let t=Oo(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,i]=await Promise.all([C(`${t}/api/v1/funding-rates`,n),C(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:i}}catch(o){throw r.abort(o),o}}async function ht(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:n,books:o}=await kr(t),i=xr(n,o).filter(s=>s.funding>0).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,r);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(n?.funding_rates)?n.funding_rates.filter(s=>s.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function gt(e={},t={}){let r=String(e.coin||e.symbol||"").trim();if(!r)throw new Error("lighter: coin required");let n=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await kr(t),s=xr(o,i).find(a=>a.symbol===r);if(!s)throw new Error(`lighter: ${r} not in Lighter funding`);return Er(s,n)}async function _o(e={},t={}){Ir(e,t,"lighter");let r=vr(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let n=e.accountIndex,o=await gt(e,t);if(o.verdict==="skip")return D({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=De(e,o.coin,"lighter");if(!Sr.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),l=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),u=To(BigInt(o.baseAmount)*BigInt(o.price),l);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let c={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:u,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:n,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:ke,submitTo:`${a?yr:wr}/api/v1/sendTx`,signed:!1,broadcast:!1},p=null,m=null;try{p=mr(c,{...e,maxNotionalUsd:r},t)}catch(d){m=String(d?.message||d).slice(0,200)}return D({...c,prepared:!!p,signing:p?"awaiting-lighter-signer":"blocked",localSignerEnvelope:p,localSignerBlockedReason:m,oraclePrepared:!!p},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Sr=/^0x[0-9a-fA-F]{40}$/;function Ir(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function Lo(e,t,r){Ir(e,t,r)}function Ro(e={}){if(e.halted===!0)throw new Error("lighter: loop is halted");let t=e.mode==="live"?"live":"shadow",r=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],n=e.maxCoins??1;if(typeof n!="number"&&!(typeof n=="string"&&/^(?:0|[1-9]\d*)$/.test(n)))throw new Error("lighter: maxCoins must be an integer");let o=Number(n);if(!Number.isSafeInteger(o))throw new Error("lighter: maxCoins must be an integer");if(o<1||o>8)throw new Error("lighter: maxCoins must be between 1 and 8");let i=vr(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&r.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&Fe(e,r,"lighter"),t==="live"&&!Sr.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:r,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function vr(e,t){let r=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!r)throw new Error(`${t}: maxNotionalUsd out of bounds`);let n=Number(e);if(!(n>0)||n>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return n}async function Ar(e={},t={}){Lo(e,t,"lighter");let r=Ro(e),n=await ht({limit:e.limit??16},t),o=new Set(r.allowlist),i=[],s=Math.floor(r.maxNotionalUsd/r.maxCoins);for(let a of n.candidates){if(o.size&&!o.has(a.symbol)&&!o.has(a.coin))continue;let l=Er(a,s);if(l.verdict!=="carry")continue;if(i.length>=r.maxCoins)break;if(r.mode==="shadow"){i.push({...l,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let u=await _o({coin:l.symbol,notionalUsd:l.notionalUsd,maxNotionalUsd:s,owner:e.owner,accountIndex:r.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...u,mode:"live",surface:"lighter"})}return{loop:!0,mode:r.mode,surface:"lighter",signer:"lighter",considered:n.considered,actions:i,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var Co=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);var Ie=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."}]),$o={"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."},Mo={"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."},Do={"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 se(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function G(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function Fo(e){let t=G(e.symbol,"").toUpperCase(),r=G(e.exposure,"").toLowerCase(),n=se(e.apy)??0,o=se(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 Bo(e,t){let r=se(e.tvlUsd)??0,n=G(e.ilRisk,"").toLowerCase(),o=G(e.predictions?.predictedClass,"").toLowerCase(),i=t==="stable-loop"?3:t==="collateral-hedge"?6:9;return r<1e6?i+=6:r<1e7&&(i+=3),(n.includes("yes")||n.includes("high"))&&(i+=3),o.includes("down")&&(i+=2),Math.min(35,Math.max(0,i))}function Uo(e){let t=Fo(e);if(!t)return null;let r=se(e.apy)??0,n=se(e.apyBase)??0,o=Math.max(0,se(e.apyReward)??Math.max(0,r-n)),i=Math.max(0,se(e.tvlUsd)??0),s=Bo(e,t),a=t==="stable-loop"?4:t==="collateral-hedge"?6:0,l=t==="stable-loop"?0:t==="collateral-hedge"?4:5,u=i<5e6?1.2:.5,c=r-a-l-u-s,p=c<1?"Avoid":r>80||i<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",m=G(e.project),f=G(e.symbol),d=G(e.chain);return{id:G(e.pool,`${d}:${m}:${f}`),recipe:t,label:`${m} ${f}`,chain:d,project:m,symbol:f,tvlUsd:i,rewardApr:o,nativeApr:n,estimatedBorrowApr:a,estimatedFundingApr:l,gasApr:u,riskHaircut:s,netApr:c,verdict:p,exposure:G(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:$o[t],monitor:Mo[t],prepareSteps:[`Verify ${m} contracts and reward terms on ${d}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Do[t]],source:"DeFiLlama yields"}}async function Pr(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),n=Number(e.minTvl??2e6),o=new Date().toISOString(),i="read-only discovery and prepare-plan design; no signing or broadcast";try{let s=await Mt({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),a=Array.isArray(s?.data)?s.data:[],l=a.map(Uo).filter(u=>u!==null).filter(u=>u.tvlUsd>=n).filter(u=>u.rewardApr+u.nativeApr<=300).sort((u,c)=>c.netApr-u.netApr||c.tvlUsd-u.tvlUsd).slice(0,r);return{configured:!0,live:!0,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:a.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:l,posture:i}}catch(s){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(s?.message||s),candidates:[],posture:i}}}function H(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 Or(e={}){let t=H(e.wallets,5,1,500),r=H(e.tasksWeekly,6,0,500),n=H(e.hoursWeekly,4,0,168),o=H(e.hourlyCost,25,0,1e4),i=H(e.gasPerTask,.4,0,1e4),s=H(e.bridgeMonthly,12,0,1e5),a=H(e.expectedReward,900,0,1e7),l=H(e.probability,22,0,100)/100,u=H(e.sybilHaircut,25,0,100)/100,c=H(e.lockupMonths,6,0,120),p=r*t*4.33,m=p*i,f=n*4.33*o,d=m+f+s,h=Math.max(0,1-c*.015),g=t*a*l,y=g*(1-u)*h,b=y-d,x=d>0?b/d*100:null,v=t*a>0?d/(t*a*(1-u)*(h||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:i,bridgeMonthly:s,expectedReward:a,probabilityPct:l*100,sybilHaircutPct:u*100,lockupMonths:c},monthlyTasks:p,monthlyGas:m,laborMonthly:f,monthlyCost:d,lockupDiscount:h,grossExpectedValue:g,adjustedExpectedValue:y,netExpectedValue:b,roiPct:x,breakevenProbabilityPct:v,verdict:b>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}we();ce();function K(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Tr(e){let t=K(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function Ho(e,t,r=4){let n=K(e),o=K(t),i=Number.isInteger(Number(r))?Number(r):4;if(!(n>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let s=10**i;return String(Math.floor(n/o*s+1e-12)/s)}function Nr(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],r=Array.isArray(e?.[1])?e[1]:[],n=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},s=r[o]||{},a=String(i.name||"").trim(),l=K(s.funding),u=K(s.markPx??s.oraclePx),c=K(s.openInterest)??0;!a||l==null||!(u>0)||n.push({coin:a,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:l,markPx:u,oraclePx:K(s.oraclePx),openInterest:c,fundingAprPct:Tr(l)})}return n}function _r(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let r=K(e.funding);if(r==null)throw new Error("hl-delta-neutral: funding required");let n=Tr(r),o=r>0,i={coin:e.coin,notionalUsd:K(t),markPx:e.markPx,fundingHourly:r,fundingAprPct:n,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?Ho(t,e.markPx,e.szDecimals):"0",verdict:o?n>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function wt(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),n=Number(e.minOpenInterest??0),o=await le(t),i=Nr(o).filter(s=>s.funding>0&&s.openInterest>=n).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,r);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function yt(e={},t={}){let r=String(e.coin||"").trim();if(!r)throw new Error("hl-delta-neutral: coin required");let n=Number(e.notionalUsd??e.notional??1e3),o=await le(t),i=Nr(o).find(s=>s.coin===r);if(!i)throw new Error(`hl-delta-neutral: ${r} not in Hyperliquid meta`);return _r(i,n)}async function jo(e={},t={}){Rr(e,t,"hl-delta-neutral");let r=Cr(e.maxNotionalUsd??25e3,"hl-delta-neutral"),n=await yt(e,t);if(n.verdict==="skip")return D({...n,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=De(e,n.coin,"hl-delta-neutral");if(!Lr.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(n.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(ut(),ur)),s=await i({coin:n.coin,side:n.perpSide,size:n.perpSize,type:e.orderType||"limit",price:e.price??n.markPx,owner:e.owner,maxNotionalUsd:r},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(s?.signed===!0||s?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let a=s?.localSignerEnvelope||null,l=s?.localSignerBlockedReason||null;return D({...n,prepared:!!a,surface:"hl",hedge:s,localSignerEnvelope:a,localSignerBlockedReason:l,signed:!1,broadcast:!1,signing:a?"awaiting-hl-signer":"blocked",oraclePrepared:!!a},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var Lr=/^0x[0-9a-fA-F]{40}$/;function Rr(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function zo(e,t,r){Rr(e,t,r)}function qo(e={}){if(e.halted===!0)throw new Error("hl-delta-neutral: loop is halted");let t=e.mode==="live"?"live":"shadow",r=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],n=e.maxCoins??1;if(typeof n!="number"&&!(typeof n=="string"&&/^(?:0|[1-9]\d*)$/.test(n)))throw new Error("hl-delta-neutral: maxCoins must be an integer");let o=Number(n);if(!Number.isSafeInteger(o))throw new Error("hl-delta-neutral: maxCoins must be an integer");if(o<1||o>8)throw new Error("hl-delta-neutral: maxCoins must be between 1 and 8");let i=Cr(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&r.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&Fe(e,r,"hl-delta-neutral"),t==="live"&&!Lr.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:r,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function Cr(e,t){let r=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!r)throw new Error(`${t}: maxNotionalUsd out of bounds`);let n=Number(e);if(!(n>0)||n>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return n}async function $r(e={},t={}){zo(e,t,"hl-delta-neutral");let r=qo(e),n=await wt({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(r.allowlist),i=[],s=Math.floor(r.maxNotionalUsd/r.maxCoins);for(let a of n.candidates){if(o.size&&!o.has(a.coin))continue;let l=_r(a,s);if(l.verdict!=="carry")continue;if(i.length>=r.maxCoins)break;if(r.mode==="shadow"){i.push({...l,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let u=await jo({coin:l.coin,notionalUsd:l.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:s,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...u,mode:"live",surface:"hl"})}return{loop:!0,mode:r.mode,surface:"hl",signer:"hl",considered:n.considered,actions:i,nextWaitMs:r.intervalMs,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var bt=`oracle farm <methods|discover|airdrop|carry|loop|lighter> [options]
3
3
 
4
4
  oracle farm methods list the delta-aware farming playbooks
5
5
  oracle farm methods --id stable-loop full setup/exposure/hedge/monitor/exit for one method
@@ -13,7 +13,7 @@ var Hr=Object.defineProperty;var L=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(
13
13
  oracle farm loop [--venue hl|lighter] [--mode shadow|live] [--coin BTC] [--notional 1000] [--spot-size 0.01] [--owner 0x...] [--json]
14
14
  oracle farm lighter [--coin BTC] [--notional 1000] [--json]
15
15
 
16
- Owner-operated. Carry/loop only prepare unsigned hedges. Signing is oracle signer after exact confirm. Farm loop never signs or broadcasts.`;function Vo(e){let t={_:[]};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--json"){t.json=!0;continue}if(n.startsWith("--")){let o=n.slice(2),i=e[r+1];if(i===void 0||i.startsWith("--")){t[o]=!0;continue}t[o]=i,r+=1;continue}t._.push(n)}return t}var K=e=>`$${Math.round(Number(e)||0).toLocaleString("en-US")}`,Ae=e=>`${(Number(e)||0).toFixed(1)}%`;function Go(e){let t=typeof e.id=="string"?e.id:null;if(t){let r=Ie.find(n=>n.id===t);if(!r)return process.stderr.write(`oracle farm: unknown method '${t}'. Known: ${Ie.map(n=>n.id).join(", ")}
16
+ Owner-operated. Carry/loop only prepare unsigned hedges. Signing is oracle signer after exact confirm. Farm loop never signs or broadcasts.`;function Vo(e){let t={_:[]};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--json"){t.json=!0;continue}if(n.startsWith("--")){let o=n.slice(2),i=e[r+1];if(i===void 0||i.startsWith("--")){t[o]=!0;continue}t[o]=i,r+=1;continue}t._.push(n)}return t}var J=e=>`$${Math.round(Number(e)||0).toLocaleString("en-US")}`,ve=e=>`${(Number(e)||0).toFixed(1)}%`;function Go(e){let t=typeof e.id=="string"?e.id:null;if(t){let r=Ie.find(n=>n.id===t);if(!r)return process.stderr.write(`oracle farm: unknown method '${t}'. Known: ${Ie.map(n=>n.id).join(", ")}
17
17
  `),1;if(e.json)return process.stdout.write(JSON.stringify(r,null,2)+`
18
18
  `),0;process.stdout.write(`
19
19
  ${r.label} [${r.risk}] target delta ${r.targetDelta}
@@ -28,37 +28,37 @@ Owner-operated. Carry/loop only prepare unsigned hedges. Signing is oracle signe
28
28
  `);return process.stdout.write(`
29
29
  oracle farm methods --id <id> for setup, exposure, hedge, monitor, and exit rules.
30
30
 
31
- `),0}async function Jo(e){let t=await Pr({chain:typeof e.chain=="string"?e.chain:null,limit:e.limit,minTvl:e["min-tvl"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
31
+ `),0}async function Ko(e){let t=await Pr({chain:typeof e.chain=="string"?e.chain:null,limit:e.limit,minTvl:e["min-tvl"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
32
32
  `),0;if(!t.live)return process.stderr.write(`oracle farm: discovery unavailable \u2014 ${t.error}
33
33
  `),1;process.stdout.write(`
34
34
  live farm discovery \u2014 ${t.source}, ${t.considered.toLocaleString("en-US")} pools considered (${t.consideredNote}), chain=${t.chain}
35
35
 
36
36
  `),process.stdout.write(` ${"verdict".padEnd(10)}${"net apr".padStart(9)} ${"tvl".padStart(12)} ${"chain".padEnd(12)}${"recipe".padEnd(18)}pool
37
- `);for(let r of t.candidates)process.stdout.write(` ${r.verdict.padEnd(10)}${Ae(r.netApr).padStart(9)} ${K(r.tvlUsd).padStart(12)} ${r.chain.slice(0,11).padEnd(12)}${r.recipe.padEnd(18)}${r.label}
37
+ `);for(let r of t.candidates)process.stdout.write(` ${r.verdict.padEnd(10)}${ve(r.netApr).padStart(9)} ${J(r.tvlUsd).padStart(12)} ${r.chain.slice(0,11).padEnd(12)}${r.recipe.padEnd(18)}${r.label}
38
38
  `);return process.stdout.write(`
39
39
  net apr = apy \u2212 borrow \u2212 funding \u2212 gas \u2212 risk haircut.
40
40
  ${t.posture}.
41
41
 
42
- `),0}function Ko(e){let t=Or({wallets:e.wallets,tasksWeekly:e["tasks-weekly"],hoursWeekly:e["hours-weekly"],hourlyCost:e["hourly-cost"],gasPerTask:e["gas-per-task"],bridgeMonthly:e["bridge-monthly"],expectedReward:e["expected-reward"],probability:e.probability,sybilHaircut:e["sybil-haircut"],lockupMonths:e["lockup-months"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
42
+ `),0}function Jo(e){let t=Or({wallets:e.wallets,tasksWeekly:e["tasks-weekly"],hoursWeekly:e["hours-weekly"],hourlyCost:e["hourly-cost"],gasPerTask:e["gas-per-task"],bridgeMonthly:e["bridge-monthly"],expectedReward:e["expected-reward"],probability:e.probability,sybilHaircut:e["sybil-haircut"],lockupMonths:e["lockup-months"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
43
43
  `),0;let r=t.inputs;return process.stdout.write(`
44
44
  airdrop expected value
45
45
 
46
- `),process.stdout.write(` ${r.wallets} wallets \xB7 ${r.tasksWeekly} tasks/wk \xB7 ${r.hoursWeekly} hrs/wk @ ${K(r.hourlyCost)}/hr
47
- `),process.stdout.write(` ${Ae(r.probabilityPct)} eligibility \xB7 ${Ae(r.sybilHaircutPct)} sybil haircut \xB7 ${r.lockupMonths}mo lockup
46
+ `),process.stdout.write(` ${r.wallets} wallets \xB7 ${r.tasksWeekly} tasks/wk \xB7 ${r.hoursWeekly} hrs/wk @ ${J(r.hourlyCost)}/hr
47
+ `),process.stdout.write(` ${ve(r.probabilityPct)} eligibility \xB7 ${ve(r.sybilHaircutPct)} sybil haircut \xB7 ${r.lockupMonths}mo lockup
48
48
 
49
- `),process.stdout.write(` monthly cost ${K(t.monthlyCost).padStart(12)} (gas ${K(t.monthlyGas)} + labor ${K(t.laborMonthly)} + bridges ${K(r.bridgeMonthly)})
50
- `),process.stdout.write(` gross EV ${K(t.grossExpectedValue).padStart(12)}
51
- `),process.stdout.write(` after haircuts ${K(t.adjustedExpectedValue).padStart(12)} (lockup discount ${(t.lockupDiscount*100).toFixed(0)}%)
52
- `),process.stdout.write(` net EV ${K(t.netExpectedValue).padStart(12)} ${t.verdict}
53
- `),t.roiPct!=null&&process.stdout.write(` ROI ${Ae(t.roiPct).padStart(12)}
54
- `),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${Ae(t.breakevenProbabilityPct).padStart(12)} campaign must clear this to profit
49
+ `),process.stdout.write(` monthly cost ${J(t.monthlyCost).padStart(12)} (gas ${J(t.monthlyGas)} + labor ${J(t.laborMonthly)} + bridges ${J(r.bridgeMonthly)})
50
+ `),process.stdout.write(` gross EV ${J(t.grossExpectedValue).padStart(12)}
51
+ `),process.stdout.write(` after haircuts ${J(t.adjustedExpectedValue).padStart(12)} (lockup discount ${(t.lockupDiscount*100).toFixed(0)}%)
52
+ `),process.stdout.write(` net EV ${J(t.netExpectedValue).padStart(12)} ${t.verdict}
53
+ `),t.roiPct!=null&&process.stdout.write(` ROI ${ve(t.roiPct).padStart(12)}
54
+ `),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${ve(t.breakevenProbabilityPct).padStart(12)} campaign must clear this to profit
55
55
  `),process.stdout.write(`
56
56
  ${t.posture}.
57
57
 
58
58
  `),0}async function Mr(e,t={}){let r=t.fetchImpl?{fetchImpl:t.fetchImpl}:{},n=typeof e.coin=="string"?e.coin:null,i=(e.venue==="lighter"?"lighter":"hl")==="lighter"?n?await gt({coin:n,notionalUsd:e.notional},r):await ht({limit:e.limit},r):n?await yt({coin:n,notionalUsd:e.notional},r):await wt({limit:e.limit},r);return e.json?(process.stdout.write(JSON.stringify(i,null,2)+`
59
59
  `),0):(process.stdout.write(`
60
60
  ${JSON.stringify(i)}
61
- `),0)}async function Wo(e,t={}){let r=t.fetchImpl?{fetchImpl:t.fetchImpl}:{},n=typeof e.coin=="string"?[e.coin]:[],o=e.venue==="lighter"?"lighter":"hl",i={mode:e.mode==="live"?"live":"shadow",coins:n,notionalUsd:e.notional,limit:e.limit,spotSize:e["spot-size"],owner:e.owner},s=o==="lighter"?await vr(i,r):await Cr(i,r);if(e.json)return process.stdout.write(JSON.stringify(s,null,2)+`
61
+ `),0)}async function Wo(e,t={}){let r=t.fetchImpl?{fetchImpl:t.fetchImpl}:{},n=typeof e.coin=="string"?[e.coin]:[],o=e.venue==="lighter"?"lighter":"hl",i={mode:e.mode==="live"?"live":"shadow",coins:n,notionalUsd:e.notional,limit:e.limit,spotSize:e["spot-size"],owner:e.owner},s=o==="lighter"?await Ar(i,r):await $r(i,r);if(e.json)return process.stdout.write(JSON.stringify(s,null,2)+`
62
62
  `),0;process.stdout.write(`
63
63
  farm loop ${s.mode} via ${s.signer}, ${s.actions.length} action(s)
64
64
  `);for(let a of s.actions)process.stdout.write(` ${a.coin||a.symbol} ${a.perpSide} ${a.perpSize||a.baseAmount} ${a.verdict} ${a.mode}
@@ -66,7 +66,7 @@ Owner-operated. Carry/loop only prepare unsigned hedges. Signing is oracle signe
66
66
  ${s.posture}
67
67
 
68
68
  `),0}var ya={name:"farm",summary:"farming methods, live farm discovery, HL carry loop, airdrop EV",group:"read",usage:bt,async run(e){let t=Vo(e.argv),r=t._[0];return!r||r==="help"?(process.stdout.write(bt+`
69
- `),0):r==="methods"?Go(t):r==="discover"?Jo(t):r==="airdrop"?Ko(t):r==="carry"?Mr(t,e):r==="loop"?Wo(t,e):r==="lighter"?Mr({...t,venue:"lighter"},e):(process.stderr.write(`oracle farm: unknown subcommand '${r}'
69
+ `),0):r==="methods"?Go(t):r==="discover"?Ko(t):r==="airdrop"?Jo(t):r==="carry"?Mr(t,e):r==="loop"?Wo(t,e):r==="lighter"?Mr({...t,venue:"lighter"},e):(process.stderr.write(`oracle farm: unknown subcommand '${r}'
70
70
 
71
71
  ${bt}
72
72
  `),1)}};export{ya as default};