@oracle-agent/oracle 0.35.34 → 0.35.36
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/README.md +43 -8
- package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
- package/dist/address-book.mjs +2 -2
- package/dist/agent-sessions.mjs +8 -8
- package/dist/assets/profiles/canton-agent/SOUL.md +44 -0
- package/dist/assets/profiles/canton-agent/profile.json +30 -0
- package/dist/assets/profiles/oracle/SOUL.md +1 -0
- package/dist/assets/skills/oracle-canton/SKILL.md +49 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +35 -35
- package/dist/bin/oracle-data-mcp.mjs +17 -17
- package/dist/bin/oracle-gateway.mjs +14 -14
- package/dist/bin/oracle-launch-radar-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +4 -4
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +8 -8
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/bin/oracle.mjs +8 -6
- package/dist/cli/commands/agent-session.mjs +10 -10
- package/dist/cli/commands/airdrop.mjs +16 -0
- package/dist/cli/commands/chain.mjs +1 -1
- package/dist/cli/commands/chat.mjs +215 -204
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +151 -141
- package/dist/cli/commands/extension-policy.mjs +3 -3
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/mint.mjs +22 -0
- package/dist/cli/commands/model.mjs +219 -208
- package/dist/cli/commands/plugins.mjs +42 -39
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/session-vault.mjs +1 -1
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +25 -23
- package/dist/cli/commands/snipe.mjs +6 -6
- package/dist/cli/commands/swap.mjs +12 -12
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/control/receipt-lineage.mjs +1 -0
- package/dist/data/desk-data.mjs +33 -33
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +50 -49
- package/dist/launch-radar/index.mjs +4 -4
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +22 -20
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +1 -1
- package/dist/scanner/index.mjs +4 -4
- package/dist/task.mjs +2 -2
- package/dist/teams/index.mjs +3 -1
- package/dist/tui/standalone-client.mjs +85 -75
- package/package.json +3 -2
- package/public/eval-report.json +6 -6
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/assets/hero/agent-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/agent-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/agent-session.webm +0 -0
- package/public/oracle-splash/assets/oracle-cli-v03535-poster.jpg +0 -0
- package/public/oracle-splash/assets/oracle-cli-v03535.gif +0 -0
- package/public/oracle-splash/assets/protocol-build-time.jpg +0 -0
- package/public/oracle-splash/downloads/index.html +2 -2
- package/public/oracle-splash/index.html +132 -54
- package/server.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var $r=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
|
|
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 tn(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,yt):Math.min(250*2**e,yt)+Math.floor(Math.random()*100)}function W(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function qe(e,t,r){return W(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function ee(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function nn(e){return e?e.byteLength??e.length??0:0}async function on(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&&(ee(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+=nn(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 sn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function an(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:h,redirectPolicy:f="follow",maxRedirects:w=Ie}){let y=new AbortController,x=setTimeout(()=>y.abort(),i),S=h?bt?bt([h,y.signal]):h:y.signal,g=null,b=t,D=s?{lookupFn:s}:{};if(l&&!a&&!Ue(b))throw W(`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 V=async(E,{status:T=null}={})=>{let k=await Be(E,D);if(!k.ok)throw W(T==null?`HTTP refused ${E}: ${k.error}`:`HTTP redirect to ${E} ${k.error}`,T==null?{}:{status:T});let J=new URL(E).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await je({requireUndici:!0,...d?{importUndici:d}:{}})}catch(m){throw W(T==null?`HTTP refused ${E}: ${m?.message||m}`:`HTTP redirect to ${E} refused: ${m?.message||m}`,T==null?{}:{status:T})}g.pin(J,k.addresses),b=g.fetch}else mt(b,J,k.addresses);return k};try{let E=String(e),T=Object.assign(Object.create(null),n||{});l&&await V(E);for(let k=0;k<=w;k+=1){let J=Object.assign(Object.create(null),{method:r,headers:T,body:o,signal:S,redirect:"manual",dispatcher:void 0}),m=await b(E,J);if((f==="error"||w===0)&&m.status>=300&&m.status<400)throw ee(m),W(`HTTP ${m.status} ${r} redirect refused`,{status:m.status,redirectRefused:!0});if(Gr.has(m.status)){let L=c===!0&&r==="POST"&&[307,308].includes(m.status)&&It(r,o);if(r!=="GET"&&r!=="HEAD"&&!L){ee(m);let A=new Error(`HTTP ${m.status} ${r} ${E} redirected non-idempotent request`);throw A.status=m.status,A}if(k===w)throw ee(m),W(`HTTP ${m.status} ${r} redirect budget exhausted`,{status:m.status,redirectRefused:!0});let ft=m.headers?.get?.("location"),R;try{R=Xr(ft,E)}catch(A){throw ee(m),A}let Y=!Yr(R,E);if(ee(m),Y&&r==="POST"){let A=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw A.status=m.status,A}if(Y&&c){let A=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw A.status=m.status,A.retryable=!1,A}if(Y&&(T=Kr(T)),l)await V(R,{status:m.status});else if(Y){let A=await Be(R,D);if(!A.ok){let P=new Error(`HTTP redirect from ${E} ${A.error}`);throw P.status=m.status,P.retryable=!1,P}a&&A.addresses?.length&&(g||(g=await je(d?{importUndici:d}:{})),g&&(g.pin(new URL(R).hostname,A.addresses),b=g.fetch))}E=R;continue}if(typeof p=="function")try{await p(m,{url:E})}catch(L){throw ee(m),W(L?.message||String(L))}let _=await on(m,u,{url:E,onOversize:()=>y.abort()}),ue=sn(_);if(!m.ok){let L=new Error(`HTTP ${m.status} ${r} ${E}`);throw L.status=m.status,L.retryAfter=m.headers?.get?.("retry-after")??null,L.body=ue??_.slice(0,300),L}return ue??_}throw new Error(`HTTP redirect loop for ${e}`)}catch(E){if(y.signal.aborted&&!Ge(h)){let T=E&&(typeof E=="object"||typeof E=="function")&&!j.isProxy(E)?E:null,k=T?Object.getOwnPropertyDescriptor(T,"oversize"):null;if(!(k&&Object.hasOwn(k,"value")&&k.value===!0))try{if(!T)throw new TypeError("unsafe rejection");Object.defineProperties(T,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let m=new Error("HTTP request timed out");throw Object.defineProperties(m,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),m}}throw E}finally{clearTimeout(x),g&&await g.close()}}async function te(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&j.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 P of Object.getOwnPropertyNames(t)){let I=Object.getOwnPropertyDescriptor(t,P);if(!(P==="toJSON"&&I&&Object.hasOwn(I,"value")&&I.value===void 0)){if(!r.has(P))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=P=>{if(t==null||!Object.hasOwn(t,P))return;let I=Object.getOwnPropertyDescriptor(t,P);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>Ie))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Ie}`);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??Ie;for(let P of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let I=n(P);if(I!==void 0&&typeof I!="boolean")throw new TypeError(`HTTP ${P} 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(j.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 P of["importUndici","lookupFn","validateResponse"]){let I=n(P);if(I!==void 0&&typeof I!="function")throw new TypeError(`HTTP ${P} must be a function`)}let h=n("fetchImpl"),f=h||globalThis.fetch;if(typeof f!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let w=i??12e3,y=(o||"GET").toUpperCase(),x=n("headers"),S=Wr(x),g=Object.assign(Object.create(null),S);Object.keys(g).some(P=>P.toLowerCase()==="accept")||(g.Accept="application/json");let b=n("body");b!=null&&typeof b!="string"&&(Object.keys(g).find(I=>I.toLowerCase()==="content-type")||(g["Content-Type"]="application/json"),b=Jr(b));let D=s??Br,V=n("lookupFn"),E=!h,T=n("untrustedUrl")===!0,k=n("sameOriginRedirectsOnly")===!0,J=n("importUndici"),m=n("validateResponse"),_=p,ue=d??null,L=async()=>{let P;for(let I=0;I<=D;I++){_&&Ur.call(_);try{return await an(e,{fetchImpl:f,method:y,headers:g,body:b,timeoutMs:w,lookupFn:V,realFetch:E,untrustedUrl:T,maxResponseBytes:ue,sameOriginRedirectsOnly:k,importUndici:J,validateResponse:m,signal:_,redirectPolicy:u,maxRedirects:c})}catch(Z){P=Z;let se=Ce=>{if(!Z||typeof Z!="object"&&typeof Z!="function"||j.isProxy(Z))return;let de=Object.getOwnPropertyDescriptor(Z,Ce);return de&&Object.hasOwn(de,"value")?de.value:void 0},Re=se("status"),Tr=se("oracleTimeout")===!0||se("name")==="AbortError"||se("name")==="TimeoutError"||Ge(_),kr=new Set([408,425,429]),Nr=se("retryable")===!1?!1:Re!=null?kr.has(Re)||Dr.has(Re)&>.has(y):!Tr&>.has(y);if(I===D||!Nr)throw Z;let ht=tn(I,se("retryAfter"));_?await new Promise((Ce,de)=>{let vr=setTimeout(Ce,ht);zr.call(_,"abort",()=>{clearTimeout(vr),de(qr(_)||new DOMException("Aborted","AbortError"))},{once:!0})}):await rn(ht)}}throw P};if(!(n("dedupe")!==!1&&!_&&It(y,b)))return L();let R=en(y,e,g,{untrustedUrl:T,maxResponseBytes:ue,sameOriginRedirectsOnly:k,redirectPolicy:u,maxRedirects:c,timeoutMs:w,retries:D,fetchImpl:Se(f),realFetch:E,lookupFn:Se(V),importUndici:Se(J),validateResponse:Se(m)},b),Y=ze.get(R);if(Y)return Y;let A=L().finally(()=>ze.delete(R));return ze.set(R,A),A}var Dr,gt,Br,yt,jr,Hr,Ur,zr,bt,Ge,qr,Gr,Ie,Do,B,ze,xt,Et,Zr,Qr,rn,Pe=M(()=>{wt();Dr=new Set([408,425,429,500,502,503,504]),gt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Br=2,yt=4e3,jr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Hr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ur=AbortSignal.prototype.throwIfAborted,zr=EventTarget.prototype.addEventListener,bt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ge=e=>e?jr.call(e):!1,qr=e=>e?Hr.call(e):void 0,Gr=new Set([301,302,303,307,308]),Ie=3,Do=64*1024,B=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});ze=new Map,xt=new WeakMap,Et=1;Zr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Qr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);rn=e=>new Promise(t=>setTimeout(t,e))});import{types as Tt}from"node:util";function mn(e){if(!e||typeof e!="object"||Tt.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(Tt.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(!mn(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 kt=M(()=>{});function yn({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"?gn:wn}async function ne(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=yn(t);return Oe(await te(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function Nt(e={}){return ne({type:"allMids"},e)}async function fe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ne(t,e)}var wn,gn,Ae=M(()=>{Pe();kt();wn="https://api.hyperliquid.xyz/info",gn="https://api.hyperliquid-testnet.xyz/info"});import{createHash as bn,createHmac as xn,timingSafeEqual as Xo}from"node:crypto";function Ve(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ve).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ve(e[r])}`).join(",")}}`}function vt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function $t(e=process.env){return vt(process.env)||vt(e)}function Pn(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function On(e){let t=Pn(e);return bn("sha256").update(Ve(t)).digest("hex")}function An(e,t=$t()){return t?xn("sha256",t).update(String(e)).digest("hex"):""}function U(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+Sn:Number(i),c=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||c<=0||c>In)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:l,expiresAt:u,prepareVersion:En},h=On(p),f=$t(n),w=f?An(h,f):void 0,y={...p,prepareHash:h};return w&&(y.prepareMac=w),y}var En,Sn,In,Te=M(()=>{En=2,Sn=300*1e3,In=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});async function Mt(e={}){let t=Date.now();if(me.dexs&&t-me.at<6e4&&!e.fetchImpl)return me.dexs;let r=await ne({type:"perpDexs"},e);return me={at:t,dexs:Array.isArray(r)?r:[]},me.dexs}async function Rt(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 fe(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 $e(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=Ft+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function Ct(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=Ft+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:$e(e.coin);if(e.coin!=null&&!u)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let c=e.outcome==null?null:Ct(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:kn(e.outcomeSide,"outcomeSide"),p=c??u?.outcome;if(e.outcome!=null&&e.coin==null&&d==null)throw new Error("hl-assets: outcomeSide required");let h=d??u?.side;if(h==null)throw new Error("hl-assets: outcomeSide required");if(p==null)throw new Error("hl-assets: outcome identity required");let f=Ct(p,h);if(u&&(u.outcome!==f.outcome||u.side!==f.side))throw new Error("hl-assets: coin does not match outcome side");let w=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:w,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 h=(await Mt(t)).findIndex(b=>b&&b.name===u);if(h<1)throw new Error(`hl-assets: unknown builder dex "${u}"`);let{universe:f,ctxs:w}=await Rt(u,t),y=f.findIndex(b=>b.name===r||b.name===`${u}:${d}`||b.name.endsWith(`:${d}`));if(y<0)throw new Error(`hl-assets: ${r} not in dex ${u} meta`);let x=f[y];if(x.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let S=Tn+h*1e4+y,g=w[y]||{};return{kind:"hip3",coin:x.name||r,assetId:S,szDecimals:x.szDecimals??0,maxLeverage:x.maxLeverage??null,dex:u,dexIndex:h,indexInMeta:y,markPx:g.markPx??null}}let{universe:n,ctxs:o}=await Rt("",t),i=r.toUpperCase(),s=n.findIndex(u=>u.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let u=await Mt(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 kn(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 Ft,Tn,me,Lt,Xe=M(()=>{Ae();Ft=1e8,Tn=1e5,me={at:0,dexs:null},Lt=new Map});function N(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 Dt(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=N(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 $(e,t,r="amount"){let n=N(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 Ln(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=N(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 F(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=>F(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)}:${F(e[n],t)}`).join(",")}}`}function Mn(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)||F(r,"declared order type")!==F({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(F(r,"declared order type")!==F({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||F(r,"declared order type")!==F({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 Rn(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=$(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 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=K(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Dt(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=oe(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=$(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function jt(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(N(e.s,"hl: signed size")!==N(t.size,"hl: size"))throw new Error("hl: signed size must match");if(N(e.p,"hl: signed price")!==N(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(F(e.t,"signed order type")!==F(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(N(e.s,"hl: bracket protection size")!==N(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(N(e.p,"hl: bracket protection price")!==N(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(N(i.triggerPx,"hl: triggerPx")!==N(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 Ze(e){return $e(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 Bn(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 Ut(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=K(r.kind,"kind",48),o=$n[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!==_n[n])throw new Error("hl: action type must match kind");let a=r.notionalUsd??0;if(vn.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let l=K(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=$e(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),Bn(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");Mn(r);let c=r.action.orders;if(n==="perp-bracket"){let d=r.takeProfitPx,p=r.stopLossPx,h=1+(d==null?0:1)+(p==null?0:1);if(h<2||c.length!==h||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");jt(c[0],r,u);let 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");jt(c[0],r,u)}Rn(c[0],r,t),Cn(r,t),a=N(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=K(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 h=$(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>h)throw new Error("hl: margin notional exceeds cap");a=Ln(f,6)}}if(n==="builder-fee-approval"){let l=K(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(l))throw new Error("hl: builder address required");if(K(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=K(r.maxFeeRate,"maxFeeRate",32);if(K(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 h=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==h||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,vn,$n,_n,K,zt=M(()=>{_e();Xe();Nn=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),vn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),$n=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"}),K=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function Hn(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=jn[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:Hn(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 Ut(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 jn,Gt=M(()=>{zt();jn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as Un,JsonRpcProvider as zn}from"ethers";function Kn(e){return Wn.test(String(e||""))}async function Qe(e,{contract:t=qn,rpc:r=Vn,chainId:n=Gn,balanceOf:o}={}){if(!Kn(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new zn(r,n,{staticNetwork:!0}),s=new Un(t,Jn,i);return BigInt(await s.balanceOf(e))}var qn,Gn,Vn,Jn,Wn,et=M(()=>{qn="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Gn=999,Vn="https://rpc.hyperliquid.xyz/evm",Jn=["function balanceOf(address owner) view returns (uint256)"],Wn=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Xn,readFileSync as Yn,lstatSync as Zn}from"node:fs";import{homedir as Vt}from"node:os";import{join as tt}from"node:path";function Qn(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(Vt(),".config","oracle");return tt(t,"fee-recipient")}return tt(Vt(),".config","oracle","fee-recipient")}function Wt(e=process.env){try{let t=Qn(e);if(!Xn(t)||Zn(t).isSymbolicLink())return"";let r=Yn(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var fi,Jt,Kt=M(()=>{et();fi=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),Jt="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var nr={};_r(nr,{HL_BUILDER_ADDRESS_ENV:()=>Le,HL_BUILDER_DEFAULT_FEE_BPS:()=>eo,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:()=>Me,MARGIN_MODE:()=>ge,ORDER_TYPES:()=>v,TIF:()=>ye,formatPerpPrice:()=>z,formatPerpSize:()=>tr,hlBuilderFeeBpsForKind:()=>er,hlPerpAssetInfo:()=>ae,hlPrepareApproveAgent:()=>co,hlPrepareBracketOrder:()=>fo,hlPrepareBuilderApproval:()=>ao,hlPrepareCancelOrder:()=>lo,hlPreparePerpOrder:()=>rr,hlPrepareUpdateIsolatedMargin:()=>po,hlPrepareUpdateLeverage:()=>uo,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 to(e,t){let r=Zt(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function ro(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?.[Le]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${Le} 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 no(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 oo(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"),h=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+h}function io(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 z(e,t,r={}){let n=Yt-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return st(io(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 so(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[h,f=""]=p.split(".");return{raw:BigInt(h+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 ae(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,outcome:r.outcome??null,side:r.side??null}}function ot(e,{tif:t=ye.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case v.LIMIT:return{limit:{tif:t}};case v.MARKET:return{limit:{tif:ye.IOC}};case v.STOP_MARKET:case v.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:z(r,o),tpsl:e===v.STOP_MARKET?"sl":"tp"}};case v.STOP_LIMIT:case v.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:z(r,o),tpsl:e===v.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:Me,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 ce(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,U(n,{provider:e.provider||"hl-perps",kind:e.kind})}function ao(e={},t={}){let r=it({env:t.env});if(!r)throw new Error(`hl-perps: ${Le} 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:Me,maxFeeRate:r.disclosure.percent,builder:r.disclosure.address,nonce:n};return ce({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:r.disclosure,...ie(o,n,t)},e,t)}function co(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:Me,agentAddress:r.toLowerCase(),agentName:o,nonce:n};return U({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 rr(e={},t={}){let r=await ae(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??v.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===v.MARKET){let S=Number(r.markPx);if(!Number.isFinite(S)){let V=await Nt(t);S=Number(V?.[r.coin]??V?.[String(r.assetId)]??NaN)}if(!Number.isFinite(S))throw new Error("hl-perps: no mark price available for a market order");let g=Number(e.maxSlippageBps??50);if(!Number.isInteger(g)||g<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(g>100)throw new Error(`hl-perps: maxSlippageBps ${g} exceeds the hard 100 bps cap`);let b=o?S*(1+g/1e4):S*(1-g/1e4);a=z(b,r.szDecimals,{roundDown:o});let D=Math.abs(Number(a)/S-1)*1e4;if(D>g+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${D.toFixed(2)} bps from mark, above the ${g} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=z(e.price??e.limitPx,r.szDecimals)}let l=ot(n,{tif:e.tif??(n===v.MARKET?ye.IOC:ye.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 oo(d,e,t),h=p.exempt?null:d,f=await no(h,e,t),w=f.approved?h:null;w&&(c.builder=w.wire);let y=Number(e.nonce??Date.now()),x=so(s,a);return ce({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,side:o?"buy":"sell",orderType:n,price:a,size:s,reduceOnly:i,notionalUsd:x,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:w?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:h&&!w?{...d.disclosure,...f}:null,...ie(c,y,t)},e,t)}async function lo(e={},t={}){let r=await ae(ro(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 ce({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 uo(e={},t={}){let r=await ae(e,t),n=to(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||ge.CROSS).toLowerCase();if(o!==ge.CROSS&&o!==ge.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===ge.CROSS,leverage:n};return ce({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 po(e={},t={}){let r=await ae(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=Qt(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:r.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return ce({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 fo(e={},t={}){let r=await rr(e,t),n=await ae(e,t),o=r.side==="buy",i=[r.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:n.assetId,b:!o,p:z(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:ot(v.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:z(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:ot(v.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 ce({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:z(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:z(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ie(s,Number(e.nonce??Date.now()),t)},e,t)}var Xt,Yt,Me,eo,rt,Le,nt,we,v,ye,ge,or=M(()=>{Ae();Xe();_e();Te();Gt();et();Kt();Xt=5,Yt=6,Me="0x66eee",eo=2,rt=10,Le="ORACLE_HL_BUILDER_ADDRESS",nt="ORACLE_HL_BUILDER_FEE_BPS",we=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),v=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),ye=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),ge=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});Pe();var cn="https://yields.llama.fi";async function Pt(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||cn).replace(/\/$/,""),n=await te(`${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)}}var pe=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."}]),ln={"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."},un={"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."},dn={"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 re(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function H(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function pn(e){let t=H(e.symbol,"").toUpperCase(),r=H(e.exposure,"").toLowerCase(),n=re(e.apy)??0,o=re(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 fn(e,t){let r=re(e.tvlUsd)??0,n=H(e.ilRisk,"").toLowerCase(),o=H(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 hn(e){let t=pn(e);if(!t)return null;let r=re(e.apy)??0,n=re(e.apyBase)??0,o=Math.max(0,re(e.apyReward)??Math.max(0,r-n)),i=Math.max(0,re(e.tvlUsd)??0),s=fn(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=H(e.project),h=H(e.symbol),f=H(e.chain);return{id:H(e.pool,`${f}:${p}:${h}`),recipe:t,label:`${p} ${h}`,chain:f,project:p,symbol:h,tvlUsd:i,rewardApr:o,nativeApr:n,estimatedBorrowApr:a,estimatedFundingApr:l,gasApr:u,riskHaircut:s,netApr:c,verdict:d,exposure:H(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:ln[t],monitor:un[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.",...dn[t]],source:"DeFiLlama yields"}}async function Ot(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 Pt({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),a=Array.isArray(s?.data)?s.data:[],l=a.map(hn).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 C(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 At(e={}){let t=C(e.wallets,5,1,500),r=C(e.tasksWeekly,6,0,500),n=C(e.hoursWeekly,4,0,168),o=C(e.hourlyCost,25,0,1e4),i=C(e.gasPerTask,.4,0,1e4),s=C(e.bridgeMonthly,12,0,1e5),a=C(e.expectedReward,900,0,1e7),l=C(e.probability,22,0,100)/100,u=C(e.sybilHaircut,25,0,100)/100,c=C(e.lockupMonths,6,0,120),d=r*t*4.33,p=d*i,h=n*4.33*o,f=p+h+s,w=Math.max(0,1-c*.015),y=t*a*l,x=y*(1-u)*w,S=x-f,g=f>0?S/f*100:null,b=t*a>0?f/(t*a*(1-u)*(w||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:h,monthlyCost:f,lockupDiscount:w,grossExpectedValue:y,adjustedExpectedValue:x,netExpectedValue:S,roiPct:g,breakevenProbabilityPct:b,verdict:S>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}Ae();Te();function _t(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Ne(e={},t,r){let n=String(t||""),o=_t(e);if(o){let s=he(o[n]);if(s==null)throw new Error(`${r}: held spot required for ${n}`);return s}let i=he(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${r}: prepare requires spotSize of held spot`);return i}function ve(e={},t=[],r){let n=_t(e);if(t.length>1){if(!n)throw new Error(`${r}: multi-coin live loop requires spotSizes map`);for(let o of t)if(he(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(n){let o=t[0];if(o&&he(n[o])==null)throw new Error(`${r}: held spot required for ${o}`);return}if(he(e.spotSize??e.spotHeldSize)==null)throw new Error(`${r}: live loop requires spotSize of held spot`)}var Je=Number.MAX_SAFE_INTEGER,ke=String(Je);function he(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Je?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,r=""]=e.split(".");if(t.length>ke.length||t.length===ke.length&&t>ke||t===ke&&/[1-9]/.test(r))return null;let n=Number(e);return Number.isFinite(n)&&n>0&&n<=Je?n:null}function q(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function ir(e){let t=q(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function ho(e,t,r=4){let n=q(e),o=q(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 sr(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=q(s.funding),u=q(s.markPx??s.oraclePx),c=q(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:q(s.oraclePx),openInterest:c,fundingAprPct:ir(l)})}return n}function ar(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let r=q(e.funding);if(r==null)throw new Error("hl-delta-neutral: funding required");let n=ir(r),o=r>0,i={coin:e.coin,notionalUsd:q(t),markPx:e.markPx,fundingHourly:r,fundingAprPct:n,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?ho(t,e.markPx,e.szDecimals):"0",verdict:o?n>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function at(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),n=Number(e.minOpenInterest??0),o=await fe(t),i=sr(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 ct(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 fe(t),i=sr(o).find(s=>s.coin===r);if(!i)throw new Error(`hl-delta-neutral: ${r} not in Hyperliquid meta`);return ar(i,n)}async function mo(e={},t={}){lr(e,t,"hl-delta-neutral");let r=ur(e.maxNotionalUsd??25e3,"hl-delta-neutral"),n=await ct(e,t);if(n.verdict==="skip")return U({...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=Ne(e,n.coin,"hl-delta-neutral");if(!cr.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(()=>(or(),nr)),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 U({...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 cr=/^0x[0-9a-fA-F]{40}$/;function lr(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function wo(e,t,r){lr(e,t,r)}function go(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=ur(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"&&ve(e,r,"hl-delta-neutral"),t==="live"&&!cr.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 ur(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 dr(e={},t={}){wo(e,t,"hl-delta-neutral");let r=go(e),n=await at({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=ar(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 mo({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."}}Pe();Te();_e();var yo=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),be=14,pr=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`lighter: bounded ${t} required`);return e};function le(e,t,r){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${r} must be exact numeric ${t}`)}function lt(e){let t=String(e||"").replace(/\/$/,"");if(!yo.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function fr(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("lighter: structured artifact required");let n=pr(r.kind,"kind",48);if(n!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=lt(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");le(r.orderType,0,"orderType"),le(r.timeInForce,1,"timeInForce"),le(r.reduceOnly,0,"reduceOnly"),le(r.triggerPrice,0,"triggerPrice"),le(r.orderExpiry,-1,"orderExpiry");let l=pr(r.symbol||r.coin,"symbol",32),u=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(u.length&&!u.includes(l)&&!u.includes(String(i))&&!u.includes("*"))throw new Error("lighter: market not allowed");if(r.side!=="buy"&&r.side!=="sell")throw new Error("lighter: side must be buy or sell");let c=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),h=Number(d),f=Number(r.sizeDecimals??0),w=Number(r.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(w)||w<0||w>12)throw new Error("lighter: priceDecimals required");let y=f+w,x=c*d,S=$(r.notionalUsd,y,"lighter: notionalUsd");if(S<=0n)throw new Error("lighter: notionalUsd required");if(x!==S)throw new Error("lighter: notionalUsd must match size and price");let g=$(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,y,"lighter: maxNotionalUsd");if(x>g)throw new Error("lighter: notional exceeds cap");let b=N(r.notionalUsd,"lighter: notionalUsd");return le(r.txType,be,"txType"),Object.freeze({unit:"usd",value:String(b),notional:String(b),fee:"0",kind:n,symbol:l,marketIndex:i,side:r.side,baseAmount:p,price:h,submitTo:o,actionType:"create-order",amount:String(b)})}function bo(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 hr(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=lt(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:bo(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??be,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return fr(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}var wr="https://mainnet.zklighter.elliot.ai",gr="https://testnet.zklighter.elliot.ai";function xo(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?gr:wr}function X(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Eo(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 yr(e){let t=X(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function So(e,t,r=4){let n=X(e),o=X(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 mr(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function br(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=mr(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of r){if(String(s.exchange||"")!=="lighter")continue;let a=mr(s.market_id);if(a==null)continue;let l=o.get(a),u=X(l?.mark_price??l?.index_price),c=X(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:X(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:yr(c)})}return i}function xr(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let r=X(e.funding);if(r==null)throw new Error("lighter: funding required");let n=yr(r),o=r>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:X(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?So(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 Er(e={}){let t=xo(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,i]=await Promise.all([te(`${t}/api/v1/funding-rates`,n),te(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:i}}catch(o){throw r.abort(o),o}}async function ut(e={},t={}){let r=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:n,books:o}=await Er(t),i=br(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 dt(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 Er(t),s=br(o,i).find(a=>a.symbol===r);if(!s)throw new Error(`lighter: ${r} not in Lighter funding`);return xr(s,n)}async function Io(e={},t={}){Ir(e,t,"lighter");let r=Pr(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 dt(e,t);if(o.verdict==="skip")return U({...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=Ne(e,o.coin,"lighter");if(!Sr.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),l=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),u=Eo(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:be,submitTo:`${a?gr:wr}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=hr(c,{...e,maxNotionalUsd:r},t)}catch(f){p=String(f?.message||f).slice(0,200)}return U({...c,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Sr=/^0x[0-9a-fA-F]{40}$/;function Ir(e,t,r){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${r}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${r}: farm cannot sign; use oracle signer`)}function Po(e,t,r){Ir(e,t,r)}function Oo(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=Pr(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"&&ve(e,r,"lighter"),t==="live"&&!Sr.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:r,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function 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={}){Po(e,t,"lighter");let r=Oo(e),n=await ut({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=xr(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 Io({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 pt=`oracle farm <methods|discover|airdrop|carry|loop|lighter> [options]
|
|
1
|
+
var $r=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 Cr=(e,t)=>{for(var r in t)$r(e,r,{get:t[r],enumerable:!0})};import te from"node:net";import Mr from"node:dns";function Se(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 De(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 Fe(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=Se(e);if(!t)return!1;let r=Se("::ffff:0:0");return De(t,r,96)?Fe([...t.slice(12)].join(".")):De(t,Se("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>De(t,Se(o),i)):!1}return!1}function Fr(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(Dr.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=te.isIP(r);return n!==0&&!Fe(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Be(e,{lookupFn:t=Mr.promises.lookup}={}){let r=Fr(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=>!Fe(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Ue({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=Br((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 Br(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[He]=Object.freeze({pin:t}),e}function je(e){return typeof e=="function"&&typeof e[He]?.pin=="function"}function bt(e,t,r){if(!je(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[He].pin(t,r)}var Dr,He,xt=M(()=>{Dr=new Set(["localhost","metadata.google.internal","metadata.goog"]);He=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Ur}from"node:crypto";import{types as z}from"node:util";function A(e){return X(`HTTP JSON body refused: ${e}`)}function Kr(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 Xr(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 A("serialized byte limit exceeded");t.push(c)},l=c=>{if(Buffer.byteLength(c,"utf8")>j.bytes)throw A("serialized byte limit exceeded");return JSON.stringify(c)},u=(c,d)=>{if(n+=1,n>j.nodes)throw A("node limit exceeded");if(d>j.depth)throw A("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 A("non-finite number");a(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw A("unsupported non-JSON value");if(z.isProxy(c))throw A("proxy value");if(Kr(c))throw A("unsupported exotic object");if(s.has(c))throw A("cyclic value");s.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw A("symbol-keyed fields are unsupported");if(Array.isArray(c)){let f=Object.getPrototypeOf(c),g=0;for(;f!==null;){if(z.isProxy(f))throw A("proxy array prototype");if(g+=1,g>j.depth)throw A("array prototype depth limit exceeded");f=Object.getPrototypeOf(f)}if(c.length>j.arrayLength)throw A("array length limit exceeded");for(let b=0;b<c.length;b+=1){let E=Object.getOwnPropertyDescriptor(c,String(b));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw A("array entries must be dense enumerable own data")}let y=0;for(let b in c){if(i+=1,i>j.fields)throw A("enumeration limit exceeded");if(Object.hasOwn(c,b)&&(y+=1,y>c.length))throw A("named array fields are unsupported")}if(y!==c.length)throw A("array entries must be dense enumerable own data");a("[");for(let b=0;b<c.length;b+=1)b&&a(","),u(Object.getOwnPropertyDescriptor(c,String(b)).value,d+1);a("]");return}let p=Object.getPrototypeOf(c);if(p!==Object.prototype&&p!==null)throw A("non-plain object");let m=[];for(let f in c){if(i+=1,i>j.fields)throw A("enumeration limit exceeded");if(!Object.hasOwn(c,f))continue;if(o+=1,o>j.fields)throw A("field limit exceeded");let g=Object.getOwnPropertyDescriptor(c,f);if(!g||!Object.hasOwn(g,"value")||g.enumerable!==!0)throw A("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 Yr(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 Zr(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Qr(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 en(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Ae(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=St.get(e);return t||(t=At,At+=1,St.set(e,t)),`reference:${t}`}function vt(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?tn.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 Pt(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(vt);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return vt(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&rn.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function nn(e,t,r,n={},o=null){let i=Ur("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 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),f=(await $t(t)).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}`||N.name.endsWith(`:${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,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"})});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,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,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]
|
|
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 Lo(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")}`,Ie=e=>`${(Number(e)||0).toFixed(1)}%`;function $o(e){let t=typeof e.id=="string"?e.id:null;if(t){let r=ke.find(n=>n.id===t);if(!r)return process.stderr.write(`oracle farm: unknown method '${t}'. Known: ${ke.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(ke,null,2)+`
|
|
24
24
|
`),0;process.stdout.write(`
|
|
25
25
|
farming methods
|
|
26
26
|
|
|
27
|
-
`);for(let r of
|
|
27
|
+
`);for(let r of ke)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 Co(e){let t=await xr({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)}${Ie(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 Mo(e){let t=Er({wallets:e.wallets,tasksWeekly:e["tasks-weekly"],hoursWeekly:e["hours-weekly"],hourlyCost:e["hourly-cost"],gasPerTask:e["gas-per-task"],bridgeMonthly:e["bridge-monthly"],expectedReward:e["expected-reward"],probability:e.probability,sybilHaircut:e["sybil-haircut"],lockupMonths:e["lockup-months"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
|
|
43
43
|
`),0;let r=t.inputs;return process.stdout.write(`
|
|
44
44
|
airdrop expected value
|
|
45
45
|
|
|
46
|
-
`),process.stdout.write(` ${r.wallets} wallets \xB7 ${r.tasksWeekly} tasks/wk \xB7 ${r.hoursWeekly} hrs/wk @ ${
|
|
47
|
-
`),process.stdout.write(` ${
|
|
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(` ${Ie(r.probabilityPct)} eligibility \xB7 ${Ie(r.sybilHaircutPct)} sybil haircut \xB7 ${r.lockupMonths}mo lockup
|
|
48
48
|
|
|
49
|
-
`),process.stdout.write(` monthly cost ${
|
|
50
|
-
`),process.stdout.write(` gross EV ${
|
|
51
|
-
`),process.stdout.write(` after haircuts ${
|
|
52
|
-
`),process.stdout.write(` net EV ${
|
|
53
|
-
`),t.roiPct!=null&&process.stdout.write(` ROI ${
|
|
54
|
-
`),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${
|
|
49
|
+
`),process.stdout.write(` monthly cost ${J(t.monthlyCost).padStart(12)} (gas ${J(t.monthlyGas)} + labor ${J(t.laborMonthly)} + bridges ${J(r.bridgeMonthly)})
|
|
50
|
+
`),process.stdout.write(` gross EV ${J(t.grossExpectedValue).padStart(12)}
|
|
51
|
+
`),process.stdout.write(` after haircuts ${J(t.adjustedExpectedValue).padStart(12)} (lockup discount ${(t.lockupDiscount*100).toFixed(0)}%)
|
|
52
|
+
`),process.stdout.write(` net EV ${J(t.netExpectedValue).padStart(12)} ${t.verdict}
|
|
53
|
+
`),t.roiPct!=null&&process.stdout.write(` ROI ${Ie(t.roiPct).padStart(12)}
|
|
54
|
+
`),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${Ie(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 Tr(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 ft({coin:n,notionalUsd:e.notional},r):await pt({limit:e.limit},r):n?await ht({coin:n,notionalUsd:e.notional},r):await mt({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 Do(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 br(i,r):await Or(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 ta={name:"farm",summary:"farming methods, live farm discovery, HL carry loop, airdrop EV",group:"read",usage:gt,async run(e){let t=Lo(e.argv),r=t._[0];return!r||r==="help"?(process.stdout.write(gt+`
|
|
69
|
+
`),0):r==="methods"?$o(t):r==="discover"?Co(t):r==="airdrop"?Mo(t):r==="carry"?Tr(t,e):r==="loop"?Do(t,e):r==="lighter"?Tr({...t,venue:"lighter"},e):(process.stderr.write(`oracle farm: unknown subcommand '${r}'
|
|
70
70
|
|
|
71
|
-
${
|
|
72
|
-
`),1)}};export{
|
|
71
|
+
${gt}
|
|
72
|
+
`),1)}};export{ta as default};
|