@oracle-agent/oracle 0.35.39 → 0.35.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-sessions.mjs +11 -11
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +19 -19
- package/dist/bin/oracle-gateway.mjs +43 -43
- package/dist/bin/oracle-investigate.mjs +5 -5
- package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +18 -18
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/cli/commands/agent-session.mjs +18 -18
- package/dist/cli/commands/airdrop.mjs +8 -8
- package/dist/cli/commands/chat.mjs +207 -207
- package/dist/cli/commands/doctor.mjs +9 -9
- package/dist/cli/commands/eval.mjs +147 -197
- package/dist/cli/commands/farm.mjs +17 -17
- package/dist/cli/commands/follow.mjs +17 -17
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +211 -211
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +12 -12
- package/dist/cli/commands/resolve.mjs +7 -7
- package/dist/cli/commands/sign.mjs +4 -4
- package/dist/cli/commands/signer.mjs +14 -14
- package/dist/cli/commands/snipe.mjs +9 -9
- package/dist/cli/commands/strategy.mjs +4 -4
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +26 -26
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +2 -2
- package/dist/local-signer/runtime.mjs +8 -8
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +7 -7
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/teams/index.mjs +6 -6
- package/dist/tui/standalone-client.mjs +82 -82
- package/package.json +4 -4
- package/public/eval-report.json +3 -3
- package/public/oracle-splash/_variants/ice.html +2 -4
- package/public/oracle-splash/_variants/ivory.html +2 -4
- package/public/oracle-splash/assets/fonts/LICENSE-Cormorant-Garamond.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-IBM-Plex-Mono.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-Outfit.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-UnifrakturCook.txt +94 -0
- package/public/oracle-splash/assets/fonts/font-provenance.json +426 -0
- package/public/oracle-splash/assets/fonts/oracle-font-00.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-01.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-02.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-03.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-04.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-05.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-06.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-07.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-08.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-09.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-10.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-11.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-12.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-13.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-14.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-15.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-16.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-17.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-18.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-19.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-20.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-21.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-22.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-23.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-24.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-25.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-26.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-27.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-fonts.css +504 -0
- package/public/oracle-splash/assets/transport-probe-sw.js +2 -0
- package/public/oracle-splash/docs/browser-and-web/index.html +6 -6
- package/public/oracle-splash/docs/connectors/index.html +5 -5
- package/public/oracle-splash/docs/docs.css +4 -4
- package/public/oracle-splash/docs/docs.js +119 -7
- package/public/oracle-splash/docs/getting-started/index.html +5 -5
- package/public/oracle-splash/docs/index.html +6 -6
- package/public/oracle-splash/docs/reference/index.html +5 -5
- package/public/oracle-splash/docs/security/index.html +5 -5
- package/public/oracle-splash/docs/using-oracle/index.html +5 -5
- package/public/oracle-splash/download/index.html +8 -10
- package/public/oracle-splash/downloads/index.html +3 -5
- package/public/oracle-splash/eval/index.html +96 -0
- package/public/oracle-splash/index.html +16 -18
- package/public/oracle-splash/mesh-graph.svg +1 -1
- package/public/oracle-splash/pricing/index.html +6 -8
- package/public/oracle-splash/security/index.html +3 -5
- package/public/oracle-splash/what-it-does/index.html +4 -6
- package/public/oracle-splash/where-it-works/index.html +3 -5
- package/server.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
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 on(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,kt):Math.min(250*2**e,kt)+Math.floor(Math.random()*100)}function X(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function qe(e,t,r){return X(`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 an(e){return e?e.byteLength??e.length??0:0}async function cn(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 qe(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!n)throw qe(r,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],l=0,u=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),l+=an(d),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 qe(r,`streamed ${l} bytes`,t);let c=Buffer.concat(a);return(u?c.subarray(0,t):c).toString("utf8")}function ln(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function un(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:d,validateResponse:p,signal:m,redirectPolicy:f="follow",maxRedirects:g=ve}){let y=new AbortController,b=setTimeout(()=>y.abort(),i),E=m?It?It([m,y.signal]):m:y.signal,w=null,k=t,N=s?{lookupFn:s}:{};if(l&&!a&&!je(k))throw X(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let W=async(x,{status:P=null}={})=>{let O=await Be(x,N);if(!O.ok)throw X(P==null?`HTTP refused ${x}: ${O.error}`:`HTTP redirect to ${x} ${O.error}`,P==null?{}:{status:P});let K=new URL(x).hostname;if(a){if(w&&(await w.close(),w=null),!w)try{w=await Ue({requireUndici:!0,...d?{importUndici:d}:{}})}catch(h){throw X(P==null?`HTTP refused ${x}: ${h?.message||h}`:`HTTP redirect to ${x} refused: ${h?.message||h}`,P==null?{}:{status:P})}w.pin(K,O.addresses),k=w.fetch}else bt(k,K,O.addresses);return O};try{let x=String(e),P=Object.assign(Object.create(null),n||{});l&&await W(x);for(let O=0;O<=g;O+=1){let K=Object.assign(Object.create(null),{method:r,headers:P,body:o,signal:E,redirect:"manual",dispatcher:void 0}),h=await k(x,K);if((f==="error"||g===0)&&h.status>=300&&h.status<400)throw re(h),X(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(Wr.has(h.status)){let C=c===!0&&r==="POST"&&[307,308].includes(h.status)&&Pt(r,o);if(r!=="GET"&&r!=="HEAD"&&!C){re(h);let v=new Error(`HTTP ${h.status} ${r} ${x} redirected non-idempotent request`);throw v.status=h.status,v}if(O===g)throw re(h),X(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let wt=h.headers?.get?.("location"),F;try{F=Qr(wt,x)}catch(v){throw re(h),v}let Q=!en(F,x);if(re(h),Q&&r==="POST"){let v=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw v.status=h.status,v}if(Q&&c){let v=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw v.status=h.status,v.retryable=!1,v}if(Q&&(P=Zr(P)),l)await W(F,{status:h.status});else if(Q){let v=await Be(F,N);if(!v.ok){let S=new Error(`HTTP redirect from ${x} ${v.error}`);throw S.status=h.status,S.retryable=!1,S}a&&v.addresses?.length&&(w||(w=await Ue(d?{importUndici:d}:{})),w&&(w.pin(new URL(F).hostname,v.addresses),k=w.fetch))}x=F;continue}if(typeof p=="function")try{await p(h,{url:x})}catch(C){throw re(h),X(C?.message||String(C))}let $=await cn(h,u,{url:x,onOversize:()=>y.abort()}),fe=ln($);if(!h.ok){let C=new Error(`HTTP ${h.status} ${r} ${x}`);throw C.status=h.status,C.retryAfter=h.headers?.get?.("retry-after")??null,C.body=fe??$.slice(0,300),C}return fe??$}throw new Error(`HTTP redirect loop for ${e}`)}catch(x){if(y.signal.aborted&&!Ve(m)){let P=x&&(typeof x=="object"||typeof x=="function")&&!z.isProxy(x)?x: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 h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw x}finally{clearTimeout(b),w&&await w.close()}}async function R(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&z.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 I=Object.getOwnPropertyDescriptor(t,S);if(!(S==="toJSON"&&I&&Object.hasOwn(I,"value")&&I.value===void 0)){if(!r.has(S))throw new TypeError("HTTP options contain unknown fields");if(!I||!I.enumerable||!Object.hasOwn(I,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=S=>{if(t==null||!Object.hasOwn(t,S))return;let I=Object.getOwnPropertyDescriptor(t,S);if(!I||!Object.hasOwn(I,"value"))throw new TypeError("HTTP options must contain own data properties");return I.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>ve))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ve}`);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??ve;for(let S of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let I=n(S);if(I!==void 0&&typeof I!="boolean")throw new TypeError(`HTTP ${S} must be boolean`)}let d=n("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(z.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ve(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let S of["importUndici","lookupFn","validateResponse"]){let I=n(S);if(I!==void 0&&typeof I!="function")throw new TypeError(`HTTP ${S} must be a function`)}let m=n("fetchImpl"),f=m||globalThis.fetch;if(typeof f!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let g=i??12e3,y=(o||"GET").toUpperCase(),b=n("headers"),E=Yr(b),w=Object.assign(Object.create(null),E);Object.keys(w).some(S=>S.toLowerCase()==="accept")||(w.Accept="application/json");let k=n("body");k!=null&&typeof k!="string"&&(Object.keys(w).find(I=>I.toLowerCase()==="content-type")||(w["Content-Type"]="application/json"),k=Xr(k));let N=s??jr,W=n("lookupFn"),x=!m,P=n("untrustedUrl")===!0,O=n("sameOriginRedirectsOnly")===!0,K=n("importUndici"),h=n("validateResponse"),$=p,fe=d??null,C=async()=>{let S;for(let I=0;I<=N;I++){$&&Vr.call($);try{return await un(e,{fetchImpl:f,method:y,headers:w,body:k,timeoutMs:g,lookupFn:W,realFetch:x,untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,importUndici:K,validateResponse:h,signal:$,redirectPolicy:u,maxRedirects:c})}catch(ee){S=ee;let ae=Me=>{if(!ee||typeof ee!="object"&&typeof ee!="function"||z.isProxy(ee))return;let me=Object.getOwnPropertyDescriptor(ee,Me);return me&&Object.hasOwn(me,"value")?me.value:void 0},Ce=ae("status"),Nr=ae("oracleTimeout")===!0||ae("name")==="AbortError"||ae("name")==="TimeoutError"||Ve($),_r=new Set([408,425,429]),Rr=ae("retryable")===!1?!1:Ce!=null?_r.has(Ce)||Hr.has(Ce)&&Et.has(y):!Nr&&Et.has(y);if(I===N||!Rr)throw ee;let yt=on(I,ae("retryAfter"));$?await new Promise((Me,me)=>{let Lr=setTimeout(Me,yt);Gr.call($,"abort",()=>{clearTimeout(Lr),me(Jr($)||new DOMException("Aborted","AbortError"))},{once:!0})}):await sn(yt)}}throw S};if(!(n("dedupe")!==!1&&!$&&Pt(y,k)))return C();let F=nn(y,e,w,{untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:O,redirectPolicy:u,maxRedirects:c,timeoutMs:g,retries:N,fetchImpl:Ae(f),realFetch:x,lookupFn:Ae(W),importUndici:Ae(K),validateResponse:Ae(h)},k),Q=ze.get(F);if(Q)return Q;let v=C().finally(()=>ze.delete(F));return ze.set(F,v),v}var Hr,Et,jr,kt,zr,qr,Vr,Gr,It,Ve,Jr,Wr,ve,Vo,j,ze,St,At,tn,rn,sn,B=M(()=>{xt();Hr=new Set([408,425,429,500,502,503,504]),Et=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),jr=2,kt=4e3,zr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,qr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Vr=AbortSignal.prototype.throwIfAborted,Gr=EventTarget.prototype.addEventListener,It=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ve=e=>e?zr.call(e):!1,Jr=e=>e?qr.call(e):void 0,Wr=new Set([301,302,303,307,308]),ve=3,Vo=64*1024,j=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});ze=new Map,St=new WeakMap,At=1;tn=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),rn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);sn=e=>new Promise(t=>setTimeout(t,e))});import{createHash as pn,createHmac as fn,timingSafeEqual as Xo}from"node:crypto";function Ge(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ge).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ge(e[r])}`).join(",")}}`}function Tt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Nt(e=process.env){return Tt(process.env)||Tt(e)}function wn(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function yn(e){let t=wn(e);return pn("sha256").update(Ge(t)).digest("hex")}function bn(e,t=Nt()){return t?fn("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+hn:Number(i),c=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||c<=0||c>gn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:l,expiresAt:u,prepareVersion:mn},m=yn(p),f=Nt(n),g=f?bn(m,f):void 0,y={...p,prepareHash:m};return g&&(y.prepareMac=g),y}var mn,hn,gn,ce=M(()=>{mn=2,hn=300*1e3,gn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{types as _t}from"node:util";function xn(e){if(!e||typeof e!="object"||_t.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Pe(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(_t.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]=Pe(s.value,t,r+1)}return o}if(!xn(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]=Pe(i.value,t,r+1)}return n}var Rt=M(()=>{});function In({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"?kn:En}async function ne(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=In(t);return Pe(await R(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function Je(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 En,kn,he=M(()=>{B();Rt();En="https://api.hyperliquid.xyz/info",kn="https://api.hyperliquid-testnet.xyz/info"});async function $t(e={}){let t=Date.now();if(ge.dexs&&t-ge.at<6e4&&!e.fetchImpl)return ge.dexs;let r=await ne({type:"perpDexs"},e);return ge={at:t,dexs:Array.isArray(r)?r:[]},ge.dexs}async function Ct(e="",t={}){let r=e||"",n=Date.now(),o=Lt.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 Lt.set(r,l),l}function vn(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return An[r]??t}function Oe(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=Dt+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function Mt(e,t){let r=We(e),n=We(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=Dt+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 We(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 Ke(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let u=e.coin==null?null:Oe(e.coin);if(e.coin!=null&&!u)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let c=e.outcome==null?null:Mt(e.outcome,0).outcome;if(c!=null&&u&&u.outcome!==c)throw new Error("hl-assets: coin does not match outcome");let d=e.outcomeSide==null?null:Pn(e.outcomeSide,"outcomeSide"),p=c??u?.outcome;if(e.outcome!=null&&e.coin==null&&d==null)throw new Error("hl-assets: outcomeSide required");let m=d??u?.side;if(m==null)throw new Error("hl-assets: outcomeSide required");if(p==null)throw new Error("hl-assets: outcome identity required");let f=Mt(p,m);if(u&&(u.outcome!==f.outcome||u.side!==f.side))throw new Error("hl-assets: coin does not match outcome side");let g=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:f.coin,assetId:f.assetId,encoding:f.encoding,outcome:f.outcome,side:f.side,szDecimals:g,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(":"),d=c.join(":");if(!u||!d)throw new Error(`hl-assets: bad builder coin ${r}`);let p=vn(u),m=await $t(t),f=m.findIndex(N=>N&&N.name===p);if(f<1)throw new Error(`hl-assets: unknown builder dex "${u}"`);let{universe:g,ctxs:y}=await Ct(p,t),b=g.findIndex(N=>N.name===`${p}:${d}`);if(b<0)throw new Error(`hl-assets: ${r} not in dex ${p} meta`);let E=g[b];if(E.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let w=Sn+f*1e4+b,k=y[b]||{};return{kind:"hip3",coin:E.name||r,assetId:w,szDecimals:E.szDecimals??0,maxLeverage:E.maxLeverage??null,dex:p,dexName:m[f]?.fullName||p,dexIndex:f,indexInMeta:b,markPx:k.markPx??null}}let{universe:n,ctxs:o}=await Ct("",t),i=r.toUpperCase(),s=n.findIndex(u=>u.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let u=await $t(t);for(let c=1;c<u.length;c++){let d=u[c];if(!d?.name)continue;let p=`${d.name}:${i}`;try{return await Ke({coin:p},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 Pn(e,t){let r=We(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var Dt,Sn,ge,Lt,An,Xe=M(()=>{he();Dt=1e8,Sn=1e5,ge={at:0,dexs:null},Lt=new Map;An=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 Ft(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 Ye(e,t="amount"){let r=oe(e,t);if(r<=0n)throw new Error(`${t} must be positive`);return r}function L(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 Te=M(()=>{});function Rn(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 Bt(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 Ln(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 $n(e,t,r){let n=Bt(e.s,"signed size"),o=Bt(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,a=L(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let l=L(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>l)throw new Error("hl: notional exceeds cap")}function Cn(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=Y(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Ft(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=L(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function Ut(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 Ht(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 Mn(e){let t=String(e||"").replace(/\/$/,"");if(!On.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Ze(e){return Oe(e)!=null}function Dn(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(Ze(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 Fn(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(Ze(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 jt(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=Y(r.kind,"kind",48),o=Nn[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=Mn(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!==_n[n])throw new Error("hl: action type must match kind");let a=r.notionalUsd??0;if(Tn.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let l=Y(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=Oe(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(Dn(l,t),Fn(l,u,t),n==="hip4-order"&&!Ze(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");Ln(r);let c=r.action.orders;if(n==="perp-bracket"){let d=r.takeProfitPx,p=r.stopLossPx,m=1+(d==null?0:1)+(p==null?0:1);if(m<2||c.length!==m||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");Ut(c[0],r,u);let f=1;d!=null&&Ht(c[f++],r,u,d,"tp"),p!=null&&Ht(c[f],r,u,p,"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");Ut(c[0],r,u)}$n(c[0],r,t),Cn(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 d=t.maxLeverage==null?50:t.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(c>d)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=Y(r.usd,"margin usd",64),d=L(c,6,"hl: margin usd");if(oe(r.action.ntli,"hl: signed margin ntli")!==d)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 m=L(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");a=Rn(f,6)}}if(n==="builder-fee-approval"){let l=Y(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(l))throw new Error("hl: builder address required");if(Y(r.action.builder,"signed builder",42).toLowerCase()!==l)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(f=>String(f).toLowerCase()):[]).includes(l))throw new Error("hl: builder not allowed");let c=Y(r.maxFeeRate,"maxFeeRate",32);if(Y(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 d=L(c.slice(0,-1),12,"hl: builder fee percent"),p=L(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let m=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==m||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 On,Tn,Nn,_n,Y,zt=M(()=>{Te();Xe();On=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),Tn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Nn=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"}),_n=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"}),Y=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function Un(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 qt(e,t={},r={}){let n=String(e?.kind||""),o=Bn[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:Un(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 jt(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 Bn,Vt=M(()=>{zt();Bn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as Hn,JsonRpcProvider as jn}from"ethers";function Wn(e){return Jn.test(String(e||""))}async function Qe(e,{contract:t=zn,rpc:r=Vn,chainId:n=qn,balanceOf:o}={}){if(!Wn(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new jn(r,n,{staticNetwork:!0}),s=new Hn(t,Gn,i);return BigInt(await s.balanceOf(e))}var zn,qn,Vn,Gn,Jn,et=M(()=>{zn="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",qn=999,Vn="https://rpc.hyperliquid.xyz/evm",Gn=["function balanceOf(address owner) view returns (uint256)"],Jn=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Kn,readFileSync as Xn,lstatSync as Yn}from"node:fs";import{homedir as Gt}from"node:os";import{join as tt}from"node:path";function Zn(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Jt])return String(e[Jt]);let t=e.ORACLE_CONFIG_DIR||tt(Gt(),".config","oracle");return tt(t,"fee-recipient")}return tt(Gt(),".config","oracle","fee-recipient")}function Wt(e=process.env){try{let t=Zn(e);if(!Kn(t)||Yn(t).isSymbolicLink())return"";let r=Xn(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var Ii,Jt,Kt=M(()=>{et();Ii=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),Jt="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var rr={};Cr(rr,{HL_BUILDER_ADDRESS_ENV:()=>Ne,HL_BUILDER_DEFAULT_FEE_BPS:()=>Qn,HL_BUILDER_FEE_ENV:()=>nt,HL_BUILDER_FEE_TIERS:()=>we,HL_BUILDER_MAX_FEE_BPS:()=>rt,HL_PERP_MAX_SIG_FIGS:()=>Xt,HL_PERP_PRICE_DECIMALS:()=>Yt,HL_SIGNATURE_CHAIN_ID:()=>_e,MARGIN_MODE:()=>ye,ORDER_TYPES:()=>_,TIF:()=>be,formatPerpPrice:()=>q,formatPerpSize:()=>tr,hlBuilderFeeBpsForKind:()=>er,hlPerpAssetInfo:()=>ue,hlPrepareApproveAgent:()=>ao,hlPrepareBracketOrder:()=>po,hlPrepareBuilderApproval:()=>so,hlPrepareCancelOrder:()=>co,hlPreparePerpOrder:()=>at,hlPrepareUpdateIsolatedMargin:()=>uo,hlPrepareUpdateLeverage:()=>lo,resolveBuilderFee:()=>it});function Zt(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 eo(e,t){let r=Zt(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function to(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 Qt(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 er(e="perp"){if(e==="perp"||e==="main")return we.perp;if(e==="spot")return we.spot;if(e==="hip3")return we.hip3;if(e==="outcome"||e==="hip4")return we.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function it({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[Ne]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${Ne} must be an EVM address`);let o=Wt(e);if(!o||o!==n)return null;let i=e?.[nt],s=er(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: ${nt} must be a positive number in 0.1 bps increments`);if(a>rt)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${rt} 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 ro(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 no(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||Qe;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function st(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 f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`: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 d=u.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function oo(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 st(n,s,r)}function q(e,t,r={}){let n=Yt-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return st(oo(e,Xt,r),n,r)}function tr(e,t){let r=st(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 io(e,t){let r=(c,d)=>{let p=String(c).trim();if(!/^\d+(?:\.\d+)?$/.test(p))throw new Error(`hl-perps: ${d} must be a positive decimal`);let[m,f=""]=p.split(".");return{raw:BigInt(m+f),decimals:f.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 Ke(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 ot(e,{tif:t=be.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case _.LIMIT:return{limit:{tif:t}};case _.MARKET:return{limit:{tif:be.IOC}};case _.STOP_MARKET:case _.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:q(r,o),tpsl:e===_.STOP_MARKET?"sl":"tp"}};case _.STOP_LIMIT:case _.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:q(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=qt(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 so(e={},t={}){let r=it({env:t.env});if(!r)throw new Error(`hl-perps: ${Ne} 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 ao(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 at(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=Qt(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=tr(e.size??e.sz,r.szDecimals),a;if(n===_.MARKET){let E=Number(r.markPx);if(!Number.isFinite(E)){let W=await Je(t);E=Number(W?.[r.coin]??W?.[String(r.assetId)]??NaN)}if(!Number.isFinite(E))throw new Error("hl-perps: no mark price available for a market order");let w=Number(e.maxSlippageBps??50);if(!Number.isInteger(w)||w<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(w>100)throw new Error(`hl-perps: maxSlippageBps ${w} exceeds the hard 100 bps cap`);let k=o?E*(1+w/1e4):E*(1-w/1e4);a=q(k,r.szDecimals,{roundDown:o});let N=Math.abs(Number(a)/E-1)*1e4;if(N>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${N.toFixed(2)} bps from mark, above the ${w} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=q(e.price??e.limitPx,r.szDecimals)}let l=ot(n,{tif:e.tif??(n===_.MARKET?be.IOC:be.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"},d=it({env:t.env,kind:r.kind}),p=await no(d,e,t),m=p.exempt?null:d,f=await ro(m,e,t),g=f.approved?m:null;g&&(c.builder=g.wire);let y=Number(e.nonce??Date.now()),b=io(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:b,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:g?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!g?{...d.disclosure,...f}:null,...ie(c,y,t)},e,t)}async function co(e={},t={}){let r=await ue(to(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=Zt(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 lo(e={},t={}){let r=await ue(e,t),n=eo(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||ye.CROSS).toLowerCase();if(o!==ye.CROSS&&o!==ye.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===ye.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 uo(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=L(o,6,"hl-perps: usd"),s=Qt(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 po(e={},t={}){let r=await at(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:q(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:ot(_.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:q(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:ot(_.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:q(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:q(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ie(s,Number(e.nonce??Date.now()),t)},e,t)}var Xt,Yt,_e,Qn,rt,Ne,nt,we,_,be,ye,ct=M(()=>{he();Xe();Te();ce();Vt();et();Kt();Xt=5,Yt=6,_e="0x66eee",Qn=2,rt=10,Ne="ORACLE_HL_BUILDER_ADDRESS",nt="ORACLE_HL_BUILDER_FEE_BPS",we=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"}),be=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),ye=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});B();var dn="https://yields.llama.fi";async function Ot(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||dn).replace(/\/$/,""),n=await R(`${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();he();var ai=24*365;ct();B();B();B();B();import{Interface as lt,getAddress as Qi,isAddress as es}from"ethers";B();var nr={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}},Bi=new Map(Object.values(nr).map(e=>[e.chainId,e]));import{Interface as fo,getAddress as Ji}from"ethers";var Wi=new fo(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ce();var or=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),os=Object.freeze({42161:{name:"arbitrum",api:or[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:or[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var is=`0x${"0".repeat(64)}`,ss=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),as=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),cs=new lt(["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"]),ls=new lt(["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)"]),us=new lt(["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)"]),ds=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});B();B();ce();Te();var mo=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),xe=14,ir=(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 ut(e){let t=String(e||"").replace(/\/$/,"");if(!mo.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function sr(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=ir(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=ut(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=ir(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=Ye(r.baseAmount,"lighter: baseAmount"),d=Ye(r.price,"lighter: price");if(c>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(c),m=Number(d),f=Number(r.sizeDecimals??0),g=Number(r.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(g)||g<0||g>12)throw new Error("lighter: priceDecimals required");let y=f+g,b=c*d,E=L(r.notionalUsd,y,"lighter: notionalUsd");if(E<=0n)throw new Error("lighter: notionalUsd required");if(b!==E)throw new Error("lighter: notionalUsd must match size and price");let w=L(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,y,"lighter: maxNotionalUsd");if(b>w)throw new Error("lighter: notional exceeds cap");let k=T(r.notionalUsd,"lighter: notionalUsd");return pe(r.txType,xe,"txType"),Object.freeze({unit:"usd",value:String(k),notional:String(k),fee:"0",kind:n,symbol:l,marketIndex:i,side:r.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(k)})}function ho(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 ar(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=ut(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:ho(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??xe,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return sr(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}function cr(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Le(e={},t,r){let n=String(t||""),o=cr(e);if(o){let s=Ee(o[n]);if(s==null)throw new Error(`${r}: held spot required for ${n}`);return s}let i=Ee(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${r}: prepare requires spotSize of held spot`);return i}function $e(e={},t=[],r){let n=cr(e);if(t.length>1){if(!n)throw new Error(`${r}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Ee(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(n){let o=t[0];if(o&&Ee(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(Ee(e.spotSize??e.spotHeldSize)==null)throw new Error(`${r}: live loop requires spotSize of held spot`)}var dt=Number.MAX_SAFE_INTEGER,Re=String(dt);function Ee(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=dt?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,r=""]=e.split(".");if(t.length>Re.length||t.length===Re.length&&t>Re||t===Re&&/[1-9]/.test(r))return null;let n=Number(e);return Number.isFinite(n)&&n>0&&n<=dt?n:null}var ur="https://mainnet.zklighter.elliot.ai",dr="https://testnet.zklighter.elliot.ai";function go(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?dr:ur}function Z(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function wo(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 pr(e){let t=Z(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function yo(e,t,r=4){let n=Z(e),o=Z(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 lr(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function fr(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=lr(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of r){if(String(s.exchange||"")!=="lighter")continue;let a=lr(s.market_id);if(a==null)continue;let l=o.get(a),u=Z(l?.mark_price??l?.index_price),c=Z(s.rate),d=String(s.symbol||l?.symbol||"").trim();!d||c==null||!(u>0)||i.push({coin:d,symbol:d,marketIndex:a,funding:c,markPx:u,openInterest:Z(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:pr(c)})}return i}function mr(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let r=Z(e.funding);if(r==null)throw new Error("lighter: funding required");let n=pr(r),o=r>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Z(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?yo(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 hr(e={}){let t=go(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,i]=await Promise.all([R(`${t}/api/v1/funding-rates`,n),R(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:i}}catch(o){throw r.abort(o),o}}async function pt(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:n,books:o}=await hr(t),i=fr(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 ft(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 hr(t),s=fr(o,i).find(a=>a.symbol===r);if(!s)throw new Error(`lighter: ${r} not in Lighter funding`);return mr(s,n)}async function bo(e={},t={}){wr(e,t,"lighter");let r=yr(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 ft(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=Le(e,o.coin,"lighter");if(!gr.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=wo(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:xe,submitTo:`${a?dr:ur}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=ar(c,{...e,maxNotionalUsd:r},t)}catch(f){p=String(f?.message||f).slice(0,200)}return D({...c,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var gr=/^0x[0-9a-fA-F]{40}$/;function wr(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 xo(e,t,r){wr(e,t,r)}function Eo(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=yr(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"&&$e(e,r,"lighter"),t==="live"&&!gr.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 yr(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 br(e={},t={}){xo(e,t,"lighter");let r=Eo(e),n=await pt({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=mr(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 bo({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 ko=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);var ke=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."}]),Io={"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."},So={"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."},Ao={"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 V(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function vo(e){let t=V(e.symbol,"").toUpperCase(),r=V(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 Po(e,t){let r=se(e.tvlUsd)??0,n=V(e.ilRisk,"").toLowerCase(),o=V(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 Oo(e){let t=vo(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=Po(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,d=c<1?"Avoid":r>80||i<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",p=V(e.project),m=V(e.symbol),f=V(e.chain);return{id:V(e.pool,`${f}:${p}:${m}`),recipe:t,label:`${p} ${m}`,chain:f,project:p,symbol:m,tvlUsd:i,rewardApr:o,nativeApr:n,estimatedBorrowApr:a,estimatedFundingApr:l,gasApr:u,riskHaircut:s,netApr:c,verdict:d,exposure:V(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:Io[t],monitor:So[t],prepareSteps:[`Verify ${p} contracts and reward terms on ${f}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Ao[t]],source:"DeFiLlama yields"}}async function xr(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),n=Number(e.minTvl??2e6),o=new Date().toISOString(),i="read-only discovery and prepare-plan design; no signing or broadcast";try{let s=await Ot({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),a=Array.isArray(s?.data)?s.data:[],l=a.map(Oo).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 Er(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),d=r*t*4.33,p=d*i,m=n*4.33*o,f=p+m+s,g=Math.max(0,1-c*.015),y=t*a*l,b=y*(1-u)*g,E=b-f,w=f>0?E/f*100:null,k=t*a>0?f/(t*a*(1-u)*(g||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:d,monthlyGas:p,laborMonthly:m,monthlyCost:f,lockupDiscount:g,grossExpectedValue:y,adjustedExpectedValue:b,netExpectedValue:E,roiPct:w,breakevenProbabilityPct:k,verdict:E>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}he();ce();function G(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function kr(e){let t=G(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function To(e,t,r=4){let n=G(e),o=G(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 Ir(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=G(s.funding),u=G(s.markPx??s.oraclePx),c=G(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:G(s.oraclePx),openInterest:c,fundingAprPct:kr(l)})}return n}function Sr(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let r=G(e.funding);if(r==null)throw new Error("hl-delta-neutral: funding required");let n=kr(r),o=r>0,i={coin:e.coin,notionalUsd:G(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?To(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 mt(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=Ir(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 ht(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=Ir(o).find(s=>s.coin===r);if(!i)throw new Error(`hl-delta-neutral: ${r} not in Hyperliquid meta`);return Sr(i,n)}async function No(e={},t={}){vr(e,t,"hl-delta-neutral");let r=Pr(e.maxNotionalUsd??25e3,"hl-delta-neutral"),n=await ht(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=Le(e,n.coin,"hl-delta-neutral");if(!Ar.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(()=>(ct(),rr)),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 Ar=/^0x[0-9a-fA-F]{40}$/;function vr(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 _o(e,t,r){vr(e,t,r)}function Ro(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=Pr(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"&&$e(e,r,"hl-delta-neutral"),t==="live"&&!Ar.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 Pr(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 Or(e={},t={}){_o(e,t,"hl-delta-neutral");let r=Ro(e),n=await mt({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=Sr(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 No({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 gt=`oracle farm <methods|discover|airdrop|carry|loop|lighter> [options]
|
|
1
|
+
var Mr=Object.defineProperty;var M=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Dr=(e,t)=>{for(var r in t)Mr(e,r,{get:t[r],enumerable:!0})};import te from"node:net";import Fr from"node:dns";function ve(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let d=c.split(":"),p=d.at(-1);if(p?.includes(".")){let m=p.split(".").map(Number);if(m.length!==4||m.some(f=>!Number.isInteger(f)||f<0||f>255))return null;d.splice(d.length-1,1,(m[0]<<8|m[1]).toString(16),(m[2]<<8|m[3]).toString(16))}return d.some(m=>!/^[0-9a-f]{1,4}$/.test(m))?null:d.map(m=>Number.parseInt(m,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 Be(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 Ue(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=ve(e);if(!t)return!1;let r=ve("::ffff:0:0");return Be(t,r,96)?Ue([...t.slice(12)].join(".")):Be(t,ve("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Be(t,ve(o),i)):!1}return!1}function Ur(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(Br.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=te.isIP(r);return n!==0&&!Ue(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function He(e,{lookupFn:t=Fr.promises.lookup}={}){let r=Ur(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;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=>!Ue(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function je({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let d=await t();r=d.Agent,n=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(te.isIPv6(p.address)?6:4)})),a=(d,p,m)=>{i.set(o(d),s(typeof p=="string"?[{address:p,family:m}]:p))},l=d=>{let p=o(d);if(te.isIP(p))return[{address:p,family:te.isIPv6(p)?6:4}];let m=i.get(p);if(!m||!m.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return m},u=new r({connect:{lookup(d,p,m){let f;try{f=l(d)}catch(g){return m(g)}return p?.all?m(null,f):m(null,f[0].address,f[0].family)}}}),c=Hr((d,p={})=>n(d,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:c,pin:a,resolve:l,async close(){try{await u.destroy()}catch{}}}}function Hr(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[ze]=Object.freeze({pin:t}),e}function qe(e){return typeof e=="function"&&typeof e[ze]?.pin=="function"}function Et(e,t,r){if(!qe(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ze].pin(t,r)}var Br,ze,kt=M(()=>{Br=new Set(["localhost","metadata.google.internal","metadata.goog"]);ze=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as jr}from"node:crypto";import{types as z}from"node:util";function S(e){return X(`HTTP JSON body refused: ${e}`)}function Yr(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 z[t]=="function"&&z[t](e))}function Zr(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,a=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>j.bytes)throw S("serialized byte limit exceeded");t.push(c)},l=c=>{if(Buffer.byteLength(c,"utf8")>j.bytes)throw S("serialized byte limit exceeded");return JSON.stringify(c)},u=(c,d)=>{if(n+=1,n>j.nodes)throw S("node limit exceeded");if(d>j.depth)throw S("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 S("non-finite number");a(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw S("unsupported non-JSON value");if(z.isProxy(c))throw S("proxy value");if(Yr(c))throw S("unsupported exotic object");if(s.has(c))throw S("cyclic value");s.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw S("symbol-keyed fields are unsupported");if(Array.isArray(c)){let f=Object.getPrototypeOf(c),g=0;for(;f!==null;){if(z.isProxy(f))throw S("proxy array prototype");if(g+=1,g>j.depth)throw S("array prototype depth limit exceeded");f=Object.getPrototypeOf(f)}if(c.length>j.arrayLength)throw S("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 S("array entries must be dense enumerable own data")}let w=0;for(let y in c){if(i+=1,i>j.fields)throw S("enumeration limit exceeded");if(Object.hasOwn(c,y)&&(w+=1,w>c.length))throw S("named array fields are unsupported")}if(w!==c.length)throw S("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,d+1);a("]");return}let p=Object.getPrototypeOf(c);if(p!==Object.prototype&&p!==null)throw S("non-plain object");let m=[];for(let f in c){if(i+=1,i>j.fields)throw S("enumeration limit exceeded");if(!Object.hasOwn(c,f))continue;if(o+=1,o>j.fields)throw S("field limit exceeded");let g=Object.getOwnPropertyDescriptor(c,f);if(!g||!Object.hasOwn(g,"value")||g.enumerable!==!0)throw S("object fields must be enumerable own data");m.push([f,g.value])}a("{");for(let f=0;f<m.length;f+=1)f&&a(","),a(l(m[f][0])),a(":"),u(m[f][1],d+1);a("}")}finally{s.delete(c)}};return u(e,0),t.join("")}function Qr(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(z.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 en(){return Object.assign(Object.create(null),{Accept:"application/json"})}function tn(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 rn(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Pe(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Pt.get(e);return t||(t=Tt,Tt+=1,Pt.set(e,t)),`reference:${t}`}function Ot(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?nn.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 Nt(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(Ot);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Ot(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&on.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function sn(e,t,r,n={},o=null){let i=jr("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 an(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,St):Math.min(250*2**e,St)+Math.floor(Math.random()*100)}function X(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ge(e,t,r){return X(`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 ln(e){return e?e.byteLength??e.length??0:0}async function un(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 Ge(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!n)throw Ge(r,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],l=0,u=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),l+=ln(d),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 Ge(r,`streamed ${l} bytes`,t);let c=Buffer.concat(a);return(u?c.subarray(0,t):c).toString("utf8")}function dn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function pn(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:d,validateResponse:p,signal:m,redirectPolicy:f="follow",maxRedirects:g=Te}){let w=null,y=t,b=s?{lookupFn:s}:{};if(l&&!a&&!qe(y))throw X(`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=m?vt?vt([m,x.signal]):m:x.signal,W=async(E,{status:P=null}={})=>{let T=await He(E,b);if(!T.ok)throw X(P==null?`HTTP refused ${E}: ${T.error}`:`HTTP redirect to ${E} ${T.error}`,P==null?{}:{status:P});let K=new URL(E).hostname;if(a){if(w&&(await w.close(),w=null),!w)try{w=await je({requireUndici:!0,...d?{importUndici:d}:{}})}catch(h){throw X(P==null?`HTTP refused ${E}: ${h?.message||h}`:`HTTP redirect to ${E} refused: ${h?.message||h}`,P==null?{}:{status:P})}w.pin(K,T.addresses),y=w.fetch}else Et(y,K,T.addresses);return T};try{let E=String(e),P=Object.assign(Object.create(null),n||{});l&&await W(E);for(let T=0;T<=g;T+=1){let K=Object.assign(Object.create(null),{method:r,headers:P,body:o,signal:R,redirect:"manual",dispatcher:void 0}),h=await y(E,K);if((f==="error"||g===0)&&h.status>=300&&h.status<400)throw re(h),X(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(Xr.has(h.status)){let C=c===!0&&r==="POST"&&[307,308].includes(h.status)&&Nt(r,o);if(r!=="GET"&&r!=="HEAD"&&!C){re(h);let v=new Error(`HTTP ${h.status} ${r} ${E} redirected non-idempotent request`);throw v.status=h.status,v}if(T===g)throw re(h),X(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let yt=h.headers?.get?.("location"),F;try{F=tn(yt,E)}catch(v){throw re(h),v}let Q=!rn(F,E);if(re(h),Q&&r==="POST"){let v=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw v.status=h.status,v}if(Q&&c){let v=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw v.status=h.status,v.retryable=!1,v}if(Q&&(P=en(P)),l)await W(F,{status:h.status});else if(Q){let v=await He(F,b);if(!v.ok){let I=new Error(`HTTP redirect from ${E} ${v.error}`);throw I.status=h.status,I.retryable=!1,I}a&&v.addresses?.length&&(w||(w=await je(d?{importUndici:d}:{})),w&&(w.pin(new URL(F).hostname,v.addresses),y=w.fetch))}E=F;continue}if(typeof p=="function")try{await p(h,{url:E})}catch(C){throw re(h),X(C?.message||String(C))}let N=await un(h,u,{url:E,onOversize:()=>x.abort()}),fe=dn(N);if(!h.ok){let C=new Error(`HTTP ${h.status} ${r} ${E}`);throw C.status=h.status,C.retryAfter=h.headers?.get?.("retry-after")??null,C.body=fe??N.slice(0,300),C}return fe??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(E){if(x.signal.aborted&&!ge(m)){let P=E&&(typeof E=="object"||typeof E=="function")&&!z.isProxy(E)?E:null,T=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(T&&Object.hasOwn(T,"value")&&T.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 h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw E}finally{clearTimeout(A),w&&await w.close()}}async function L(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&z.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 I of Object.getOwnPropertyNames(t)){let k=Object.getOwnPropertyDescriptor(t,I);if(!(I==="toJSON"&&k&&Object.hasOwn(k,"value")&&k.value===void 0)){if(!r.has(I))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=I=>{if(t==null||!Object.hasOwn(t,I))return;let k=Object.getOwnPropertyDescriptor(t,I);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>Te))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Te}`);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??Te;for(let I of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let k=n(I);if(k!==void 0&&typeof k!="boolean")throw new TypeError(`HTTP ${I} must be boolean`)}let d=n("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(z.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ge(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let I of["importUndici","lookupFn","validateResponse"]){let k=n(I);if(k!==void 0&&typeof k!="function")throw new TypeError(`HTTP ${I} must be a function`)}let m=n("fetchImpl"),f=m||globalThis.fetch;if(typeof f!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let g=i??12e3,w=(o||"GET").toUpperCase(),y=n("headers"),b=Qr(y),x=Object.assign(Object.create(null),b);Object.keys(x).some(I=>I.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=Zr(A));let R=s??qr,W=n("lookupFn"),E=!m,P=n("untrustedUrl")===!0,T=n("sameOriginRedirectsOnly")===!0,K=n("importUndici"),h=n("validateResponse"),N=p,fe=d??null,C=async()=>{let I;for(let k=0;k<=R;k++){N&&Jr.call(N);try{return await pn(e,{fetchImpl:f,method:w,headers:x,body:A,timeoutMs:g,lookupFn:W,realFetch:E,untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:T,importUndici:K,validateResponse:h,signal:N,redirectPolicy:u,maxRedirects:c})}catch(ee){I=ee;let ae=Fe=>{if(!ee||typeof ee!="object"&&typeof ee!="function"||z.isProxy(ee))return;let me=Object.getOwnPropertyDescriptor(ee,Fe);return me&&Object.hasOwn(me,"value")?me.value:void 0},De=ae("status"),Lr=ae("oracleTimeout")===!0||ae("name")==="AbortError"||ae("name")==="TimeoutError"||ge(N),$r=new Set([408,425,429]),Cr=ae("retryable")===!1?!1:De!=null?$r.has(De)||zr.has(De)&&It.has(w):!Lr&&It.has(w);if(k===R||!Cr)throw ee;let bt=an(k,ae("retryAfter"));N?await new Promise((Fe,me)=>{let xt,he=()=>{clearTimeout(xt),At.call(N,"abort",he),me(Kr(N)||new DOMException("Aborted","AbortError"))};if(ge(N)){he();return}xt=setTimeout(()=>{At.call(N,"abort",he),Fe()},bt),Wr.call(N,"abort",he,{once:!0}),ge(N)&&he()}):await cn(bt)}}throw I};if(!(n("dedupe")!==!1&&!N&&Nt(w,A)))return C();let F=sn(w,e,x,{untrustedUrl:P,maxResponseBytes:fe,sameOriginRedirectsOnly:T,redirectPolicy:u,maxRedirects:c,timeoutMs:g,retries:R,fetchImpl:Pe(f),realFetch:E,lookupFn:Pe(W),importUndici:Pe(K),validateResponse:Pe(h)},A),Q=Ve.get(F);if(Q)return Q;let v=C().finally(()=>Ve.delete(F));return Ve.set(F,v),v}var zr,It,qr,St,Vr,Gr,Jr,Wr,At,vt,ge,Kr,Xr,Te,Jo,j,Ve,Pt,Tt,nn,on,cn,B=M(()=>{kt();zr=new Set([408,425,429,500,502,503,504]),It=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),qr=2,St=4e3,Vr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Gr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Jr=AbortSignal.prototype.throwIfAborted,Wr=EventTarget.prototype.addEventListener,At=EventTarget.prototype.removeEventListener,vt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ge=e=>e?Vr.call(e):!1,Kr=e=>e?Gr.call(e):void 0,Xr=new Set([301,302,303,307,308]),Te=3,Jo=64*1024,j=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ve=new Map,Pt=new WeakMap,Tt=1;nn=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),on=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);cn=e=>new Promise(t=>setTimeout(t,e))});import{createHash as mn,createHmac as hn,timingSafeEqual as Zo}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 Rt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Lt(e=process.env){return Rt(process.env)||Rt(e)}function bn(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function xn(e){let t=bn(e);return mn("sha256").update(Je(t)).digest("hex")}function En(e,t=Lt()){return t?hn("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+wn:Number(i),c=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||c<=0||c>yn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:l,expiresAt:u,prepareVersion:gn},m=xn(p),f=Lt(n),g=f?En(m,f):void 0,w={...p,prepareHash:m};return g&&(w.prepareMac=g),w}var gn,wn,yn,ce=M(()=>{gn=2,wn=300*1e3,yn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{types as $t}from"node:util";function kn(e){if(!e||typeof e!="object"||$t.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Oe(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($t.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]=Oe(s.value,t,r+1)}return o}if(!kn(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]=Oe(i.value,t,r+1)}return n}var Ct=M(()=>{});function An({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"?Sn:In}async function ne(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=An(t);return Oe(await L(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"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 In,Sn,we=M(()=>{B();Ct();In="https://api.hyperliquid.xyz/info",Sn="https://api.hyperliquid-testnet.xyz/info"});async function Dt(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 Ft(e="",t={}){let r=e||"",n=Date.now(),o=Mt.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 Mt.set(r,l),l}function Tn(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return Pn[r]??t}function Ne(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=Ut+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function Bt(e,t){let r=Ke(e),n=Ke(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=Ut+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 Ke(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 Xe(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let u=e.coin==null?null:Ne(e.coin);if(e.coin!=null&&!u)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let c=e.outcome==null?null:Bt(e.outcome,0).outcome;if(c!=null&&u&&u.outcome!==c)throw new Error("hl-assets: coin does not match outcome");let d=e.outcomeSide==null?null:On(e.outcomeSide,"outcomeSide"),p=c??u?.outcome;if(e.outcome!=null&&e.coin==null&&d==null)throw new Error("hl-assets: outcomeSide required");let m=d??u?.side;if(m==null)throw new Error("hl-assets: outcomeSide required");if(p==null)throw new Error("hl-assets: outcome identity required");let f=Bt(p,m);if(u&&(u.outcome!==f.outcome||u.side!==f.side))throw new Error("hl-assets: coin does not match outcome side");let g=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:f.coin,assetId:f.assetId,encoding:f.encoding,outcome:f.outcome,side:f.side,szDecimals:g,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(":"),d=c.join(":");if(!u||!d)throw new Error(`hl-assets: bad builder coin ${r}`);let p=Tn(u),m=await Dt(t),f=m.findIndex(R=>R&&R.name===p);if(f<1)throw new Error(`hl-assets: unknown builder dex "${u}"`);let{universe:g,ctxs:w}=await Ft(p,t),y=g.findIndex(R=>R.name===`${p}:${d}`);if(y<0)throw new Error(`hl-assets: ${r} not in dex ${p} meta`);let b=g[y];if(b.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let x=vn+f*1e4+y,A=w[y]||{};return{kind:"hip3",coin:b.name||r,assetId:x,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:p,dexName:m[f]?.fullName||p,dexIndex:f,indexInMeta:y,markPx:A.markPx??null}}let{universe:n,ctxs:o}=await Ft("",t),i=r.toUpperCase(),s=n.findIndex(u=>u.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let u=await Dt(t);for(let c=1;c<u.length;c++){let d=u[c];if(!d?.name)continue;let p=`${d.name}:${i}`;try{return await Xe({coin:p},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 On(e,t){let r=Ke(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var Ut,vn,ye,Mt,Pn,Ye=M(()=>{we();Ut=1e8,vn=1e5,ye={at:0,dexs:null},Mt=new Map;Pn=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function O(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 Ht(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=O(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 Ze(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=O(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 _e=M(()=>{});function $n(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=O(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 Cn(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 Mn(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=$(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 Dn(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=Y(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Ht(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 zt(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(O(e.s,"hl: signed size")!==O(t.size,"hl: size"))throw new Error("hl: signed size must match");if(O(e.p,"hl: signed price")!==O(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 qt(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(O(e.s,"hl: bracket protection size")!==O(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(O(e.p,"hl: bracket protection price")!==O(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(O(i.triggerPx,"hl: triggerPx")!==O(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function Fn(e){let t=String(e||"").replace(/\/$/,"");if(!Nn.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Qe(e){return Ne(e)!=null}function Bn(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(Qe(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 Un(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(Qe(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 Vt(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=Y(r.kind,"kind",48),o=Rn[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=Fn(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!==Ln[n])throw new Error("hl: action type must match kind");let a=r.notionalUsd??0;if(_n.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let l=Y(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=Ne(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(Bn(l,t),Un(l,u,t),n==="hip4-order"&&!Qe(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");Cn(r);let c=r.action.orders;if(n==="perp-bracket"){let d=r.takeProfitPx,p=r.stopLossPx,m=1+(d==null?0:1)+(p==null?0:1);if(m<2||c.length!==m||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");zt(c[0],r,u);let f=1;d!=null&&qt(c[f++],r,u,d,"tp"),p!=null&&qt(c[f],r,u,p,"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");zt(c[0],r,u)}Mn(c[0],r,t),Dn(r,t),a=O(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 d=t.maxLeverage==null?50:t.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(c>d)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=Y(r.usd,"margin usd",64),d=$(c,6,"hl: margin usd");if(oe(r.action.ntli,"hl: signed margin ntli")!==d)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 m=$(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");a=$n(f,6)}}if(n==="builder-fee-approval"){let l=Y(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(l))throw new Error("hl: builder address required");if(Y(r.action.builder,"signed builder",42).toLowerCase()!==l)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(f=>String(f).toLowerCase()):[]).includes(l))throw new Error("hl: builder not allowed");let c=Y(r.maxFeeRate,"maxFeeRate",32);if(Y(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 d=$(c.slice(0,-1),12,"hl: builder fee percent"),p=$(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let m=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==m||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 Nn,_n,Rn,Ln,Y,Gt=M(()=>{_e();Ye();Nn=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),_n=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Rn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),Ln=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"}),Y=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function jn(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 Jt(e,t={},r={}){let n=String(e?.kind||""),o=Hn[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:jn(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 Vt(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 Hn,Wt=M(()=>{Gt();Hn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as zn,JsonRpcProvider as qn}from"ethers";function Xn(e){return Kn.test(String(e||""))}async function et(e,{contract:t=Vn,rpc:r=Jn,chainId:n=Gn,balanceOf:o}={}){if(!Xn(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new qn(r,n,{staticNetwork:!0}),s=new zn(t,Wn,i);return BigInt(await s.balanceOf(e))}var Vn,Gn,Jn,Wn,Kn,tt=M(()=>{Vn="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Gn=999,Jn="https://rpc.hyperliquid.xyz/evm",Wn=["function balanceOf(address owner) view returns (uint256)"],Kn=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Yn,readFileSync as Zn,lstatSync as Qn}from"node:fs";import{homedir as Kt}from"node:os";import{join as rt}from"node:path";function eo(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Xt])return String(e[Xt]);let t=e.ORACLE_CONFIG_DIR||rt(Kt(),".config","oracle");return rt(t,"fee-recipient")}return rt(Kt(),".config","oracle","fee-recipient")}function Yt(e=process.env){try{let t=eo(e);if(!Yn(t)||Qn(t).isSymbolicLink())return"";let r=Zn(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var Ai,Xt,Zt=M(()=>{tt();Ai=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),Xt="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var ir={};Dr(ir,{HL_BUILDER_ADDRESS_ENV:()=>Re,HL_BUILDER_DEFAULT_FEE_BPS:()=>to,HL_BUILDER_FEE_ENV:()=>ot,HL_BUILDER_FEE_TIERS:()=>be,HL_BUILDER_MAX_FEE_BPS:()=>nt,HL_PERP_MAX_SIG_FIGS:()=>Qt,HL_PERP_PRICE_DECIMALS:()=>er,HL_SIGNATURE_CHAIN_ID:()=>Le,MARGIN_MODE:()=>xe,ORDER_TYPES:()=>_,TIF:()=>Ee,formatPerpPrice:()=>q,formatPerpSize:()=>or,hlBuilderFeeBpsForKind:()=>nr,hlPerpAssetInfo:()=>ue,hlPrepareApproveAgent:()=>lo,hlPrepareBracketOrder:()=>mo,hlPrepareBuilderApproval:()=>co,hlPrepareCancelOrder:()=>uo,hlPreparePerpOrder:()=>ct,hlPrepareUpdateIsolatedMargin:()=>fo,hlPrepareUpdateLeverage:()=>po,resolveBuilderFee:()=>st});function tr(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 ro(e,t){let r=tr(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function no(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 rr(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 nr(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 st({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[Re]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${Re} must be an EVM address`);let o=Yt(e);if(!o||o!==n)return null;let i=e?.[ot],s=nr(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: ${ot} must be a positive number in 0.1 bps increments`);if(a>nt)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${nt} 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 oo(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 io(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||et;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function at(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 f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`: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 d=u.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function so(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 at(n,s,r)}function q(e,t,r={}){let n=er-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return at(so(e,Qt,r),n,r)}function or(e,t){let r=at(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 ao(e,t){let r=(c,d)=>{let p=String(c).trim();if(!/^\d+(?:\.\d+)?$/.test(p))throw new Error(`hl-perps: ${d} must be a positive decimal`);let[m,f=""]=p.split(".");return{raw:BigInt(m+f),decimals:f.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 Xe(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 it(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:q(r,o),tpsl:e===_.STOP_MARKET?"sl":"tp"}};case _.STOP_LIMIT:case _.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:q(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:Le,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=Jt(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 co(e={},t={}){let r=st({env:t.env});if(!r)throw new Error(`hl-perps: ${Re} 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:Le,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 lo(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:Le,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 ct(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=rr(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=or(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=q(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=q(e.price??e.limitPx,r.szDecimals)}let l=it(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"},d=st({env:t.env,kind:r.kind}),p=await io(d,e,t),m=p.exempt?null:d,f=await oo(m,e,t),g=f.approved?m:null;g&&(c.builder=g.wire);let w=Number(e.nonce??Date.now()),y=ao(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:g?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!g?{...d.disclosure,...f}:null,...ie(c,w,t)},e,t)}async function uo(e={},t={}){let r=await ue(no(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=tr(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 po(e={},t={}){let r=await ue(e,t),n=ro(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 fo(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=rr(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 mo(e={},t={}){let r=await ct(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:q(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:it(_.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:q(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:it(_.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:q(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:q(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ie(s,Number(e.nonce??Date.now()),t)},e,t)}var Qt,er,Le,to,nt,Re,ot,be,_,Ee,xe,lt=M(()=>{we();Ye();_e();ce();Wt();tt();Zt();Qt=5,er=6,Le="0x66eee",to=2,nt=10,Re="ORACLE_HL_BUILDER_ADDRESS",ot="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 fn="https://yields.llama.fi";async function _t(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||fn).replace(/\/$/,""),n=await L(`${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 li=24*365;lt();B();B();B();B();import{Interface as ut,getAddress as ts,isAddress as rs}from"ethers";B();var sr={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}},Hi=new Map(Object.values(sr).map(e=>[e.chainId,e]));import{Interface as ho,getAddress as Ki}from"ethers";var Xi=new ho(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ce();var ar=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),ss=Object.freeze({42161:{name:"arbitrum",api:ar[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:ar[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var as=`0x${"0".repeat(64)}`,cs=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),ls=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),us=new ut(["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"]),ds=new ut(["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 ut(["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)"]),fs=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});B();B();ce();_e();var go=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ke=14,cr=(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 dt(e){let t=String(e||"").replace(/\/$/,"");if(!go.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function lr(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=cr(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=dt(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=cr(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=Ze(r.baseAmount,"lighter: baseAmount"),d=Ze(r.price,"lighter: price");if(c>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(c),m=Number(d),f=Number(r.sizeDecimals??0),g=Number(r.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(g)||g<0||g>12)throw new Error("lighter: priceDecimals required");let w=f+g,y=c*d,b=$(r.notionalUsd,w,"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,w,"lighter: maxNotionalUsd");if(y>x)throw new Error("lighter: notional exceeds cap");let A=O(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:p,price:m,submitTo:o,actionType:"create-order",amount:String(A)})}function wo(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 ur(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=dt(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:wo(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 lr(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}function dr(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Ce(e={},t,r){let n=String(t||""),o=dr(e);if(o){let s=Ie(o[n]);if(s==null)throw new Error(`${r}: held spot required for ${n}`);return s}let i=Ie(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${r}: prepare requires spotSize of held spot`);return i}function Me(e={},t=[],r){let n=dr(e);if(t.length>1){if(!n)throw new Error(`${r}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Ie(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(n){let o=t[0];if(o&&Ie(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(Ie(e.spotSize??e.spotHeldSize)==null)throw new Error(`${r}: live loop requires spotSize of held spot`)}var pt=Number.MAX_SAFE_INTEGER,$e=String(pt);function Ie(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=pt?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,r=""]=e.split(".");if(t.length>$e.length||t.length===$e.length&&t>$e||t===$e&&/[1-9]/.test(r))return null;let n=Number(e);return Number.isFinite(n)&&n>0&&n<=pt?n:null}var fr="https://mainnet.zklighter.elliot.ai",mr="https://testnet.zklighter.elliot.ai";function yo(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?mr:fr}function Z(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function bo(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 hr(e){let t=Z(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function xo(e,t,r=4){let n=Z(e),o=Z(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 pr(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function gr(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=pr(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of r){if(String(s.exchange||"")!=="lighter")continue;let a=pr(s.market_id);if(a==null)continue;let l=o.get(a),u=Z(l?.mark_price??l?.index_price),c=Z(s.rate),d=String(s.symbol||l?.symbol||"").trim();!d||c==null||!(u>0)||i.push({coin:d,symbol:d,marketIndex:a,funding:c,markPx:u,openInterest:Z(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:hr(c)})}return i}function wr(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let r=Z(e.funding);if(r==null)throw new Error("lighter: funding required");let n=hr(r),o=r>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Z(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?xo(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 yr(e={}){let t=yo(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,i]=await Promise.all([L(`${t}/api/v1/funding-rates`,n),L(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:i}}catch(o){throw r.abort(o),o}}async function ft(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:n,books:o}=await yr(t),i=gr(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 mt(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 yr(t),s=gr(o,i).find(a=>a.symbol===r);if(!s)throw new Error(`lighter: ${r} not in Lighter funding`);return wr(s,n)}async function Eo(e={},t={}){xr(e,t,"lighter");let r=Er(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 mt(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=Ce(e,o.coin,"lighter");if(!br.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=bo(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?mr:fr}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=ur(c,{...e,maxNotionalUsd:r},t)}catch(f){p=String(f?.message||f).slice(0,200)}return D({...c,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var br=/^0x[0-9a-fA-F]{40}$/;function xr(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 ko(e,t,r){xr(e,t,r)}function Io(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=Er(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"&&Me(e,r,"lighter"),t==="live"&&!br.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 Er(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 kr(e={},t={}){ko(e,t,"lighter");let r=Io(e),n=await ft({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=wr(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 Eo({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 So=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);var Se=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."}]),Ao={"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."},vo={"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."},Po={"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 V(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function To(e){let t=V(e.symbol,"").toUpperCase(),r=V(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 Oo(e,t){let r=se(e.tvlUsd)??0,n=V(e.ilRisk,"").toLowerCase(),o=V(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 No(e){let t=To(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=Oo(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,d=c<1?"Avoid":r>80||i<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",p=V(e.project),m=V(e.symbol),f=V(e.chain);return{id:V(e.pool,`${f}:${p}:${m}`),recipe:t,label:`${p} ${m}`,chain:f,project:p,symbol:m,tvlUsd:i,rewardApr:o,nativeApr:n,estimatedBorrowApr:a,estimatedFundingApr:l,gasApr:u,riskHaircut:s,netApr:c,verdict:d,exposure:V(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:Ao[t],monitor:vo[t],prepareSteps:[`Verify ${p} contracts and reward terms on ${f}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Po[t]],source:"DeFiLlama yields"}}async function Ir(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 _t({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),a=Array.isArray(s?.data)?s.data:[],l=a.map(No).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 Sr(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),d=r*t*4.33,p=d*i,m=n*4.33*o,f=p+m+s,g=Math.max(0,1-c*.015),w=t*a*l,y=w*(1-u)*g,b=y-f,x=f>0?b/f*100:null,A=t*a>0?f/(t*a*(1-u)*(g||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:d,monthlyGas:p,laborMonthly:m,monthlyCost:f,lockupDiscount:g,grossExpectedValue:w,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 G(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Ar(e){let t=G(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function _o(e,t,r=4){let n=G(e),o=G(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 vr(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=G(s.funding),u=G(s.markPx??s.oraclePx),c=G(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:G(s.oraclePx),openInterest:c,fundingAprPct:Ar(l)})}return n}function Pr(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let r=G(e.funding);if(r==null)throw new Error("hl-delta-neutral: funding required");let n=Ar(r),o=r>0,i={coin:e.coin,notionalUsd:G(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?_o(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 ht(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=vr(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 gt(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=vr(o).find(s=>s.coin===r);if(!i)throw new Error(`hl-delta-neutral: ${r} not in Hyperliquid meta`);return Pr(i,n)}async function Ro(e={},t={}){Or(e,t,"hl-delta-neutral");let r=Nr(e.maxNotionalUsd??25e3,"hl-delta-neutral"),n=await gt(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=Ce(e,n.coin,"hl-delta-neutral");if(!Tr.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(()=>(lt(),ir)),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 Tr=/^0x[0-9a-fA-F]{40}$/;function Or(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){Or(e,t,r)}function $o(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=Nr(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"&&Me(e,r,"hl-delta-neutral"),t==="live"&&!Tr.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 Nr(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={}){Lo(e,t,"hl-delta-neutral");let r=$o(e),n=await ht({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=Pr(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 Ro({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 wt=`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,60 +13,60 @@ var $r=Object.defineProperty;var M=(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
|
|
16
|
+
Owner-operated. Carry/loop only prepare unsigned hedges. Signing is oracle signer after exact confirm. Farm loop never signs or broadcasts.`;function Co(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")}`,Ae=e=>`${(Number(e)||0).toFixed(1)}%`;function Mo(e){let t=typeof e.id=="string"?e.id:null;if(t){let r=Se.find(n=>n.id===t);if(!r)return process.stderr.write(`oracle farm: unknown method '${t}'. Known: ${Se.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}
|
|
20
20
|
|
|
21
21
|
`);for(let[n,o]of[["setup","setup"],["exposure","exposure"],["hedge","hedge"],["monitor","monitor"],["exit","exit"]])process.stdout.write(` ${n.padEnd(9)} ${r[o]}
|
|
22
22
|
`);return process.stdout.write(`
|
|
23
|
-
`),0}if(e.json)return process.stdout.write(JSON.stringify(
|
|
23
|
+
`),0}if(e.json)return process.stdout.write(JSON.stringify(Se,null,2)+`
|
|
24
24
|
`),0;process.stdout.write(`
|
|
25
25
|
farming methods
|
|
26
26
|
|
|
27
|
-
`);for(let r of
|
|
27
|
+
`);for(let r of Se)process.stdout.write(` ${r.id.padEnd(18)} ${r.label.padEnd(30)} ${r.risk}
|
|
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
|
|
31
|
+
`),0}async function Do(e){let t=await Ir({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)}${
|
|
37
|
+
`);for(let r of t.candidates)process.stdout.write(` ${r.verdict.padEnd(10)}${Ae(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
|
|
42
|
+
`),0}function Fo(e){let t=Sr({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
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(` ${
|
|
47
|
+
`),process.stdout.write(` ${Ae(r.probabilityPct)} eligibility \xB7 ${Ae(r.sybilHaircutPct)} sybil haircut \xB7 ${r.lockupMonths}mo lockup
|
|
48
48
|
|
|
49
49
|
`),process.stdout.write(` monthly cost ${J(t.monthlyCost).padStart(12)} (gas ${J(t.monthlyGas)} + labor ${J(t.laborMonthly)} + bridges ${J(r.bridgeMonthly)})
|
|
50
50
|
`),process.stdout.write(` gross EV ${J(t.grossExpectedValue).padStart(12)}
|
|
51
51
|
`),process.stdout.write(` after haircuts ${J(t.adjustedExpectedValue).padStart(12)} (lockup discount ${(t.lockupDiscount*100).toFixed(0)}%)
|
|
52
52
|
`),process.stdout.write(` net EV ${J(t.netExpectedValue).padStart(12)} ${t.verdict}
|
|
53
|
-
`),t.roiPct!=null&&process.stdout.write(` ROI ${
|
|
54
|
-
`),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${
|
|
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
|
|
55
55
|
`),process.stdout.write(`
|
|
56
56
|
${t.posture}.
|
|
57
57
|
|
|
58
|
-
`),0}async function
|
|
58
|
+
`),0}async function Rr(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 mt({coin:n,notionalUsd:e.notional},r):await ft({limit:e.limit},r):n?await gt({coin:n,notionalUsd:e.notional},r):await ht({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
|
|
61
|
+
`),0)}async function Bo(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 kr(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}
|
|
65
65
|
`);return process.stdout.write(`
|
|
66
66
|
${s.posture}
|
|
67
67
|
|
|
68
|
-
`),0}var
|
|
69
|
-
`),0):r==="methods"
|
|
68
|
+
`),0}var na={name:"farm",summary:"farming methods, live farm discovery, HL carry loop, airdrop EV",group:"read",usage:wt,async run(e){let t=Co(e.argv),r=t._[0];return!r||r==="help"?(process.stdout.write(wt+`
|
|
69
|
+
`),0):r==="methods"?Mo(t):r==="discover"?Do(t):r==="airdrop"?Fo(t):r==="carry"?Rr(t,e):r==="loop"?Bo(t,e):r==="lighter"?Rr({...t,venue:"lighter"},e):(process.stderr.write(`oracle farm: unknown subcommand '${r}'
|
|
70
70
|
|
|
71
|
-
${
|
|
72
|
-
`),1)}};export{
|
|
71
|
+
${wt}
|
|
72
|
+
`),1)}};export{na as default};
|