@oracle-agent/oracle 0.35.49 → 0.35.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +19 -19
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  15. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  16. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  17. package/dist/bin/oracle-public-server.mjs +5 -5
  18. package/dist/bin/oracle-route.mjs +27 -27
  19. package/dist/bin/oracle-scan.mjs +3 -3
  20. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  21. package/dist/chains.mjs +1 -1
  22. package/dist/cli/commands/account.mjs +22 -22
  23. package/dist/cli/commands/agent-session.mjs +23 -23
  24. package/dist/cli/commands/auth.mjs +16 -15
  25. package/dist/cli/commands/chain.mjs +5 -5
  26. package/dist/cli/commands/chat.mjs +310 -228
  27. package/dist/cli/commands/data.mjs +37 -37
  28. package/dist/cli/commands/doctor.mjs +5 -5
  29. package/dist/cli/commands/eval.mjs +249 -167
  30. package/dist/cli/commands/farm.mjs +1 -1
  31. package/dist/cli/commands/follow.mjs +4 -4
  32. package/dist/cli/commands/harness.mjs +6 -6
  33. package/dist/cli/commands/mint.mjs +11 -11
  34. package/dist/cli/commands/model.mjs +313 -231
  35. package/dist/cli/commands/project.mjs +8 -7
  36. package/dist/cli/commands/quickstart.mjs +2 -2
  37. package/dist/cli/commands/receipt.mjs +2 -2
  38. package/dist/cli/commands/resolve.mjs +4 -4
  39. package/dist/cli/commands/session-vault.mjs +4 -4
  40. package/dist/cli/commands/setup.mjs +53 -52
  41. package/dist/cli/commands/snipe.mjs +13 -13
  42. package/dist/cli/commands/strategy.mjs +5 -5
  43. package/dist/cli/commands/swap.mjs +11 -11
  44. package/dist/cli/commands/telegram.mjs +7 -7
  45. package/dist/cli/commands/venues.mjs +1 -1
  46. package/dist/cli/project-access.mjs +4 -3
  47. package/dist/data/desk-data.mjs +31 -31
  48. package/dist/data/holder-table.mjs +2 -2
  49. package/dist/data/market-tape.mjs +1 -1
  50. package/dist/data/names.mjs +3 -3
  51. package/dist/data/providers/farming.mjs +2 -2
  52. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  53. package/dist/index.mjs +49 -49
  54. package/dist/launch-radar/index.mjs +5 -5
  55. package/dist/lp/index.mjs +4 -4
  56. package/dist/nft/universal-mint-router.mjs +4 -4
  57. package/dist/notifications/index.mjs +1 -1
  58. package/dist/router/index.mjs +3 -3
  59. package/dist/router/prepare-bridge.mjs +2 -2
  60. package/dist/router/prepare-route.mjs +3 -3
  61. package/dist/scanner/index.mjs +3 -3
  62. package/dist/strategy/index.mjs +4 -4
  63. package/dist/task.mjs +1 -1
  64. package/dist/teams/index.mjs +6 -6
  65. package/dist/telegram/chart-card.mjs +5 -5
  66. package/dist/telegram/market-commands.mjs +1 -1
  67. package/dist/tui/standalone-client.mjs +179 -97
  68. package/package.json +2 -2
  69. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  70. package/public/oracle-splash/docs/connectors/index.html +2 -2
  71. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  72. package/public/oracle-splash/docs/index.html +3 -3
  73. package/public/oracle-splash/docs/reference/index.html +2 -2
  74. package/public/oracle-splash/docs/security/index.html +2 -2
  75. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  76. package/public/oracle-splash/download/index.html +3 -3
  77. package/public/oracle-splash/downloads/index.html +1 -1
  78. package/public/oracle-splash/eval/index.html +19 -19
  79. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  80. package/public/oracle-splash/index.html +9 -9
  81. package/server.json +2 -2
@@ -1,6 +1,6 @@
1
- var qo=Object.defineProperty;var B=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var yt=(e,t)=>{for(var r in t)qo(e,r,{get:t[r],enumerable:!0})};import{AsyncLocalStorage as Bo}from"node:async_hooks";function wt(e){let t=Do.getStore();if(!t||t.closed||!Uo.includes(e))return null;if(t.spans.length>=zo)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,i=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(i)&&i>=100&&i<=599?i:null)}}var Do,Uo,zo,Dr=B(()=>{Do=new Bo,Uo=["http","retry","shared"],zo=512});import ve from"node:net";import Jo from"node:dns";function gt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=u=>{if(!u)return[];let c=u.split(":"),h=c.at(-1);if(h?.includes(".")){let d=h.split(".").map(Number);if(d.length!==4||d.some(p=>!Number.isInteger(p)||p<0||p>255))return null;c.splice(c.length-1,1,(d[0]<<8|d[1]).toString(16),(d[2]<<8|d[3]).toString(16))}return c.some(d=>!/^[0-9a-f]{1,4}$/.test(d))?null:c.map(d=>Number.parseInt(d,16))},[n,i]=t.split("::"),a=r(n),o=r(i);if(!a||!o)return null;let s=t.includes("::"),l=8-a.length-o.length;if(!s&&l!==0||s&&l<1)return null;let f=[...a,...Array(Math.max(0,l)).fill(0),...o];return f.length!==8?null:Uint8Array.from(f.flatMap(u=>[u>>8,u&255]))}function Bt(e,t,r){let n=Math.floor(r/8),i=r%8;for(let o=0;o<n;o+=1)if(e[o]!==t[o])return!1;if(!i)return!0;let a=255<<8-i;return(e[n]&a)===(t[n]&a)}function Dt(e){if(ve.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(ve.isIPv6(e)){let t=gt(e);if(!t)return!1;let r=gt("::ffff:0:0");return Bt(t,r,96)?Dt([...t.slice(12)].join(".")):Bt(t,gt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([i,a])=>Bt(t,gt(i),a)):!1}return!1}function Wo(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(Vo.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ve.isIP(r);return n!==0&&!Dt(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ut(e,{lookupFn:t=Jo.promises.lookup}={}){let r=Wo(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:ve.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(i=>!Dt(i.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function Go(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function zt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,i;try{i=await t(),r=i.Agent,n=i.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 a=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),o=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||(ve.isIPv6(p.address)?6:4)})),l=(d,p,m)=>{o.set(a(d),s(typeof p=="string"?[{address:p,family:m}]:p))},f=d=>{let p=a(d);if(ve.isIP(p))return[{address:p,family:ve.isIPv6(p)?6:4}];let m=o.get(p);if(!m||!m.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return m},u=Go(),c=u&&typeof i.ProxyAgent=="function"?new i.ProxyAgent({uri:u.uri,token:`Bearer ${u.token}`,connectTimeout:1e4}):new r({connect:{lookup(d,p,m){let y;try{y=f(d)}catch(E){return m(E)}return p?.all?m(null,y):m(null,y[0].address,y[0].family)}}}),h=Ko((d,p={})=>n(d,{...p,dispatcher:c}),l);return{dispatcher:c,fetch:h,pin:l,resolve:f,async close(){try{await c.destroy()}catch{}}}}function Ko(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[Jt]=Object.freeze({pin:t}),e}function Vt(e){return typeof e=="function"&&typeof e[Jt]?.pin=="function"}function Ur(e,t,r){if(!Vt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Jt].pin(t,r)}var Vo,Jt,zr=B(()=>{Vo=new Set(["localhost","metadata.google.internal","metadata.goog"]);Jt=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Yo}from"node:crypto";import{types as we}from"node:util";function W(e){return Se(`HTTP JSON body refused: ${e}`)}function ii(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 we[t]=="function"&&we[t](e))}function si(e){let t=[],r=0,n=0,i=0,a=0,o=new WeakSet,s=u=>{if(r+=Buffer.byteLength(u,"utf8"),r>ye.bytes)throw W("serialized byte limit exceeded");t.push(u)},l=u=>{if(Buffer.byteLength(u,"utf8")>ye.bytes)throw W("serialized byte limit exceeded");return JSON.stringify(u)},f=(u,c)=>{if(n+=1,n>ye.nodes)throw W("node limit exceeded");if(c>ye.depth)throw W("depth limit exceeded");if(u===null){s("null");return}if(typeof u=="string"){s(l(u));return}if(typeof u=="boolean"){s(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw W("non-finite number");s(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw W("unsupported non-JSON value");if(we.isProxy(u))throw W("proxy value");if(ii(u))throw W("unsupported exotic object");if(o.has(u))throw W("cyclic value");o.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw W("symbol-keyed fields are unsupported");if(Array.isArray(u)){let p=Object.getPrototypeOf(u),m=0;for(;p!==null;){if(we.isProxy(p))throw W("proxy array prototype");if(m+=1,m>ye.depth)throw W("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(u.length>ye.arrayLength)throw W("array length limit exceeded");for(let E=0;E<u.length;E+=1){let x=Object.getOwnPropertyDescriptor(u,String(E));if(!x||!Object.hasOwn(x,"value")||x.enumerable!==!0)throw W("array entries must be dense enumerable own data")}let y=0;for(let E in u){if(a+=1,a>ye.fields)throw W("enumeration limit exceeded");if(Object.hasOwn(u,E)&&(y+=1,y>u.length))throw W("named array fields are unsupported")}if(y!==u.length)throw W("array entries must be dense enumerable own data");s("[");for(let E=0;E<u.length;E+=1)E&&s(","),f(Object.getOwnPropertyDescriptor(u,String(E)).value,c+1);s("]");return}let h=Object.getPrototypeOf(u);if(h!==Object.prototype&&h!==null)throw W("non-plain object");let d=[];for(let p in u){if(a+=1,a>ye.fields)throw W("enumeration limit exceeded");if(!Object.hasOwn(u,p))continue;if(i+=1,i>ye.fields)throw W("field limit exceeded");let m=Object.getOwnPropertyDescriptor(u,p);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw W("object fields must be enumerable own data");d.push([p,m.value])}s("{");for(let p=0;p<d.length;p+=1)p&&s(","),s(l(d[p][0])),s(":"),f(d[p][1],c+1);s("}")}finally{o.delete(u)}};return f(e,0),t.join("")}function ai(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(we.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 i=n.toLowerCase();if(r.has(i))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(i);let a=Object.getOwnPropertyDescriptor(e,n);if(!a||!Object.hasOwn(a,"value"))throw new TypeError("HTTP headers must contain own data properties");let o=a.value;if(o==null||["object","function","symbol"].includes(typeof o))throw new TypeError("HTTP header values must be scalar");t[n]=String(o)}return t}function li(){return Object.assign(Object.create(null),{Accept:"application/json"})}function ci(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 ui(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function bt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Kr.get(e);return t||(t=Yr,Yr+=1,Kr.set(e,t)),`reference:${t}`}function Zr(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?fi.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 Xr(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(Zr);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Zr(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&di.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function pi(e,t,r,n={},i=null){let a=Yo("sha256"),o=(l,f)=>{let u=String(f);a.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),a.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
2
- `)};o("method",e),o("url",t),Object.keys(r||{}).map((l,f)=>({name:l.toLowerCase(),order:f,value:String(r[l])})).sort((l,f)=>l.name.localeCompare(f.name)||l.order-f.order).forEach((l,f)=>{o(`header-name-${f}`,l.name),o(`header-value-${f}`,l.value)}),o("body",i??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])o(`context-${l}`,n[l]??"-");return a.digest("hex")}function hi(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Vr):Math.min(250*2**e,Vr)+Math.floor(Math.random()*100)}function Se(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Gt(e,t,r){return Se(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Pe(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function yi(e){return e?e.byteLength??e.length??0:0}async function wi(e,t,{url:r,truncate:n=!1,onOversize:i}={}){if(t==null)return await e.text();let a=Number(e.headers?.get?.("content-length"));if(Number.isFinite(a)&&a>t&&(Pe(e),!n))throw Gt(r,`content-length ${a}`,t);let o=e.body?.getReader?.();if(!o){let c=await e.text(),h=Buffer.byteLength(c,"utf8");if(h>t){if(!n)throw Gt(r,`body ${h} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let s=[],l=0,f=!1;try{for(;;){let{value:c,done:h}=await o.read();if(h)break;if(c&&(s.push(Buffer.from(c)),l+=yi(c),l>t)){f=!0;break}}}finally{if(f)try{await o.cancel()}catch{}try{o.releaseLock?.()}catch{}}if(f&&(typeof i=="function"&&i(),!n))throw Gt(r,`streamed ${l} bytes`,t);let u=Buffer.concat(s);return(f?u.subarray(0,t):u).toString("utf8")}function gi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function bi(e,{fetchImpl:t,method:r,headers:n,body:i,timeoutMs:a,lookupFn:o,realFetch:s,untrustedUrl:l=!1,maxResponseBytes:f=null,sameOriginRedirectsOnly:u=!1,importUndici:c,validateResponse:h,signal:d,redirectPolicy:p="follow",maxRedirects:m=Et}){let y=null,E=t,x=o?{lookupFn:o}:{};if(l&&!s&&!Vt(E))throw Se(`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 A=new AbortController,g=setTimeout(()=>A.abort(),a),v=d?Gr?Gr([d,A.signal]):d:A.signal,O=async(w,{status:M=null}={})=>{let q=await Ut(w,x);if(!q.ok)throw Se(M==null?`HTTP refused ${w}: ${q.error}`:`HTTP redirect to ${w} ${q.error}`,M==null?{}:{status:M});let J=new URL(w).hostname;if(s){if(y&&(await y.close(),y=null),!y)try{y=await zt({requireUndici:!0,...c?{importUndici:c}:{}})}catch(P){throw Se(M==null?`HTTP refused ${w}: ${P?.message||P}`:`HTTP redirect to ${w} refused: ${P?.message||P}`,M==null?{}:{status:M})}y.pin(J,q.addresses),E=y.fetch}else Ur(E,J,q.addresses);return q};try{let w=String(e),M=Object.assign(Object.create(null),n||{});l&&await O(w);for(let q=0;q<=m;q+=1){let J=Object.assign(Object.create(null),{method:r,headers:M,body:i,signal:v,redirect:"manual",dispatcher:void 0}),P=await E(w,J);if((p==="error"||m===0)&&P.status>=300&&P.status<400)throw Pe(P),Se(`HTTP ${P.status} ${r} redirect refused`,{status:P.status,redirectRefused:!0});if(oi.has(P.status)){let k=u===!0&&r==="POST"&&[307,308].includes(P.status)&&Xr(r,i);if(r!=="GET"&&r!=="HEAD"&&!k){Pe(P);let _=new Error(`HTTP ${P.status} ${r} ${w} redirected non-idempotent request`);throw _.status=P.status,_}if(q===m)throw Pe(P),Se(`HTTP ${P.status} ${r} redirect budget exhausted`,{status:P.status,redirectRefused:!0});let F=P.headers?.get?.("location"),L;try{L=ci(F,w)}catch(_){throw Pe(P),_}let R=!ui(L,w);if(Pe(P),R&&r==="POST"){let _=new Error(`HTTP ${P.status} ${r} cross-origin redirect refused`);throw _.status=P.status,_}if(R&&u){let _=new Error(`HTTP ${P.status} ${r} cross-origin redirect refused`);throw _.status=P.status,_.retryable=!1,_}if(R&&(M=li(M)),l)await O(L,{status:P.status});else if(R){let _=await Ut(L,x);if(!_.ok){let j=new Error(`HTTP redirect from ${w} ${_.error}`);throw j.status=P.status,j.retryable=!1,j}s&&_.addresses?.length&&(y||(y=await zt(c?{importUndici:c}:{})),y&&(y.pin(new URL(L).hostname,_.addresses),E=y.fetch))}w=L;continue}if(typeof h=="function")try{await h(P,{url:w})}catch(k){throw Pe(P),Se(k?.message||String(k))}let b=await wi(P,f,{url:w,onOversize:()=>A.abort()}),N=gi(b);if(!P.ok){let k=new Error(`HTTP ${P.status} ${r} ${w}`);throw k.status=P.status,k.retryAfter=P.headers?.get?.("retry-after")??null,k.body=N??b.slice(0,300),k}return N??b}throw new Error(`HTTP redirect loop for ${e}`)}catch(w){if(A.signal.aborted&&!et(d)){let M=w&&(typeof w=="object"||typeof w=="function")&&!we.isProxy(w)?w:null,q=M?Object.getOwnPropertyDescriptor(M,"oversize"):null;if(!(q&&Object.hasOwn(q,"value")&&q.value===!0))try{if(!M)throw new TypeError("unsafe rejection");Object.defineProperties(M,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let P=new Error("HTTP request timed out");throw Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),P}}throw w}finally{clearTimeout(g),y&&await y.close()}}async function Qr(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&we.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 j of Object.getOwnPropertyNames(t)){let I=Object.getOwnPropertyDescriptor(t,j);if(!(j==="toJSON"&&I&&Object.hasOwn(I,"value")&&I.value===void 0)){if(!r.has(j))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=j=>{if(t==null||!Object.hasOwn(t,j))return;let I=Object.getOwnPropertyDescriptor(t,j);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 i=n("method");if(i!==void 0&&(typeof i!="string"||!/^[A-Za-z]+$/u.test(i)))throw new TypeError("HTTP method must be a string token");let a=n("timeoutMs");if(a!==void 0&&(!Number.isInteger(a)||a<1||a>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let o=n("retries");if(o!==void 0&&(!Number.isInteger(o)||o<0||o>10))throw new TypeError("HTTP retries must be a bounded integer");let s=n("redirectPolicy");if(s!==void 0&&s!=="follow"&&s!=="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>Et))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Et}`);if(s==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let f=s??"follow",u=f==="error"?0:l??Et;for(let j of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let I=n(j);if(I!==void 0&&typeof I!="boolean")throw new TypeError(`HTTP ${j} must be boolean`)}let c=n("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let h=n("signal");if(h!==void 0){if(we.isProxy(h)||!(h instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{et(h)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let j of["importUndici","lookupFn","validateResponse"]){let I=n(j);if(I!==void 0&&typeof I!="function")throw new TypeError(`HTTP ${j} must be a function`)}let d=n("fetchImpl"),p=d||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=a??12e3,y=(i||"GET").toUpperCase(),E=n("headers"),x=ai(E),A=Object.assign(Object.create(null),x);Object.keys(A).some(j=>j.toLowerCase()==="accept")||(A.Accept="application/json");let g=n("body");g!=null&&typeof g!="string"&&(Object.keys(A).find(I=>I.toLowerCase()==="content-type")||(A["Content-Type"]="application/json"),g=si(g));let v=o??Xo,O=n("lookupFn"),w=!d,M=n("untrustedUrl")===!0,q=n("sameOriginRedirectsOnly")===!0,J=n("importUndici"),P=n("validateResponse"),b=h,N=c??null,k=async()=>{let j;for(let I=0;I<=v;I++){b&&ti.call(b);let ee=wt("http");try{let Q=await bi(e,{fetchImpl:p,method:y,headers:A,body:g,timeoutMs:m,lookupFn:O,realFetch:w,untrustedUrl:M,maxResponseBytes:N,sameOriginRedirectsOnly:q,importUndici:J,validateResponse:P,signal:b,redirectPolicy:f,maxRedirects:u});return ee?.("succeeded"),Q}catch(Q){j=Q;let oe=Ae=>{if(!Q||typeof Q!="object"&&typeof Q!="function"||we.isProxy(Q))return;let he=Object.getOwnPropertyDescriptor(Q,Ae);return he&&Object.hasOwn(he,"value")?he.value:void 0},pe=oe("status");ee?.("failed",pe);let ht=oe("oracleTimeout")===!0||oe("name")==="AbortError"||oe("name")==="TimeoutError"||et(b),mt=new Set([408,425,429]),Cr=oe("retryable")===!1?!1:pe!=null?mt.has(pe)||Zo.has(pe)&&Jr.has(y):!ht&&Jr.has(y);if(I===v||!Cr)throw Q;let Ye=hi(I,oe("retryAfter")),Ft=wt("retry"),Ze=!1;try{b?await new Promise((Ae,he)=>{let Fe,Oe=()=>{clearTimeout(Fe),Wr.call(b,"abort",Oe),he(ni(b)||new DOMException("Aborted","AbortError"))};if(et(b)){Oe();return}Fe=setTimeout(()=>{Wr.call(b,"abort",Oe),Ae()},Ye),ri.call(b,"abort",Oe,{once:!0}),et(b)&&Oe()}):await mi(Ye),Ze=!0}finally{Ft?.(Ze?"succeeded":"failed")}}}throw j};if(!(n("dedupe")!==!1&&!b&&Xr(y,g)))return k();let L=pi(y,e,A,{untrustedUrl:M,maxResponseBytes:N,sameOriginRedirectsOnly:q,redirectPolicy:f,maxRedirects:u,timeoutMs:m,retries:v,fetchImpl:bt(p),realFetch:w,lookupFn:bt(O),importUndici:bt(J),validateResponse:bt(P)},g),R=Wt.get(L);if(R){let j=wt("shared");try{let I=await R;return j?.("succeeded"),I}catch(I){throw j?.("failed"),I}}let _=k().finally(()=>Wt.delete(L));return Wt.set(L,_),_}var Zo,Jr,Xo,Vr,Qo,ei,ti,ri,Wr,Gr,et,ni,oi,Et,ul,ye,Wt,Kr,Yr,fi,di,mi,en=B(()=>{Dr();zr();Zo=new Set([408,425,429,500,502,503,504]),Jr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Xo=2,Vr=4e3,Qo=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ei=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ti=AbortSignal.prototype.throwIfAborted,ri=EventTarget.prototype.addEventListener,Wr=EventTarget.prototype.removeEventListener,Gr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,et=e=>e?Qo.call(e):!1,ni=e=>e?ei.call(e):void 0,oi=new Set([301,302,303,307,308]),Et=3,ul=64*1024,ye=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Wt=new Map,Kr=new WeakMap,Yr=1;fi=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),di=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);mi=e=>new Promise(t=>setTimeout(t,e))});import{types as tn}from"node:util";function Ei(e){if(!e||typeof e!="object"||tn.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function xt(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(tn.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let i=new Array(e.length);for(let a=0;a<e.length;a+=1){let o=Object.getOwnPropertyDescriptor(e,String(a));if(!o||!Object.hasOwn(o,"value"))throw new Error(`${t} arrays must contain dense own data`);i[a]=xt(o.value,t,r+1)}return i}if(!Ei(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let i of Object.keys(e)){let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${t} objects must contain own data`);n[i]=xt(a.value,t,r+1)}return n}var rn=B(()=>{});function Ti({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"?Si:xi}async function _e(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Ti(t);return xt(await Qr(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function nn(e={}){return _e({type:"meta"},e)}async function on({coin:e,interval:t="1h",startTime:r,endTime:n},i={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let a={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return _e(a,i)}async function sn({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return _e({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var xi,Si,tt=B(()=>{en();rn();xi="https://api.hyperliquid.xyz/info",Si="https://api.hyperliquid-testnet.xyz/info"});import{createHash as ki}from"node:crypto";function ce(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ce(e){return typeof e=="number"&&Number.isFinite(e)}function Zt(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Zt(t);return Object.freeze(e)}for(let t of Object.keys(e))Zt(e[t]);return Object.freeze(e)}function $e(e){if(Array.isArray(e))return e.map($e);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=$e(e[r]);return t}return e}function Kt(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function an(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Oi(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function vi(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Pi(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function cn(e){if(!ce(e))throw new TypeError("evidence artifact must be a plain object");if(!Ai.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!ce(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!ce(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!ce(e.train)||!ce(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return $e({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>$e(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function un(e){return ki("sha256").update(JSON.stringify(cn(e)),"utf8").digest("hex")}function ie(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function Yt(e,t){if(!ce(e)||!ce(e.metrics))throw new Error(`${t} metrics required`);let r=ie(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Ce(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function _i(e,{maxDailyLossPct:t}={}){let r=e.split,n=ie(r.trainStartIndex,"split.trainStartIndex"),i=ie(r.trainEndIndex,"split.trainEndIndex"),a=ie(r.trainBarCount,"split.trainBarCount",1),o=ie(r.holdoutStartIndex,"split.holdoutStartIndex"),s=ie(r.holdoutEndIndex,"split.holdoutEndIndex"),l=ie(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||i-n+1!==a||o!==i+1||s-o+1!==l)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Ce(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Yt(e.train,"train");let f=Yt(e.holdout,"holdout");if(f.tradeCount<1||f.netPnlUsd<=0||f.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Ce(t)&&f.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,c=u.windows;if(c.length<1||u.windowsRun!==c.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let h=0,d=-1;for(let m=0;m<c.length;m++){let y=c[m];if(!ce(y)||y.index!==m||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let E=ie(y.trainStartIndex,`walkForward.windows[${m}].trainStartIndex`),x=ie(y.trainEndIndex,`walkForward.windows[${m}].trainEndIndex`),A=ie(y.evalStartIndex,`walkForward.windows[${m}].evalStartIndex`),g=ie(y.evalEndIndex,`walkForward.windows[${m}].evalEndIndex`);if(E!==0||x>=A||A>g||A<=d)throw new Error("walk-forward windows must be chronological and disjoint");if(d=g,y.passed){if(h+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let v=Yt({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${m}]`);if(v.tradeCount<1||v.netPnlUsd<=0||v.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Ce(t)&&v.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(y.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let p=h/c.length;if(!Ce(u.passRate)||Math.abs(u.passRate-p)>Number.EPSILON||p<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function fn(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let r=cn(e),n=$e({id:e.id,...r});if(JSON.stringify($e(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let i=un(e);if(e.id!==i)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&_i(e,t),e}function Xt({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:i=3,minTrades:a=10}={}){let o=[];if(!ce(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!ce(r))throw new TypeError("backtestOptions must be a plain object");if(!Ce(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(i)||i<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(a)||a<0)throw new TypeError("minTrades must be an integer >= 0");let s=X(e),l=qe(s),f=je(t),u=t.length,c=(R=[],_={})=>ln({status:"fail",strategy:s,sHash:l,barsHash:f,split:_.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:_.train||null,holdout:_.holdout||null,walkForward:_.walkForward||{windows:[],passRate:0},flags:[...o,...R]});if(u<10)return c([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let h=Math.floor(u*n),d=h,p=u-d;if(h<5||p<3)return c([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:h,holdoutCount:p}]);let m=t.slice(0,h),y=t.slice(d),E,x;try{E=se(s,m,r),x=se(s,y,r)}catch(R){return c([{type:"backtest_error",message:String(R.message||R)}])}let A={metrics:Kt(E),costs:an(E),tradeCount:E.metrics.tradeCount},g={metrics:Kt(x),costs:an(x),tradeCount:x.metrics.tradeCount},v={trainStartIndex:0,trainEndIndex:h-1,trainBarCount:h,holdoutStartIndex:d,holdoutEndIndex:u-1,holdoutBarCount:p,trainFraction:n},O=[],w=Math.floor(u/(i+1));if(w<3)o.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:w});else for(let R=0;R<i;R++){let _=w*(R+1),j=_,I=Math.min(u,j+w);if(I-j<3||_<3){O.push({index:R,trainStartIndex:0,trainEndIndex:_-1,evalStartIndex:j,evalEndIndex:I-1,passed:!1,reason:"window_too_small",metrics:null});continue}let ee=t.slice(j,I),Q;try{Q=se(s,ee,r)}catch{O.push({index:R,trainStartIndex:0,trainEndIndex:_-1,evalStartIndex:j,evalEndIndex:I-1,passed:!1,reason:"backtest_error",metrics:null});continue}let oe=Kt(Q),pe=Pi(oe,s.risk,a);O.push({index:R,trainStartIndex:0,trainEndIndex:_-1,evalStartIndex:j,evalEndIndex:I-1,passed:pe,reason:pe?"pass":"fail_metrics",metrics:oe})}let M=O.filter(R=>R.passed).length,q=O.length===0?0:M/O.length,J={windows:O,passRate:q,windowsRun:O.length};g.metrics.tradeCount===0&&A.metrics.tradeCount===0&&o.push({type:"no_trades",message:"no trades in train or holdout"}),g.metrics.tradeCount===0&&o.push({type:"absent_oos_trades",message:"holdout produced no trades"}),g.metrics.netPnlUsd<0&&o.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),A.metrics.netPnlUsd>0&&g.metrics.netPnlUsd<0&&A.metrics.netPnlUsd>Math.abs(g.metrics.netPnlUsd)*.25?o.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):A.metrics.netPnlUsd>0&&g.metrics.netPnlUsd>0&&g.metrics.netPnlUsd<A.metrics.netPnlUsd*.1&&A.metrics.tradeCount>=a&&o.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let P=Oi(g.costs),b=vi(x);b>0&&P>b&&o.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let N=o.some(R=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(R.type)),k=o.some(R=>R.type==="overfit"),F="fail";return g.metrics.tradeCount>=a&&g.metrics.netPnlUsd>0&&g.metrics.profitFactor>1&&g.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&q>=.6&&!(b>0&&P>b)&&!k&&!o.some(R=>R.type==="severe_oos_collapse"||R.type==="invalid_windowing")?F="pass_live_eligible":!N&&g.metrics.tradeCount>0&&A.metrics.tradeCount>0&&Number.isFinite(g.metrics.netPnlUsd)?(F="pass_paper_only",g.metrics.tradeCount<a&&o.push({type:"undersampled",message:"holdout trades below minTrades"})):k&&g.metrics.tradeCount>0&&A.metrics.netPnlUsd>0?F="fail":g.metrics.tradeCount>0&&A.metrics.tradeCount>0&&!N?F="pass_paper_only":F="fail",g.metrics.netPnlUsd<0&&(F=F==="pass_live_eligible"?"fail":F==="pass_paper_only"?"pass_paper_only":"fail",F="fail"),ln({status:F,strategy:s,sHash:l,barsHash:f,split:v,train:A,holdout:g,walkForward:J,flags:o})}function ln({status:e,strategy:t,sHash:r,barsHash:n,split:i,train:a,holdout:o,walkForward:s,flags:l}){let f={status:e,strategyHash:r,compilerHash:ge,barsHash:n,split:i,train:a,holdout:o,walkForward:s,flags:l};return f.id=un(f),Zt($e(JSON.parse(JSON.stringify(f))))}var Ai,Qt=B(()=>{be();Ie();rt();Ai=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as $i,createHmac as Ii,timingSafeEqual as Tl}from"node:crypto";function er(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(er).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${er(e[r])}`).join(",")}}`}function dn(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function pn(e=process.env){return dn(process.env)||dn(e)}function Mi(e){let{prepareHash:t,prepareMac:r,note:n,...i}=e||{};return i}function Li(e){let t=Mi(e);return $i("sha256").update(er(t)).digest("hex")}function Hi(e,t=pn()){return t?Ii("sha256",t).update(String(e)).digest("hex"):""}function hn(e,{provider:t,kind:r,env:n=process.env,nowMs:i=Date.now(),expiresAtMs:a}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let o=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(o&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:o?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let l=Number(i),f=a==null?l+Ni:Number(a),u=f-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(f)||u<=0||u>Ri)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let h={...s,preparedAt:l,expiresAt:f,prepareVersion:ji},d=Li(h),p=pn(n),m=p?Hi(d,p):void 0,y={...h,prepareHash:d};return m&&(y.prepareMac=m),y}var ji,Ni,Ri,mn=B(()=>{ji=2,Ni=300*1e3,Ri=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function nt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ci(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function rr(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>rr(r,`${t}[${n}]`));return}if(nt(e))for(let[r,n]of Object.entries(e)){let i=Ci(r);if(Fi.some(a=>i.includes(a)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);rr(n,`${t}.${r}`)}}function tr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function yn({strategy:e,evidence:t,shadow:r,caps:n,nowMs:i=Date.now(),env:a=process.env}={}){if(rr({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!nt(e))throw new Error("handoff: strategy required");if(!nt(t))throw new Error("handoff: evidence required");if(!nt(r))throw new Error("handoff: shadow required");if(!nt(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>i)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let o=X(e,{nowMs:i}),s=K(o);if(fn(t,{maxDailyLossPct:o.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let l=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let h of l)if(!(h in n)||n[h]==null)throw new Error(`handoff: caps.${h} required`);if(!tr(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!tr(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!tr(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let f=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>f)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(h=>h==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>i))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},c={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:ot,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return hn(c,{provider:"hl-strategy",kind:"strategy-live-handoff",env:a})}var Fi,wn=B(()=>{be();Qt();Ie();mn();Fi=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Be(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function De(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function it(e){if(Array.isArray(e))for(let t of e)it(t);else if(e&&typeof e=="object")for(let t of Object.values(e))it(t);return Object.freeze(e)}function Ne(e){if(typeof e!="string")throw new TypeError("unsupported strategy interval");let t=qi[e];if(typeof t!="number")throw new TypeError("unsupported strategy interval");return t}function Bi(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");De(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let i=e[n];if(!i||typeof i!="object"||Array.isArray(i))throw new TypeError(`candles[${n}] must be an object`);let a=De(Number(i.t),`candles[${n}].t`);if(De(Number(i.T),`candles[${n}].T`)>t)continue;let s={t:a,o:Be(i.o,`candles[${n}].o`),h:Be(i.h,`candles[${n}].h`),l:Be(i.l,`candles[${n}].l`),c:Be(i.c,`candles[${n}].c`),v:Be(i.v,`candles[${n}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${n}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${n}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let l=r.get(a);if(l&&JSON.stringify(l)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${a}`);l||r.set(a,s)}return it([...r.values()].sort((n,i)=>n.t-i.t))}function Di(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let i=e[n];if(!i||typeof i!="object"||Array.isArray(i))throw new TypeError(`funding[${n}] must be an object`);let a=De(Number(i.time),`funding[${n}].time`);a>t||r.set(a,{time:a,fundingRate:Be(i.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,i)=>n.time-i.time)}async function Ui({coin:e,startTime:t,endTime:r},n){let i=[],a=Math.max(0,t-288e5),o=!1;for(let s=0;s<16&&a<=r;s++){n.signal?.throwIfAborted();let l=await sn({coin:e,startTime:a,endTime:r},n);if(!Array.isArray(l))throw new TypeError("Hyperliquid funding history must be an array");i.push(...l);let f=a;for(let u of l){let c=Number(u?.time);Number.isSafeInteger(c)&&c>f&&(f=c)}if(l.length<500||f>=r){o=!0;break}if(f<=a)throw new Error("Hyperliquid funding history pagination did not advance");a=f+1}if(!o)throw new Error("strategy history exceeds the bounded funding history limit");return Di(i,r)}function zi(e,t,r){let n=0,i=null;return e.map(a=>{let o=a.t+r,s=0;for(;n<t.length&&t[n].time<o;){let l=t[n];i=l.fundingRate,l.time>=a.t&&(s+=l.fundingRate),n+=1}return i==null?{...a,fundingPaymentRate:s}:{...a,fundingRate:i,fundingPaymentRate:s}})}async function St(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=e.coin;if(typeof r!="string"||r.length>32||!/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,31}|[a-z][a-z0-9]{0,15}:[A-Za-z0-9][A-Za-z0-9._-]{0,15})$/.test(r))throw new TypeError("coin must be a Hyperliquid market identifier");let n=String(e.interval||"15m"),i=Ne(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let a=De(e.endTime,"endTime"),o=e.count==null?1500:e.count;if(!Number.isInteger(o)||o<20||o>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,a-o*i):De(e.startTime,"startTime");if(s>=a)throw new TypeError("startTime must be before endTime");let[l,f]=await Promise.all([on({coin:r,interval:n,startTime:s,endTime:a},t),Ui({coin:r,startTime:s,endTime:a},t)]),u=Bi(l,{endTime:a}),c=it(zi(u,f,i));return it({coin:r,interval:n,range:{startTime:s,endTime:a},bars:c})}var qi,st=B(()=>{tt();qi=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function Wi(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let r of Object.keys(e))Vi.has(r)||t.push({path:`market.${r}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!Ji.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function Gi(e={}){let t=await nn(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var Ji,Vi,gn,bn=B(()=>{tt();wn();st();Ji=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Vi=new Set(["coin","interval"]);gn=Object.freeze({id:"hyperliquid",validateMarket:Wi,fetchBars:St,listMarkets:Gi,prepareIntent(e){return yn(e)}})});function Yi(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of Ki.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function nr(e){return typeof e!="string"?null:Zi.get(e)??null}function or(e){let t=nr(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Ki,En,Zi,Hl,ir=B(()=>{bn();Ki=Object.freeze(["id","validateMarket","prepareIntent"]);En=[gn].map(Yi),Zi=new Map(En.map(e=>[e.id,e])),Hl=Object.freeze([...En])});import{createHash as Xi}from"node:crypto";function ne(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function V(e){return typeof e=="number"&&Number.isFinite(e)}function Pn(e){return Number.isInteger(e)&&e>0}function ur(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ur(t);return Object.freeze(e)}for(let t of Object.keys(e))ur(e[t]);return Object.freeze(e)}function fr(e){if(Array.isArray(e))return e.map(fr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=fr(e[r]);return t}return e}function S(e,t,r){e.push({path:t,message:r})}function Te(e,t,r,n){for(let i of Object.keys(e))t.has(i)||S(n,r?`${r}.${i}`:i,"unknown field is not allowed")}function jn(e,t,r,n){if(!V(e)||!V(t)||!V(r)||!V(n)||n<=0||e<t||e>r)return!1;let i=(e-t)/n;if(!Number.isFinite(i))return!1;let a=Math.round(i);return Math.abs(i-a)<=1e-9}function cr(e,t,r,n){if(ne(e)){if(Te(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return S(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return S(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let i=r[e.param];return!ne(i)||![i.value,i.min,i.max,i.step].every(Pn)?(S(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Pn(e)?e:(S(n,t,"must be a positive integer or {param}"),null)}function _n(e,t,r,n){return ne(e)?(Te(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(S(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(S(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):V(e)?e:(S(n,t,"must be a finite number or {param}"),null)}function Tt(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function as(e){let t=new Map,r=n=>{let i=t.get(n)||0;if(i===1)return!0;if(i===2)return!1;t.set(n,1);let a=e.get(n);if(a){for(let o of Tt(a))if(e.has(o)&&r(o))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function ls(e,t){if(!ne(e))return S(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>An)return S(t,"parameters",`too many parameters (max ${An})`),null;let n={};for(let i of r){if(!$n.test(i)){S(t,`parameters.${i}`,"parameter name is malformed");continue}let a=e[i],o=`parameters.${i}`;if(!ne(a)){S(t,o,"must be a plain object");continue}Te(a,Sn,o,t);for(let c of Sn)c in a||S(t,`${o}.${c}`,"required field is missing");let{value:s,min:l,max:f,step:u}=a;V(l)||S(t,`${o}.min`,"must be a finite number"),V(f)||S(t,`${o}.max`,"must be a finite number"),(!V(u)||u<=0)&&S(t,`${o}.step`,"must be a positive finite number"),V(s)||S(t,`${o}.value`,"must be a finite number"),V(l)&&V(f)&&l>f&&S(t,`${o}.min`,"min must be <= max"),V(s)&&V(l)&&V(f)&&V(u)&&u>0&&(jn(s,l,f,u)||S(t,`${o}.value`,"value must lie on the declared min/max/step grid")),n[i]={value:s,min:l,max:f,step:u}}return n}function cs(e,t,r,n){let i=`nodes.${t}`;if(!ne(e))return S(n,i,"must be a plain object"),null;if(typeof e.type!="string"||!kn[e.type])return S(n,`${i}.type`,"unknown or missing node type"),Te(e,ss,i,n),null;switch(Te(e,kn[e.type],i,n),(typeof e.id!="string"||!In.test(e.id))&&S(n,`${i}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Qi.has(e.field))&&S(n,`${i}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let a=_n(e.value,`${i}.value`,r,n);return{id:e.id,type:"constant",value:a}}case"indicator":{(typeof e.indicator!="string"||!es.has(e.indicator))&&S(n,`${i}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let a=e.indicator,o={id:e.id,type:"indicator",indicator:a};if(a==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?S(n,`${i}.input`,"must be a node id string when provided"):o.input=e.input);let s=cr(e.period,`${i}.period`,r,n);s!=null&&(o.period=s)}else typeof e.input!="string"||!e.input?S(n,`${i}.input`,"must be a node id string"):o.input=e.input;if((a==="sma"||a==="ema"||a==="rsi"||a==="bollinger"||a==="atr")&&("period"in e,a!=="macd"))if(!("period"in e))S(n,`${i}.period`,"required field is missing");else{let s=cr(e.period,`${i}.period`,r,n);s!=null&&(o.period=s)}if(a==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))S(n,`${i}.${s}`,"required field is missing");else{let l=cr(e[s],`${i}.${s}`,r,n);l!=null&&(o[s]=l)}"output"in e?os.has(e.output)?o.output=e.output:S(n,`${i}.output`,"must be line|signal|histogram"):S(n,`${i}.output`,"required field is missing"),"period"in e&&S(n,`${i}.period`,"forbidden for macd"),"stdDev"in e&&S(n,`${i}.stdDev`,"forbidden for macd")}else if(a==="bollinger"){if(!("stdDev"in e))S(n,`${i}.stdDev`,"required field is missing");else{let s=_n(e.stdDev,`${i}.stdDev`,r,n);s!=null&&(typeof s=="number"&&s<=0?S(n,`${i}.stdDev`,"must be > 0"):o.stdDev=s)}"output"in e?is.has(e.output)?o.output=e.output:S(n,`${i}.output`,"must be upper|middle|lower"):S(n,`${i}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&S(n,`${i}.${s}`,`forbidden for ${a}`)}else{"output"in e&&S(n,`${i}.output`,`forbidden for ${a}`),"stdDev"in e&&a!=="bollinger"&&S(n,`${i}.stdDev`,`forbidden for ${a}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&S(n,`${i}.${s}`,`forbidden for ${a}`)}return o}case"compare":return(typeof e.op!="string"||!ts.has(e.op))&&S(n,`${i}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&S(n,`${i}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&S(n,`${i}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!rs.has(e.op))&&S(n,`${i}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return S(n,`${i}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let a=[];for(let o=0;o<e.inputs.length;o++){let s=e.inputs[o];typeof s!="string"||!s?S(n,`${i}.inputs.${o}`,"must be a node id"):a.push(s)}return e.op==="not"?a.length!==1&&S(n,`${i}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&a.length<2&&S(n,`${i}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:a}}case"cross":return(typeof e.direction!="string"||!ns.has(e.direction))&&S(n,`${i}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&S(n,`${i}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&S(n,`${i}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function us(e,t,r){if(!ne(e))return S(t,"risk","must be a plain object"),null;Te(e,Tn,"risk",t);for(let h of Tn)(!(h in e)||e[h]==null)&&S(t,`risk.${h}`,"required field is missing");let n={},i=e.maxLeverage;!V(i)||i<=0||i>50?S(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=i;let a=e.maxNotionalUsd;!V(a)||a<=0?S(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=a;let o=e.positionSizePct;!V(o)||o<=0||o>100?S(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=o;let s=e.stopLossPct;!V(s)||s<=0||s>100?S(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=s;let l=e.takeProfitPct;!V(l)||l<=0||l>1e3?S(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=l;let f=e.cooldownBars;!Number.isInteger(f)||f<0||f>1e5?S(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=f;let u=e.maxDailyLossPct;!V(u)||u<=0||u>100?S(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=u;let c=e.expiresAt;return!Number.isInteger(c)||c<=0?S(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?c<=r.nowMs&&S(t,"risk.expiresAt","must be strictly greater than nowMs"):S(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=c),n}function dr(e,t={}){let r=[];if(!ne(e))return S(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};Te(e,xn,"",r);for(let c of xn)(!(c in e)||e[c]==null)&&S(r,c,"required field is missing");e.version!==sr&&S(r,"version",`must be ${sr}`),(typeof e.id!="string"||!$n.test(e.id))&&S(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>vn)&&S(r,"name",`must be a non-empty string max ${vn}`);let n=nr(e.venue);n||S(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let i=null;if(!n)ne(e.market)||S(r,"market","must be a plain object");else{let c=n.validateMarket(e.market);if(!c||typeof c.ok!="boolean"||!Array.isArray(c.errors))S(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(c.ok)i=c.market;else for(let h of c.errors)S(r,h.path,h.message)}let a=ls(e.parameters,r),o=null,s=new Map;if(!Array.isArray(e.nodes))S(r,"nodes","must be an array");else if(e.nodes.length>On)S(r,"nodes",`too many nodes (max ${On})`);else{o=[];for(let c=0;c<e.nodes.length;c++){let h=cs(e.nodes[c],c,a||{},r);h&&(typeof h.id=="string"&&In.test(h.id)&&(s.has(h.id)?S(r,`nodes.${c}.id`,`duplicate node id "${h.id}"`):s.set(h.id,h)),o.push(h))}for(let c=0;c<o.length;c++){let h=o[c],d=`nodes.${c}`;for(let p of Tt(h))s.has(p)||S(r,d,`unknown node ref "${p}"`);if(h.type==="indicator"||h.type==="compare"||h.type==="cross")for(let p of Tt(h)){let m=s.get(p);m&&ar.has(m.type)&&S(r,d,`node ref "${p}" must be numeric`)}if(h.type==="logic")for(let p of Tt(h)){let m=s.get(p);m&&!ar.has(m.type)&&S(r,d,`node ref "${p}" must be boolean`)}}as(s)&&S(r,"nodes","graph contains a cycle")}let l=null;if(!ne(e.rules))S(r,"rules","must be a plain object");else{Te(e.rules,lr,"rules",r);for(let c of lr)c in e.rules||S(r,`rules.${c}`,"required field is missing");l={};for(let c of lr){let h=e.rules[c];if(h===null){l[c]=null;continue}if(typeof h!="string"||!h){S(r,`rules.${c}`,"must be a node id or null"),l[c]=h;continue}if(!s.has(h)){S(r,`rules.${c}`,`unknown node ref "${h}"`),l[c]=h;continue}let d=s.get(h);ar.has(d.type)||S(r,`rules.${c}`,`rule must reference a boolean node, not ${d.type}`),l[c]=h}}let f=us(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let u=ur({version:sr,id:e.id,name:e.name,venue:n.id,market:i,parameters:a,nodes:o,rules:l,risk:f});return{ok:!0,errors:[],strategy:u}}function X(e,t={}){let r=dr(e,t);if(!r.ok)throw new Ue(r.errors);return r.strategy}function fs(e){let t=X(e);return JSON.stringify(fr(t))}function qe(e){let t=fs(e);return Xi("sha256").update(t,"utf8").digest("hex")}function at(e,t){if(!ne(e))throw new Ue([{path:"",message:"strategy must be a plain object"}]);if(!ne(t))throw new Ue([{path:"overrides",message:"must be a plain object"}]);let r=X(e),n={};for(let[a,o]of Object.entries(r.parameters))n[a]={value:o.value,min:o.min,max:o.max,step:o.step};let i=[];for(let[a,o]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,a)){S(i,a,`unknown parameter "${a}"`);continue}let s=n[a];if(!V(o)){S(i,a,"override must be a finite number");continue}if(!jn(o,s.min,s.max,s.step)){S(i,a,"override must lie on the declared min/max/step grid");continue}n[a]={...s,value:o}}if(i.length)throw new Ue(i);return X({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(a=>{let o={...a};return Array.isArray(a.inputs)&&(o.inputs=[...a.inputs]),o}),rules:{...r.rules},risk:{...r.risk}})}var sr,$n,In,Qi,es,ts,rs,ns,os,is,ar,xn,Sn,lr,Tn,ss,kn,An,On,vn,Ue,Ie=B(()=>{ir();sr=1,$n=/^[a-z0-9][a-z0-9._-]{0,63}$/,In=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Qi=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),es=new Set(["sma","ema","rsi","macd","bollinger","atr"]),ts=new Set(["gt","gte","lt","lte","eq"]),rs=new Set(["and","or","not"]),ns=new Set(["above","below"]),os=new Set(["line","signal","histogram"]),is=new Set(["upper","middle","lower"]),ar=new Set(["compare","logic","cross"]),xn=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Sn=new Set(["value","min","max","step"]),lr=new Set(["entryLong","entryShort","exitLong","exitShort"]),Tn=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),ss=new Set(["id","type"]),kn={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},An=16,On=128,vn=100,Ue=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function lt(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function ke(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function ds(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let i=r[n];if(typeof i!="number"||!Number.isFinite(i))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function Rn(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let i=0;i<e.length;i++)n+=e[i],i>=t&&(n-=e[i-t]),i>=t-1&&(r[i]=n/t);return r}function kt(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<t;o++)n+=e[o];let i=n/t;r[t-1]=i;let a=2/(t+1);for(let o=t;o<e.length;o++)i=a*e[o]+(1-a)*i,r[o]=i;return r}function Mn(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,i=0;for(let s=1;s<=t;s++){let l=e[s]-e[s-1];l>=0?n+=l:i-=l}let a=n/t,o=i/t;r[t]=Nn(a,o);for(let s=t+1;s<e.length;s++){let l=e[s]-e[s-1],f=l>0?l:0,u=l<0?-l:0;a=(a*(t-1)+f)/t,o=(o*(t-1)+u)/t,r[s]=Nn(a,o)}return r}function Nn(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Ln(e,t={}){lt(e);let r=t.fastPeriod,n=t.slowPeriod,i=t.signalPeriod;if(ke(r),ke(n),ke(i),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let a=kt(e,r),o=kt(e,n),s=new Array(e.length).fill(null);for(let c=0;c<e.length;c++)a[c]!=null&&o[c]!=null&&(s[c]=a[c]-o[c]);let l=new Array(e.length).fill(null),f=new Array(e.length).fill(null),u=[];for(let c=0;c<s.length;c++)s[c]!=null&&u.push(c);if(u.length>=i){let c=0;for(let m=0;m<i;m++)c+=s[u[m]];let h=c/i,d=u[i-1];l[d]=h,f[d]=s[d]-h;let p=2/(i+1);for(let m=i;m<u.length;m++){let y=u[m];h=p*s[y]+(1-p)*h,l[y]=h,f[y]=s[y]-h}}return{line:s,signal:l,histogram:f}}function Hn(e,t={}){lt(e);let r=t.period,n=t.stdDev;if(ke(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let i=new Array(e.length).fill(null),a=new Array(e.length).fill(null),o=new Array(e.length).fill(null);if(e.length<r)return{upper:a,middle:i,lower:o};let s=0,l=0;for(let f=0;f<e.length;f++){let u=e[f];if(s+=u,l+=u*u,f>=r){let c=e[f-r];s-=c,l-=c*c}if(f>=r-1){let c=s/r,h=l/r-c*c;h<0&&h>-1e-12&&(h=0);let d=Math.sqrt(h);i[f]=c,a[f]=c+n*d,o[f]=c-n*d}}return{upper:a,middle:i,lower:o}}function Fn(e,t){ds(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let o=0;o<e.length;o++){let s=e[o];if(o===0)n[o]=s.h-s.l;else{let l=e[o-1].c;n[o]=Math.max(s.h-s.l,Math.abs(s.h-l),Math.abs(s.l-l))}}let i=0;for(let o=0;o<t;o++)i+=n[o];let a=i/t;r[t-1]=a;for(let o=t;o<e.length;o++)a=(a*(t-1)+n[o])/t,r[o]=a;return r}var Cn=B(()=>{});import{createHash as ps}from"node:crypto";var pr,hs,ms,ys,qn,Bn=B(()=>{pr=3,hs="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",ms="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",ys="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",qn=ps("sha256").update(JSON.stringify({version:pr,compilerSourceHash:hs,indicatorsSourceHash:ms,schemaSourceHash:ys})).digest("hex")});function te(e){return typeof e=="number"&&Number.isFinite(e)}function bs(e){let t=new Map(e.map(s=>[s.id,s])),r=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},n=new Map,i=new Map;for(let s of e)n.set(s.id,0),i.set(s.id,[]);for(let s of e)for(let l of r(s))t.has(l)&&(i.get(l).push(s.id),n.set(s.id,n.get(s.id)+1));let a=[];for(let[s,l]of n)l===0&&a.push(s);let o=[];for(;a.length;){let s=a.shift();o.push(s);for(let l of i.get(s))n.set(l,n.get(l)-1),n.get(l)===0&&a.push(l)}if(o.length!==e.length)throw new Error("strategy graph is cyclic");return o}function ze(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Es(e,t,r){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let n=null;for(let i=0;i<=t;i++){let a=e[i];if(a==null||typeof a!="object"||Array.isArray(a))throw new TypeError(`bars[${i}] must be an object`);let{t:o,o:s,h:l,l:f,c:u,v:c}=a;if(!te(o)&&(typeof o=="number"&&Number.isFinite(o)),!Number.isFinite(o))throw new TypeError(`bars[${i}].t must be finite`);for(let[h,d]of[["o",s],["h",l],["l",f],["c",u],["v",c]])if(!te(d))throw new TypeError(`bars[${i}].${h} must be a finite number`);for(let[h,d]of[["o",s],["h",l],["l",f],["c",u]])if(!(d>0))throw new TypeError(`bars[${i}].${h} price must be positive`);if(c<0)throw new TypeError(`bars[${i}].v volume must be non-negative`);if(l<Math.max(s,u,f))throw new TypeError(`bars[${i}] high must be >= max(open, close, low)`);if(f>Math.min(s,u,l))throw new TypeError(`bars[${i}] low must be <= min(open, close, high)`);if(n!=null){if(!(o>n))throw new TypeError("bars t must be strictly increasing");if(o-n!==gs[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=o,"fundingRate"in a&&a.fundingRate!=null&&!te(a.fundingRate))throw new TypeError(`bars[${i}].fundingRate must be finite when present`);if("openInterest"in a&&a.openInterest!=null){if(!te(a.openInterest))throw new TypeError(`bars[${i}].openInterest must be finite when present`);if(a.openInterest<0)throw new TypeError(`bars[${i}].openInterest must be non-negative`)}for(let h of["premium","oiDelta"])if(h in a&&a[h]!=null&&!te(a[h]))throw new TypeError(`bars[${i}].${h} must be finite when present`);if("bookImbalance"in a&&a.bookImbalance!=null){if(!te(a.bookImbalance))throw new TypeError(`bars[${i}].bookImbalance must be finite when present`);if(a.bookImbalance<-1||a.bookImbalance>1)throw new TypeError(`bars[${i}].bookImbalance must be within [-1, 1]`)}}}function Re(e,t,r,n,i,a){if(a.has(e))return a.get(e);let o=t.get(e),s;switch(o.type){case"input":{let l=ws[o.field];s=new Array(i+1);for(let f=0;f<=i;f++){let u=n[f][l];s[f]=u===void 0?null:u}break}case"constant":{let l=ze(o.value,r);s=new Array(i+1).fill(l);break}case"indicator":{let l=o.period!=null?ze(o.period,r):void 0;if(o.indicator==="atr"){let c=[];for(let h=0;h<=i;h++){let d=n[h];c.push({o:d.o,h:d.h,l:d.l,c:d.c})}s=Fn(c,l);break}let u=Re(o.input,t,r,n,i,a).map((c,h)=>{if(c==null||!te(c))throw new TypeError(`indicator input ${o.input} has non-finite value at ${h}`);return c});if(o.indicator==="sma")s=Rn(u,l);else if(o.indicator==="ema")s=kt(u,l);else if(o.indicator==="rsi")s=Mn(u,l);else if(o.indicator==="macd")s=Ln(u,{fastPeriod:ze(o.fastPeriod,r),slowPeriod:ze(o.slowPeriod,r),signalPeriod:ze(o.signalPeriod,r)})[o.output];else if(o.indicator==="bollinger")s=Hn(u,{period:l,stdDev:ze(o.stdDev,r)})[o.output];else throw new Error(`unsupported indicator ${o.indicator}`);break}case"compare":{let l=Re(o.left,t,r,n,i,a),f=Re(o.right,t,r,n,i,a);s=new Array(i+1);for(let u=0;u<=i;u++){let c=l[u],h=f[u];if(c==null||h==null||!te(c)||!te(h)){s[u]=!1;continue}switch(o.op){case"gt":s[u]=c>h;break;case"gte":s[u]=c>=h;break;case"lt":s[u]=c<h;break;case"lte":s[u]=c<=h;break;case"eq":s[u]=c===h;break;default:s[u]=!1}}break}case"logic":{let l=o.inputs.map(f=>Re(f,t,r,n,i,a));s=new Array(i+1);for(let f=0;f<=i;f++)if(o.op==="not"){let u=l[0][f];s[f]=u===!0?!1:u===!1}else if(o.op==="and"){let u=!0;for(let c of l)if(c[f]!==!0){u=!1;break}s[f]=u}else if(o.op==="or"){let u=!1;for(let c of l)if(c[f]===!0){u=!0;break}s[f]=u}else s[f]=!1;break}case"cross":{let l=Re(o.left,t,r,n,i,a),f=Re(o.right,t,r,n,i,a);s=new Array(i+1),s[0]=!1;for(let u=1;u<=i;u++){let c=l[u-1],h=f[u-1],d=l[u],p=f[u];if(c==null||h==null||d==null||p==null||!te(c)||!te(h)||!te(d)||!te(p)){s[u]=!1;continue}o.direction==="above"?s[u]=c<=h&&d>p:s[u]=c>=h&&d<p}break}default:throw new Error(`unknown node type ${o.type}`)}return a.set(e,s),s}function K(e,t={}){let r=X(e);t&&Object.keys(t).length&&(r=at(r,t));let n=new Map(r.nodes.map(d=>[d.id,d])),i=Object.freeze(bs(r.nodes)),a=r.parameters,o=new Set(r.nodes.filter(d=>d.type==="input").map(d=>d.field));if(r.nodes.some(d=>d.type==="indicator"&&d.indicator==="atr"))for(let d of["open","high","low","close"])o.add(d);let s=Object.freeze([...o].sort()),l=qe(r);function f(d,p){let m={};for(let E of i){let x=d.get(E);m[E]=x[p]}let y=E=>E!=null&&m[E]===!0;return{values:m,signals:{entryLong:y(r.rules.entryLong),entryShort:y(r.rules.entryShort),exitLong:y(r.rules.exitLong),exitShort:y(r.rules.exitShort)}}}function u(d,p){Es(d,p,r.market.interval);let m=new Map;for(let y of i)Re(y,n,a,d,p,m);return m}function c(d,p){return f(u(d,p),p)}function h(d){if(!Array.isArray(d)||d.length===0)throw new TypeError("bars must be a non-empty array");let p=d.length-1,m=u(d,p);return Object.freeze(d.map((y,E)=>Object.freeze(f(m,E))))}return Object.freeze({strategy:r,strategyHash:l,compilerVersion:ot,compilerHash:ge,requiredSeries:s,nodeOrder:i,evaluate:c,evaluateAll:h})}var ot,ge,ws,gs,be=B(()=>{Ie();Cn();Bn();ot=pr,ge=qn,ws=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),gs=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as xs}from"node:crypto";function Ts(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ue(e){return typeof e=="number"&&Number.isFinite(e)}function hr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)hr(t);return Object.freeze(e)}for(let t of Object.keys(e))hr(e[t]);return Object.freeze(e)}function At(e){if(Array.isArray(e))return e.map(At);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=At(e[r]);return t}return e}function mr(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((r,n)=>mr(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))mr(n,`${t}.${r}`)}}function Un(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:i,o:a,h:o,l:s,c:l,v:f}=n;if(!ue(i))throw new TypeError(`bars[${r}].t must be finite`);for(let[u,c]of[["o",a],["h",o],["l",s],["c",l],["v",f]])if(!ue(c))throw new TypeError(`bars[${r}].${u} must be a finite number`);for(let[u,c]of[["o",a],["h",o],["l",s],["c",l]])if(!(c>0))throw new TypeError(`bars[${r}].${u} price must be positive`);if(f<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(o<Math.max(a,l,s))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(s>Math.min(a,l,o))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(i>t))throw new TypeError("bars t must be strictly increasing");if(t=i,"fundingRate"in n&&n.fundingRate!=null&&!ue(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!ue(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!ue(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function je(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Un(e),xs("sha256").update(JSON.stringify(At(e)),"utf8").digest("hex")}function ks(e){if(e==null&&(e={}),!Ts(e))throw new TypeError("options must be a plain object");let t={...Ss},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!ue(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let i=e[n];if(!ue(i)||i<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?i>=1e4:i>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=i}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!ue(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function Ot(e){return e/1e4}function As(e,t,r){let n=Ot(r);return t==="long"?e*(1+n):e*(1-n)}function Os(e,t,r){let n=Ot(r);return t==="long"?e*(1-n):e*(1+n)}function Dn(e,t,r){let n=Math.abs(e)*Ot(t),i=Math.abs(e)*Ot(r);return{taker:n,builder:i,total:n+i}}function vs(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function Ps(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function _s(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function $s(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let i=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-i):e*(1+1/r)/(1+i)}function Is(e,t,r){return t==="long"?e.l<=r:e.h>=r}function js(e,t,r){return t==="long"?e.h>=r:e.l<=r}function Ns(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ct(e,t){for(let r of e.requiredSeries)if(Rs.includes(r)&&!t.every(n=>ue(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function Ms(e){if(e.length<3)return 0;let t=[];for(let o=1;o<e.length;o++){let s=e[o-1].equity,l=e[o].equity;s>0&&t.push((l-s)/s)}if(t.length<2)return 0;let r=0;for(let o of t)r+=o;let n=r/t.length,i=0;for(let o of t)i+=(o-n)**2;let a=Math.sqrt(i/(t.length-1));return a>0?n/a:0}function Ls(e){let t=-1/0,r=0;for(let n of e){let i=n.equity;if(i>t&&(t=i),t>0){let a=(t-i)/t*100;a>r&&(r=a)}}return r}function se(e,t,r={}){let n=ks(r);Un(t);let i=je(t);n.nowMs!==void 0&&X(e,{nowMs:n.nowMs});let a=K(e);if(ct(a,t),n.nowMs!==void 0&&a.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let o=a.strategy.risk,s=a.evaluateAll(t),l=n.latencyBars,f=n.slippageBps,u=n.takerFeeBps,c=n.builderFeeBps,h=n.initialEquityUsd,d=0,p=0,m=0,y=0,E=0,x=[],A=[],g=[],v=[],O=[],w=null,M=0,q=null,J=h,P=!1,b=0,N=0,k=[],F=new Array(t.length).fill(0);function L(T){k.push(T)}function R(T){let H=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,H-F[T])}function _(T){if(!w)return h;let H=w.side==="long"?(T-w.entryPrice)*w.qty:(w.entryPrice-T)*w.qty;return h+H}function j(T,H,$){let U=$.o,C=vs(h,o);if(!(C>0)||!(U>0))return;let z=As(U,H,f),D=C/z,G=R(T),Xe=z*G;if(D>G){g.push({kind:"entry",barIndex:T,time:$.t,side:H,requestedNotionalUsd:C,maxFillNotionalUsd:Xe,reason:"volume_participation"});return}F[T]+=D;let le=Math.abs(z-U)*D,me=Dn(C,u,c);h-=me.total,d+=me.taker,p+=me.builder,y+=le,E+=C,w={lifecycleEpoch:++N,side:H,entryBarIndex:T,entryReferencePrice:U,entryPrice:z,qty:D,notionalUsd:C,stop:Ps(z,H,o.stopLossPct),take:_s(z,H,o.takeProfitPct),liq:$s(z,H,o.maxLeverage,u+c),entryFees:me.taker,entryBuilderFees:me.builder,entrySlippageUsd:le,fundingAccrued:0}}function I(T,H,$,U){if(!w)return!1;let C=w.side,z=H,D=z;$!=="liquidation"&&U&&(D=Os(z,C,f));let G=w.qty,Xe=G*D;if($!=="liquidation"){let Br=R(T),Co=D*Br;if(G>Br)return g.push({kind:"exit",barIndex:T,time:t[T].t,side:C,requestedNotionalUsd:Xe,maxFillNotionalUsd:Co,reason:"volume_participation",triggerReason:$}),!1;F[T]+=G}let le=Dn(Xe,u,c),me=$==="liquidation"?0:Math.abs(D-z)*G,Qe,qt;C==="long"?(Qe=(z-w.entryReferencePrice)*G,qt=(D-w.entryPrice)*G):(Qe=(w.entryReferencePrice-z)*G,qt=(w.entryPrice-D)*G),h+=qt,h-=le.total,d+=le.taker,p+=le.builder,y+=me,E+=Xe;let Fo={side:C,entryBarIndex:w.entryBarIndex,entryTime:t[w.entryBarIndex].t,entryPrice:w.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:D,exitReason:$,qty:G,notionalUsd:w.notionalUsd,grossPnlUsd:Qe,feesUsd:w.entryFees+le.taker,builderFeesUsd:w.entryBuilderFees+le.builder,fundingUsd:w.fundingAccrued,slippageUsd:w.entrySlippageUsd+me,netPnlUsd:Qe-(w.entryFees+le.taker+w.entryBuilderFees+le.builder)-w.fundingAccrued-(w.entrySlippageUsd+me)};return x.push(Fo),$==="liquidation"&&A.push({barIndex:T,time:t[T].t,side:C,price:D,tradeIndex:x.length-1}),w=null,N+=1,b=T+1+(o.cooldownBars||0),!0}function ee(T,H,$,U){let C=T+1;if(C>=t.length)return;k.some(D=>D.kind==="exit"&&D.side===H&&D.fillBar===C&&D.epoch===U)||L({kind:"exit",side:H,signalBar:T,fillBar:C,reason:$,epoch:U})}function Q(T){let H=k.filter($=>$.fillBar===T);for(let $=k.length-1;$>=0;$--)k[$].fillBar===T&&k.splice($,1);H.sort(($,U)=>{let C=z=>z.kind==="exit"?0:1;return C($)-C(U)});for(let $ of H)if($.kind==="exit"){if(!w||w.side!==$.side||w.lifecycleEpoch!==$.epoch)continue;let U=$.reason||"rule";I(T,t[T].o,U,!0)||ee(T,$.side,U,$.epoch)}else if($.kind==="entry"){if(w||$.epoch!==N||T<b)continue;j(T,$.side,t[T])}}function oe(T){if(!w)return;let H=t[T],$=H.fundingPaymentRate;if($==null||!ue($)||$===0)return;let U=Math.abs(w.qty*H.c),C=$*U;w.side==="long"?(h-=C,w.fundingAccrued+=C,m+=C):(h+=C,w.fundingAccrued-=C,m-=C)}function pe(T){if(!w)return;let H=t[T].o;(w.side==="long"?H<=w.liq:H>=w.liq)&&I(T,H,"liquidation",!1)}function ht(T){if(!w)return;let H=t[T],$=w.side,U=Ns(H,$,w.liq),C=Is(H,$,w.stop),z=js(H,$,w.take),D=G=>$==="long"?Math.min(G,H.o):Math.max(G,H.o);if(U){I(T,D(w.liq),"liquidation",!1);return}if(C&&z){I(T,D(w.stop),"stop_loss",!0)||ee(T,$,"stop_loss",w.lifecycleEpoch);return}if(C){I(T,D(w.stop),"stop_loss",!0)||ee(T,$,"stop_loss",w.lifecycleEpoch);return}z&&(I(T,w.take,"take_profit",!0)||ee(T,$,"take_profit",w.lifecycleEpoch))}for(let T=0;T<t.length;T++){let H=Math.floor(t[T].t/864e5);H!==q&&(q=H,J=_(t[T].o),P=!1),pe(T),Q(T),ht(T),oe(T),!P&&_(t[T].c)<=J*(1-o.maxDailyLossPct/100)&&(P=!0,v.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=s[T].signals,U=T+l;if(w)(w.side==="long"&&$.exitLong===!0||w.side==="short"&&$.exitShort===!0)&&U<t.length&&(k.some(G=>G.kind==="exit"&&G.side===w.side&&G.fillBar===U&&G.epoch===w.lifecycleEpoch)||L({kind:"exit",side:w.side,signalBar:T,fillBar:U,reason:"rule",epoch:w.lifecycleEpoch}));else{let z=$.entryLong===!0,D=$.entryShort===!0;z&&D?v.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!P&&(z||D)&&U<t.length&&T>=b&&L({kind:"entry",side:z?"long":"short",signalBar:T,fillBar:U,epoch:N})}let C=h;w&&(M+=1,C=_(t[T].c)),O.push({barIndex:T,time:t[T].t,equity:C,positionSide:w?w.side:null})}let mt=null;if(w){let T=t.length-1;if(I(T,t[T].c,"end_of_data",!0))O[T]={barIndex:T,time:t[T].t,equity:h,positionSide:null};else{let $=_(t[T].c);mt={side:w.side,entryBarIndex:w.entryBarIndex,entryTime:t[w.entryBarIndex].t,entryPrice:w.entryPrice,qty:w.qty,notionalUsd:w.notionalUsd,markPrice:t[T].c,markedEquityUsd:$},v.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ye=(w?_(t[t.length-1].c):h)-n.initialEquityUsd,Ft=Ye/n.initialEquityUsd*100,Ze=0,Ae=0,he=0;for(let T of x)T.netPnlUsd>0?(Ze+=1,Ae+=T.netPnlUsd):T.netPnlUsd<0&&(he+=-T.netPnlUsd);let Fe=x.length,Oe=Fe===0?0:Ze/Fe,Ct=0;he>0?Ct=Ae/he:Ae>0&&(Ct=1e12);let Lo={netPnlUsd:Ye,netPnlPct:Ft,maxDrawdownPct:Ls(O),winRate:Oe,profitFactor:Ct,tradeCount:Fe,sharpe:Ms(O),turnoverUsd:E,exposurePct:M/t.length*100},Ho={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},qr={barsHash:i,strategyHash:a.strategyHash,compilerHash:ge,compilerVersion:ot,config:Ho,trades:x,equityCurve:O,metrics:Lo,costs:{feesUsd:d,builderFeesUsd:p,fundingUsd:m,slippageUsd:y},liquidations:A,missedFills:g,openPositionAtEnd:mt,flags:v};return mr(qr),hr(At(qr))}var Ss,Rs,rt=B(()=>{be();Ie();Ss=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});Rs=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as Hs}from"node:crypto";function Js(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function yr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)yr(t);return Object.freeze(e)}for(let t of Object.keys(e))yr(e[t]);return Object.freeze(e)}function Vs(e){return String(e).trim().replace(/\s+/g," ")}function Ws(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Gs(e){for(let r of Cs)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function Ks(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let r=t[1].toLowerCase();return Fs.has(r)?r:null}function Ys(e){let t={...Bs},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[1]));let i=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);i&&(t.maxLeverage=Number(i[1]));let a=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);a&&(t.positionSizePct=Number(a[1]));let o=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return o&&(t.maxNotionalUsd=Number(o[1])),t}function Zs(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(r=>(e.match(r)??[]).length>1)}function Xs(e){let t=Hs("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),i=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(i)?i:`d${i}`.slice(0,64)}function Qs(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let r=Number(t[1]),n=t[2].toLowerCase(),i=Number(t[3]);if(!(r>0)||!(i>0)||r===i)return null;let a=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:i,direction:n,reverse:a}}function ea(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function ta(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function ra(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:r}}function na(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?(t[3]==="%"&&(r=r/100),{kind:"premium",op:t[1].toLowerCase(),threshold:r}):null}function oa(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:r}:null}function ia(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<-1||r>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:r}}function sa(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?r=r.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?r=r.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?r=r.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?r=r.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let i of n)r=r.replace(i,"");return r.replace(/[\s,;]+/g,"")===""}function zn(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function aa({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:s.direction,left:"emaLeft",right:"emaRight"}],f={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?f.entryLong="cross":f.entryShort="cross",s.reverse){let u=s.direction==="above"?"below":"above";l.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?f.exitLong="crossRev":f.exitShort="crossRev"}return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:zn(s.fast),ema_right_period:zn(s.slow)},nodes:l,rules:f,risk:{...n,expiresAt:i}}}function la({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:s.period},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function ca({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function ua({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function da({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let f=[{id:"sig_input",type:"input",field:fa[s.kind]},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:f,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function Jn(e,t={}){if(typeof e!="string")throw new Y("prompt must be a string");if(e.length>1e3)throw new Y("prompt length must be <= 1000");if(!Js(t))throw new Y("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Y("options.nowMs is required integer epoch ms");let r=t.nowMs,n=zs;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Y("expiresInMs must be an integer");if(n=t.expiresInMs,n<Ds||n>Us)throw new Y("expiresInMs must be between 1h and 30d")}if(qs.test(e))throw new Y(`prompt appears to contain secrets and is rejected. ${Je}`);let i=Vs(e);if(!i)throw new Y(`empty prompt. ${Je}`);if(Zs(i))throw new Y(`duplicate interval or risk clause. ${Je}`);let a=Ws(i),o=Gs(i),s=Ks(i);if(!a||!o||!s)throw new Y(`could not parse side/coin/interval. ${Je}`);let l=Ys(i);if(!(l.maxLeverage>0)||l.maxLeverage>50)throw new Y("leverage out of range");if(!(l.positionSizePct>0)||l.positionSizePct>100)throw new Y("position size out of range");let f=r+n,u=Xs(i),c=`Draft ${o} ${a}`.slice(0,100),h=Qs(i),d=ea(i),p=ta(i),m=ra(i),y=na(i),E=oa(i),x=ia(i),A=[h,d,p,m,y,E,x].filter(Boolean);if(A.length!==1)throw new Y(`unsupported or ambiguous prompt. ${Je}`);if(!sa(i,A[0]))throw new Y(`unsupported or ambiguous prompt. ${Je}`);let g,v=A[0],O={side:a,coin:o,interval:s,risk:l,expiresAt:f,id:u,name:c,spec:v};v.kind==="ema_cross"?g=aa(O):v.kind==="rsi"?g=la(O):v.kind==="open_interest"?g=ua(O):v.kind==="funding"?g=ca(O):g=da(O);let w=dr(g,{nowMs:r});if(!w.ok)throw new Y(`draft failed validation: ${w.errors.map(M=>M.message).join("; ")}`);return yr(X(g,{nowMs:r}))}var Y,Fs,Cs,qs,Je,Bs,Ds,Us,zs,fa,Vn=B(()=>{Ie();Y=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Fs=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Cs=new Set(["BTC","ETH","SOL","HYPE"]),qs=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Je="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",Bs=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),Ds=36e5,Us=30*864e5,zs=864e5;fa=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as pa}from"node:crypto";function Kn(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function Yn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function gr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)gr(t);return Object.freeze(e)}for(let t of Object.keys(e))gr(e[t]);return Object.freeze(e)}function ut(e){if(Array.isArray(e))return e.map(ut);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=ut(e[r]);return t}return e}function vt(e){return JSON.stringify(ut(e))}function ha(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let i=[],a=Math.floor((r-t)/n+1e-9);for(let s=0;s<=a;s++){let l=t+s*n;if(l>r+1e-9)break;let f=Math.abs(l-Math.round(l))<1e-9?Math.round(l):Number(l.toPrecision(12));f<t-1e-9||f>r+1e-9||i.push(f)}if(i.length===0)return[];let o=i[i.length-1];if(Math.abs(o-r)>1e-9){let s=(r-t)/n;Math.abs(s-Math.round(s))<=1e-9&&i.push(r)}return i}function ma(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let i=t[n],a=[];for(let o of r)for(let s of i)a.push({...o,[n]:s});r=a}return r.sort((n,i)=>{let a=vt(n),o=vt(i);return a<o?-1:a>o?1:0}),r}function wr(e,t,r,n,i){let a=0;if(e==="maxDrawdownPct"){if(a=t.maxDrawdownPct-n.maxDrawdownPct,a!==0)return a<0}else if(a=t[e]-n[e],a!==0)return a>0;let o=vt(r),s=vt(i);return o<s}function Zn(e,t,r={}){if(!Yn(r))throw new TypeError("options must be a plain object");for(let g of Object.keys(r))if(Kn(g))throw new TypeError(`options must not include holdout/test/oos key "${g}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let g of Object.keys(r))if(!n.has(g))throw new TypeError(`unknown option "${g}"`);let i=64;if("maxTrials"in r){let g=r.maxTrials;if(!Number.isInteger(g)||g<1||g>Wn)throw new TypeError(`maxTrials must be an integer 1..${Wn}`);i=g}let a=r.objective??"netPnlUsd";if(!Gn.has(a))throw new TypeError(`objective must be one of ${[...Gn].join("|")}`);let o=r.backtestOptions??{};if(!Yn(o))throw new TypeError("backtestOptions must be a plain object");for(let g of Object.keys(o))if(Kn(g))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${g}"`);let s=X(e),l=Object.keys(s.parameters).sort();if(l.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let f={},u=1;for(let g of l){let v=ha(s.parameters[g]);if(v.length===0)throw new Error(`parameter "${g}" produces an empty grid`);f[g]=v,u*=v.length}let c=ma(l,f);if(c.length===0)throw new Error("parameter grid is empty");let h=c.slice(0,i),d=[],p=null,m=null;for(let g of h){let v=at(s,g),O=se(v,t,o);m==null&&(m=O.config);let w={netPnlUsd:O.metrics.netPnlUsd,netPnlPct:O.metrics.netPnlPct,maxDrawdownPct:O.metrics.maxDrawdownPct,winRate:O.metrics.winRate,profitFactor:O.metrics.profitFactor,tradeCount:O.metrics.tradeCount,sharpe:O.metrics.sharpe,turnoverUsd:O.metrics.turnoverUsd},M={parameters:{...g},metrics:w};d.push(M),(!p||wr(a,w,g,p.metrics,p.parameters))&&(p=M)}d.sort((g,v)=>wr(a,g.metrics,g.parameters,v.metrics,v.parameters)?-1:wr(a,v.metrics,v.parameters,g.metrics,g.parameters)?1:0);let y={...p.parameters},E=at(s,y),x={strategyHash:qe(s),compilerHash:ge,trainBarsHash:je(t),backtestConfig:m,objective:a,maxTrials:i,trialsRun:d.length,candidates:d,bestParameters:y,bestStrategy:E},A={id:pa("sha256").update(JSON.stringify(ut(x)),"utf8").digest("hex"),...x};return gr(ut(JSON.parse(JSON.stringify(A))))}var Wn,Gn,Xn=B(()=>{be();Ie();rt();Wn=256,Gn=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Ee from"node:fs";import Pt from"node:path";function _t(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function fe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function wa(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ve(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ve(r,`${t}[${n}]`));return}if(_t(e))for(let[r,n]of Object.entries(e)){let i=wa(r);if(ya.some(a=>i.includes(a)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ve(n,`${t}.${r}`)}}function ga(e){if(typeof e!="string"||!e||!Pt.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Qn(e){let t;try{t=Ee.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function ba(){return{version:Er,runners:[]}}function eo(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!_t(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Er)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Ve(r,Pt.basename(t)),{version:Er,runners:r.runners.map(n=>fe(n))}}function to(e,t){Ve(t,"store");let r=Pt.dirname(e);Ee.mkdirSync(r,{recursive:!0,mode:448});let n=Pt.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),i=`${JSON.stringify(t)}
3
- `;try{Ee.writeFileSync(n,i,{mode:384,flag:"wx"}),Ee.renameSync(n,e);try{Ee.chmodSync(e,384)}catch{}}catch(a){try{Ee.unlinkSync(n)}catch{}throw a}}function ro(e={}){let t=e.path;if(ga(t),Qn(t),Ee.existsSync(t)?eo(Ee.readFileSync(t,"utf8"),t):to(t,ba()),br.has(t))return br.get(t);let r=!1,n=[];function i(){if(r)return;let p=n.shift();if(p){r=!0;try{let m=p.fn();r=!1,p.resolve(m),i()}catch(m){r=!1,p.reject(m),i()}}}function a(p){if(!r&&n.length===0){r=!0;try{return p()}finally{r=!1,queueMicrotask(i)}}return new Promise((m,y)=>{n.push({fn:p,resolve:m,reject:y}),queueMicrotask(i)})}function o(){return Qn(t),eo(Ee.readFileSync(t,"utf8"),t)}function s(p){to(t,p)}function l(p){if(!_t(p)||typeof p.id!="string"||!p.id)throw new Error("shadow-store: create requires record with string id");Ve(p,"record");let m=o();if(m.runners.some(E=>E.id===p.id))throw new Error(`shadow-store: runner id already exists: ${p.id}`);let y=fe(p);return m.runners.push(y),s(m),fe(y)}function f(p){let m=o().runners.find(y=>y.id===p);return m?fe(m):null}function u(){return o().runners.map(p=>fe(p))}function c(p,m){if(typeof m!="function")throw new Error("shadow-store: updater must be a function");let y=o(),E=y.runners.findIndex(g=>g.id===p);if(E<0)throw new Error(`shadow-store: runner not found: ${p}`);let x=fe(y.runners[E]),A=m(x);if(!_t(A)||A.id!==p)throw new Error("shadow-store: updater must return record with same id");return Ve(A,"record"),y.runners[E]=fe(A),s(y),fe(y.runners[E])}function h(p){let m=o(),y=m.runners.findIndex(x=>x.id===p);if(y<0)throw new Error(`shadow-store: runner not found: ${p}`);let E=fe(m.runners[y]);return E.status!=="stopped"&&(E.status="stopped",m.runners[y]=E,s(m)),fe(m.runners[y])}let d={create(p){return a(()=>l(p))},get(p){return f(p)},list(){return u()},update(p,m){return a(()=>c(p,m))},stop(p){return a(()=>h(p))}};return br.set(t,d),d}var Er,ya,br,no=B(()=>{Er=1,ya=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];br=new Map});import{createHash as Tr}from"node:crypto";function xr(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Sr(e){return Array.isArray(e)?e.map(Sr):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Sr(e[t])])):e}function io(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Tr("sha256").update(JSON.stringify(Sr(e))).digest("hex")}function Ea(e,t,r,n,i){return Tr("sha256").update(`${e}|${t}|${r}|${n}|${i}`).digest("hex")}function xa(e,t,r,n){return Tr("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Sa(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function oo(e){return e==="entryLong"||e==="entryShort"}function kr({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=ro({path:e});function n({strategy:l,evidenceId:f=null}={}){let u=K(l),c=f==null?null:String(f),h=r.list().filter(E=>E.status==="running"&&E.strategyHash===u.strategyHash&&E.compilerHash===u.compilerHash&&E.evidenceId===c).sort((E,x)=>E.createdAt-x.createdAt||E.id.localeCompare(x.id))[0];if(h)return xr(h);let d=t(),p=xa(d,u.strategyHash,u.compilerHash,c),m=r.get(p);if(m)return xr(m);let y={id:p,strategy:xr(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:c,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:d,updatedAt:d,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(y)}function i(l){return r.get(l)}function a(){return r.list()}function o(l){return r.stop(l)}function s(l,f,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(f))throw new TypeError("shadow-runner: bars must be an array");return r.update(l,c=>{if(c.status!=="running")throw new Error("shadow-runner: runner is stopped");if(f.length===0)return c;let d=K(c.strategy).evaluateAll(f),p=new Map;for(let b=0;b<f.length;b++)p.set(f[b].t,b);let m=c.cursor,y=[];for(let b=0;b<f.length;b++){let N=f[b].t;(m==null||N>m)&&y.push(b)}if(y.length===0)return c;let E=new Map(c.intendedOrders.map(b=>[b.id,b])),x=new Set(c.fills.map(b=>b.orderId)),A=new Map(c.missedFills.map(b=>[b.orderId,b])),g=(b,N)=>`${b}|${N}`,v=new Map(c.markouts.map(b=>[g(b.orderId,b.horizon),b])),O=c.position?{...c.position}:null,w=Number.isInteger(c.cooldownBarsRemaining)?Math.max(0,c.cooldownBarsRemaining):0,M=Number.isFinite(c.cooldownStartT)?c.cooldownStartT:null;function q({action:b,signalBarT:N,signalIndex:k}){let F=Sa(b),L=Ea(c.id,c.strategyHash,N,F,b);if(E.has(L))return E.get(L);let R=k+1,_=R<f.length,j={id:L,action:b,type:b,side:F,signalBarT:N,fillBarT:_?f[R].t:null,status:_?"open":"missed"};return E.set(L,j),c.intendedOrders.push(j),j}function J(b,N,k){if(x.has(b.id))return;let F={orderId:b.id,action:oo(b.action)?"entry":"exit",side:b.side,price:N.o,barT:N.t,signalBarT:b.signalBarT,barIndex:k};if(c.fills.push(F),x.add(b.id),b.status="filled",b.fillBarT=N.t,A.has(b.id)&&(A.delete(b.id),c.missedFills=c.missedFills.filter(L=>L.orderId!==b.id)),oo(b.action)){O={side:b.action==="entryLong"?"long":"short",entryOrderId:b.id,entryBarT:N.t,entryPrice:N.o,entryBarIndex:k};for(let L of u){let R=g(b.id,L);if(v.has(R))continue;let _={orderId:b.id,horizon:L,entryBarT:N.t,entryPrice:N.o,side:O.side,status:"pending",close:null,barT:null};v.set(R,_),c.markouts.push(_)}}else O=null,w=Number(c.strategy?.risk?.cooldownBars)||0,M=N.t}function P(b){if(x.has(b.id)||A.has(b.id))return;let N={orderId:b.id,action:b.action,side:b.side,signalBarT:b.signalBarT,status:"missed"};A.set(b.id,N),c.missedFills.push(N),b.status="missed"}for(let b of c.intendedOrders){if(b.status==="filled"||x.has(b.id))continue;let N=p.get(b.signalBarT);if(N==null)continue;let k=N+1;k<f.length&&(m==null||f[k].t>m)&&J(b,f[k],k)}for(let b of y){let N=f[b],k=d[b].signals,F=O,L=_=>{if(O||w>0&&(M==null||N.t>=M))return;let I=q({action:_,signalBarT:N.t,signalIndex:b}),ee=b+1;ee<f.length?J(I,f[ee],ee):P(I)},R=_=>{if(!O||O.side==="long"&&_!=="exitLong"||O.side==="short"&&_!=="exitShort")return;let j=q({action:_,signalBarT:N.t,signalIndex:b}),I=b+1;I<f.length?J(j,f[I],I):P(j)};F?(k.exitLong&&R("exitLong"),k.exitShort&&R("exitShort")):k.entryLong&&k.entryShort||(k.entryLong&&L("entryLong"),k.entryShort&&L("entryShort")),w>0&&M!=null&&N.t>=M&&(w-=1,w===0&&(M=null)),c.cursor=N.t,c.lastProcessedBarIndex=b}for(let b of c.markouts){if(b.status!=="pending")continue;let N=c.fills.find(L=>L.orderId===b.orderId&&L.action==="entry");if(!N)continue;let k=p.get(N.barT);if(k==null)continue;let F=k+b.horizon;if(F<f.length){b.close=f[F].c,b.barT=f[F].t,b.status="filled";let L=b.entryPrice;b.markout=b.side==="long"?(b.close-L)/L:(L-b.close)/L}}return c.position=O,c.cooldownBarsRemaining=w,c.cooldownStartT=M,c.updatedAt=t(),c})}return{start:n,step:s,list:a,get:i,stop:o}}var so=B(()=>{be();no()});import{types as Ta}from"node:util";function We(e,{omitUndefined:t=!1}={}){let r=new WeakSet,n=0,i=0;function a(o,s="",l=0){if(++n>3e5||l>10)throw new TypeError("bounded JSON input limit exceeded");if(o===null||typeof o=="boolean")return o;if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError("JSON numbers must be finite");return o}if(typeof o=="string"){if(i+=Buffer.byteLength(o),o.length>2048||i>8*1024*1024)throw new TypeError("bounded JSON string limit exceeded");if(Aa.test(o)||/^(?:0x)?[a-fA-F0-9]{64}$/.test(o)&&!/hash$/i.test(s))throw new TypeError("secret-like or secret-bearing input is forbidden");return o}if(!o||typeof o!="object"||Ta.isProxy(o))throw new TypeError("input must be plain JSON");if(r.has(o))throw new TypeError("JSON cycle is forbidden");let f=Array.isArray(o);if(!f&&![Object.prototype,null].includes(Object.getPrototypeOf(o)))throw new TypeError("input must be plain JSON");if(f&&o.length>1e4)throw new TypeError("bounded array limit exceeded");let u=Reflect.ownKeys(o).filter(h=>!(f&&h==="length"));if(!f&&u.length>64||f&&u.length!==o.length)throw new TypeError("bounded dense JSON required");r.add(o);let c=f?[]:{};for(let h of u){if(typeof h!="string"||h.length>64||["__proto__","constructor","prototype"].includes(h))throw new TypeError("invalid JSON key");if(ka.test(h.toLowerCase().replace(/[^a-z]/g,"")))throw new TypeError("secret-like or secret-bearing input is forbidden");let d=Object.getOwnPropertyDescriptor(o,h);if(!d.enumerable||!Object.hasOwn(d,"value"))throw new TypeError("JSON accessors are forbidden");if(f&&!/^(0|[1-9]\d*)$/.test(h))throw new TypeError("invalid JSON array");t&&l===0&&!f&&d.value===void 0||(c[h]=a(d.value,h,l+1))}return r.delete(o),c}return a(e)}var ka,Aa,$t=B(()=>{ka=/privatekey|privkey|mnemonic|seed|secret|password|passphrase|apikey|authorization|accesstoken|refreshtoken|signer|keystore|keymaterial|authtoken|credential|bearer|signature|xprv|xpriv|wif/,Aa=/\b(?:private[\s_-]*key|mnemonic|seed[\s_-]*phrase|api[\s_-]*key|bearer\s+|sk-[A-Za-z0-9_-]{20,}|-----BEGIN .*PRIVATE KEY)/i});function ao({coin:e,interval:t="15m",maxTrials:r=Z.max,nowMs:n}){if(!Number.isInteger(r)||r<Z.min||r>Z.max)throw new TypeError(`maxTrials must be an integer from ${Z.min} to ${Z.max}`);if(typeof t!="string"||!/^(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)$/.test(t))throw new TypeError("unsupported interval");if(Ne(t),typeof e!="string"||e.length>32||!/^(?:[a-z][a-z0-9_-]*:)?[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e))throw new TypeError("unsupported perp coin");if(!Number.isSafeInteger(n)||n<0||!Number.isSafeInteger(n+864e5))throw new TypeError("invalid nowMs");let i=[];for(let a=0;a<It.length;a++)for(let o of Or)for(let s of vr){if(i.length===r)return i;let l=s==="long",f=o==="rsi_mean_reversion"?{period:Ar[a][0],threshold:l?Ar[a][1]:100-Ar[a][1]}:{fast:It[a][0],slow:It[a][1]},u=`wallet-${o.replaceAll("_","-")}-${s}-${a}`,c=[{id:"close",type:"input",field:"close"}];o==="rsi_mean_reversion"?c.push({id:"rsi",type:"indicator",indicator:"rsi",input:"close",period:{param:"period"}},{id:"threshold",type:"constant",value:{param:"threshold"}},{id:"mid",type:"constant",value:50},{id:"entry",type:"compare",op:l?"lt":"gt",left:"rsi",right:"threshold"},{id:"exit",type:"compare",op:l?"gte":"lte",left:"rsi",right:"mid"}):c.push({id:"fast",type:"indicator",indicator:"ema",input:"close",period:{param:"fast"}},{id:"slow",type:"indicator",indicator:"ema",input:"close",period:{param:"slow"}},o==="ema_cross"?{id:"entry",type:"cross",direction:l?"above":"below",left:"fast",right:"slow"}:{id:"entry",type:"compare",op:l?"gt":"lt",left:"fast",right:"slow"},{id:"exit",type:"compare",op:l?"lte":"gte",left:"fast",right:"slow"});let h=K({version:1,id:u,name:`Wallet candidate ${o} ${s}`,venue:"hyperliquid",market:{coin:e,interval:t},parameters:Object.fromEntries(Object.entries(f).map(([d,p])=>[d,{value:p,min:p,max:p,step:1}])),nodes:c,rules:{entryLong:l?"entry":null,entryShort:l?null:"entry",exitLong:l?"exit":null,exitShort:l?null:"exit"},risk:{maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3,expiresAt:n+864e5}});i.push({id:u,family:o,direction:s,parameters:f,strategy:h.strategy,strategyHash:h.strategyHash})}return i}function lo({episodes:e,decisions:t},{coin:r,bars:n,startIndex:i,endIndex:a,intervalMs:o}){if(!Array.isArray(e)||!Array.isArray(t)||e.length>2e4||t.length>2e4)throw new TypeError("bounded reconstructed observations required");if(!Array.isArray(n)||n.length>5e3||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<i||a>n.length||!Number.isSafeInteger(o)||o<=0)throw new TypeError("invalid observation window");let s=e.filter(m=>m.coin===r),l=s.filter(m=>m.partialStart),f=new Map(s.filter(m=>!m.partialStart).map(m=>[`${m.fillIds[0]}:${m.side}`,m])),u=new Map;for(let m of t){if(m.coin!==r||!["entry","reverse"].includes(m.action))continue;let y=m.fillIds.map(v=>f.get(`${v}:${m.side}`)).find(Boolean);if(!y)continue;let E=y.openedAt,x=Math.floor((E-n[0].t)/o)-1;if(x<i||x>=a)continue;let A=n[x].t+o;if(A>E||E>=A+o)continue;let g=u.get(x)??[];g.push({...m,time:E,barIndex:x,featureClosedAt:A}),u.set(x,g)}let c=[],h=[],d=0,p=0;for(let m=i;m<a;m++){let y=n[m].t+o;if(l.some(x=>y<=(x.closedAt??Number.MAX_SAFE_INTEGER))){p++;continue}let E=u.get(m)??[];if(E.length>1){d++;continue}E.length&&h.push(E[0]),c.push({barIndex:m,label:E[0]?.side??null})}return{rows:c,labels:h,partialStartEpisodes:l.length,partialStartBars:p,ambiguousBars:d}}function jt(e,t){if(!Array.isArray(t)||!t.length||t.length>5e3)throw new TypeError("bounded bars required");let r=null;return K(e).evaluateAll(t).map(({signals:n})=>((r==="long"&&n.exitLong||r==="short"&&n.exitShort)&&(r=null),r||n.entryLong===n.entryShort?null:(r=n.entryLong?"long":"short",r)))}function co(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("invalid fitting input");if(Object.keys(e).some(u=>!["trials","bars","trainRows","validationRows"].includes(u)))throw new TypeError("unknown fitting option; holdout is forbidden");let{trials:t,bars:r,trainRows:n,validationRows:i}=e;if(!Array.isArray(t)||t.length<Z.min||t.length>Z.max)throw new TypeError("bounded candidate trials required");if(!Array.isArray(r)||!r.length||r.length>5e3)throw new TypeError("bounded bars required");let a=-1;for(let u of[n,i]){if(!Array.isArray(u)||u.length>5e3)throw new TypeError("bounded observations required");for(let c of u){if(!Number.isInteger(c?.barIndex)||c.barIndex<0||c.barIndex>=r.length)throw new TypeError("invalid observation index");if(c.barIndex<=a)throw new TypeError("observations must be chronological without overlap");a=c.barIndex}}let o=t.map(u=>{let c=K(u.strategy),h=n.at(-1)?.barIndex??0,d=i.at(-1)?.barIndex??h,p=jt(c.strategy,r.slice(0,h+1)),m=jt(c.strategy,r.slice(0,d+1)),y=(g,v)=>Nt(g.map(O=>O.label),g.map(O=>v[O.barIndex])),E=y(n,p),x=y(i,m),A=[E,x].every(g=>g.positives>=3&&g.negatives>=20&&g.predictedPositives>=3&&g.precision>=.1&&g.recall>=.1&&g.balancedAccuracy>.5);return{id:u.id,family:u.family,direction:u.direction,parameters:u.parameters,strategyHash:c.strategyHash,train:E,validation:x,eligible:A,selectionScore:(E.f1+x.f1)/2}}),l=o.filter(u=>u.eligible).sort((u,c)=>c.selectionScore-u.selectionScore||u.id.localeCompare(c.id,"en"))[0],f=l?Object.freeze({id:l.id,family:l.family,direction:l.direction,parameters:Object.freeze({...l.parameters}),strategyHash:l.strategyHash,selectionScore:l.selectionScore}):null;return{trialsRun:o.length,candidateTrials:o,selectedCandidate:f}}function Nt(e,t){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length||e.length>5e3)throw new TypeError("label arrays must have equal bounded length");if([...e,...t].some(d=>d!==null&&d!=="long"&&d!=="short"))throw new TypeError("invalid decision label");let r=0,n=0,i=0,a=0,o=0,s={};for(let d=0;d<e.length;d++)e[d]!==null&&r++,t[d]!==null&&n++,e[d]===null&&t[d]===null&&a++,e[d]!==null&&e[d]===t[d]&&i++,e[d]!==null&&t[d]!==null&&e[d]!==t[d]&&o++;let l=(d,p)=>p?d/p:0,f=l(i,n),u=l(i,r),c=e.length-r,h=l(a,c);for(let d of["long","short"]){let p=0,m=0,y=0,E=0;for(let x=0;x<e.length;x++)e[x]===d&&t[x]===d?p++:t[x]===d?m++:e[x]===d?y++:E++;s[d]={truePositive:p,falsePositive:m,falseNegative:y,trueNegative:E,precision:l(p,p+m),recall:l(p,p+y)}}return{samples:e.length,positives:r,negatives:c,predictedPositives:n,correctEntries:i,trueNegative:a,wrongDirection:o,precision:f,recall:u,f1:l(2*f*u,f+u),specificity:h,balancedAccuracy:r&&c?(u+h)/2:null,accuracy:l(i+a,e.length),byDirection:s}}var It,Ar,Or,vr,Z,Pr=B(()=>{be();st();It=[[5,20],[8,21],[12,26],[20,50]],Ar=[[7,30],[14,30],[14,25],[21,35]],Or=["ema_cross","ema_trend","rsi_mean_reversion"],vr=["long","short"],Z=Object.freeze({min:Or.length*vr.length,max:It.length*Or.length*vr.length})});var xo={};yt(xo,{collectWalletHistory:()=>Na,normalizeWalletHistory:()=>Ge,walletPositionUnits:()=>Me});import{createHash as fo}from"node:crypto";import{types as po}from"node:util";function Rt(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be an epoch millisecond safe integer`);return e}function mo({wallet:e,startTime:t,endTime:r},n){if(typeof e!="string"||!/^0x[\da-fA-F]{40}$/.test(e))throw new TypeError("wallet must be a 20-byte hex address");Rt(t,"startTime"),Rt(r,"endTime");let i=Rt(n.nowMs??Date.now(),"nowMs time");if(t>=r||r>i)throw new TypeError("invalid time window");return i}function yo(e,t,r=0){if(r>5)throw new TypeError("JSON depth limit exceeded");let n=s=>{if(t.row+=Buffer.byteLength(s),t.total+=Buffer.byteLength(s),t.row>Oa||t.total>t.limit)throw new TypeError("payload byte limit exceeded");return s};if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return n(JSON.stringify(e));if(typeof e=="string"){if(e.length>4096)throw new TypeError("JSON string limit exceeded");return n(JSON.stringify(e))}if(!e||typeof e!="object")throw new TypeError("unsafe fill JSON value");if(po.isProxy(e))throw new TypeError("unsafe JSON proxy");let i=Array.isArray(e);if(!i&&![Object.prototype,null].includes(Object.getPrototypeOf(e)))throw new TypeError("unsafe JSON prototype");let a=Reflect.ownKeys(e).filter(s=>!(i&&s==="length"));if(a.length>64||i&&e.length>64)throw new TypeError("JSON member limit exceeded");if(i&&a.length!==e.length)throw new TypeError("unsafe JSON array");let o=[];for(let s of a.sort()){if(typeof s!="string"||s.length>64||["__proto__","constructor","prototype"].includes(s))throw new TypeError("unsafe JSON key");let l=Object.getOwnPropertyDescriptor(e,s);if(!l.enumerable||!Object.hasOwn(l,"value"))throw new TypeError("unsafe JSON accessor");if(i&&!/^(?:0|[1-9]\d*)$/.test(s))throw new TypeError("unsafe JSON array key");let f=i?"":n(`${JSON.stringify(s)}:`);o.push([s,f+yo(l.value,t,r+1)])}return i&&o.sort((s,l)=>Number(s[0])-Number(l[0])),n((i?"[]":"{}")+",".repeat(Math.max(0,o.length-1))),`${i?"[":"{"}${o.map(s=>s[1]).join(",")}${i?"]":"}"}`}function ft(e,t,{signed:r=!1,positive:n=!1}={}){if(typeof e!="string"||e.length>62||!Pa.test(e)||!Number.isFinite(Number(e)))throw new TypeError(`fill.${t} must be a bounded decimal string`);if(!r&&e.startsWith("-")||n&&Number(e)<=0)throw new TypeError(`fill.${t} has invalid quantity`);return e}function _r(e,t){let r=Number.isSafeInteger(e)&&e>=0,n=typeof e=="string"&&/^(?:0|[1-9]\d{0,19})$/.test(e)&&BigInt(e)<=va;if(!r&&!n)throw new TypeError(`fill.${t} must be an unsigned exact ID`);return e}function uo(e,t){if(typeof e!="string"||!_a.test(e))throw new TypeError(`fill.${t} must be a bounded market token`);return e}function $a(e,t,r,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("fill must be an object");n.row=0;let i=yo(e,n),a=JSON.parse(i);for(let s of["coin","time","px","sz","side","startPosition","tid","oid"])if(!Object.hasOwn(a,s))throw new TypeError(`fill.${s} is required`);let o={coin:uo(a.coin,"coin"),time:Rt(a.time,"fill.time"),px:ft(a.px,"px",{positive:!0}),sz:ft(a.sz,"sz",{positive:!0}),side:a.side,startPosition:ft(a.startPosition,"startPosition",{signed:!0}),tid:_r(a.tid,"tid"),oid:_r(a.oid,"oid")};if(o.side!=="B"&&o.side!=="A")throw new TypeError("fill.side must be B or A");if(o.time<t||o.time>r)throw new TypeError("fill outside requested time window");for(let s of["fee","closedPnl","builderFee"])Object.hasOwn(a,s)&&(o[s]=ft(a[s],s,{signed:s!=="builderFee"}));if(Object.hasOwn(a,"dir")){if(typeof a.dir!="string"||!/^[\x20-\x7e]{1,96}$/.test(a.dir))throw new TypeError("fill.dir must be bounded text");o.dir=a.dir}if(Object.hasOwn(a,"crossed")){if(typeof a.crossed!="boolean")throw new TypeError("fill.crossed must be boolean");o.crossed=a.crossed}Object.hasOwn(a,"feeToken")&&(o.feeToken=uo(a.feeToken,"feeToken"));for(let[s,l]of[["hash",64],["cloid",32]])if(Object.hasOwn(a,s)){if(!(s==="cloid"&&a[s]===null)&&(typeof a[s]!="string"||!new RegExp(`^0x[\\da-fA-F]{${l}}$`).test(a[s])))throw new TypeError(`fill.${s} must be exact hex`);o[s]=a[s]}if(Object.hasOwn(a,"twapId")&&(o.twapId=a.twapId===null?null:_r(a.twapId,"twapId")),Object.hasOwn(a,"liquidation")){let s=a.liquidation;if(!s||typeof s!="object"||Array.isArray(s)||typeof s.liquidatedUser!="string"||!/^0x[\da-fA-F]{40}$/.test(s.liquidatedUser)||typeof s.method!="string"||!/^[\x20-\x7e]{1,64}$/.test(s.method))throw new TypeError("fill.liquidation is invalid");o.liquidation={liquidatedUser:s.liquidatedUser,markPx:ft(s.markPx,"liquidation.markPx",{positive:!0}),method:s.method}}return{fill:o,canonical:i}}function Me(e){let t=e.startsWith("-"),[r,n=""]=(t?e.slice(1):e).split("."),i=BigInt(r)*10n**30n+BigInt(n.padEnd(30,"0"));return t?-i:i}function wo(e){return Me(e.startPosition)+Me(e.sz)*(e.side==="B"?1n:-1n)}function go(e,t){return e.fill.time!==t.fill.time?e.fill.time-t.fill.time:e.fill.coin!==t.fill.coin?e.fill.coin<t.fill.coin?-1:1:e.canonical<t.canonical?-1:e.canonical>t.canonical?1:0}function Ia(e,t){if(e.length===1)return e;let r=new Map,n=f=>(r.has(f)||r.set(f,{outgoing:[],balance:0}),r.get(f));for(let f of e){let u=Me(f.fill.startPosition),c=wo(f.fill);n(u).outgoing.push({record:f,before:u,after:c}),n(u).balance++,n(c).balance--}let i=null,a=0;for(let[f,{balance:u}]of r)if(u===1&&i===null)i=f;else if(u===-1)a++;else if(u!==0)return null;if(i===null?a!==0:a!==1)return null;if(i===null){if(t===null||!r.has(t))return null;i=t}function o(f){let u=new Map,c=[{after:i,record:null}],h=[];for(;c.length;){let p=c.at(-1).after,m=r.get(p).outgoing,y=u.get(p)??0;if(y<m.length)u.set(p,y+1),c.push(m[f?m.length-1-y:y]);else{let E=c.pop();E.record&&h.push(E)}}if(h.reverse(),h.length!==e.length)return null;let d=i;for(let p of h){if(p.before!==d)return null;d=p.after}return h.map(p=>p.record)}let s=o(!1),l=o(!0);return s&&l&&s.every((f,u)=>f===l[u])?s:null}function ja(e){let t=[...e].sort(go),r=[],n=[],i=new Map;for(let a=0;a<t.length;){let{coin:o,time:s}=t[a].fill,l=a+1;for(;l<t.length&&t[l].fill.coin===o&&t[l].fill.time===s;)l++;let f=t.slice(a,l),u=Ia(f,i.get(o)??null);u?(r.push(...u),i.set(o,wo(u.at(-1).fill))):(n.push(`ambiguous_fill_order:${o}:${s}`),r.push(...f),i.set(o,null)),a=l}return{ordered:r,reasons:n}}function bo(e,t,r,{limit:n=$r,bytes:i=ho}={}){if(po.isProxy(e))throw new TypeError("unsafe fills proxy");if(!Array.isArray(e))throw new TypeError("fills must be an array");if(e.length>n)throw new TypeError("fill record count limit exceeded");let a={row:0,total:2+e.length,limit:i},o=[];for(let s=0;s<e.length;s++){let l=Object.getOwnPropertyDescriptor(e,String(s));if(!l?.enumerable||!Object.hasOwn(l,"value"))throw new TypeError("fills require dense own data, no accessors");o.push($a(l.value,t,r,a))}return o}function Ir(e,t){let r=String(t.fill.tid),n=e.get(r);if(n&&n.canonical!==t.canonical)throw new TypeError("contradictory duplicate trade ID");n||e.set(r,t)}function Eo({wallet:e,startTime:t,endTime:r,records:n,status:i,pages:a,reasons:o,source:s,fetchedAt:l,rawPages:f}){let{ordered:u,reasons:c}=ja(n.values()),h=u.map(y=>y.fill),d={status:i,firstTime:h[0]?.time??null,lastTime:h.at(-1)?.time??null,fillCount:h.length,pages:a,reasons:[...o,...c]},p={startTime:t,endTime:r},m=fo("sha256").update(JSON.stringify({schemaVersion:1,venue:"hyperliquid",wallet:e,requested:p,source:s,coverage:d,rawFills:u.map(y=>y.canonical),...f?{rawPages:f}:{}})).digest("hex");return{schemaVersion:1,venue:"hyperliquid",wallet:e,requested:p,fills:h,coverage:d,provenance:{source:s,fetchedAt:l,hash:m}}}function Ge({wallet:e,fills:t,startTime:r,endTime:n,source:i="import",coverage:a},o={}){let s=mo({wallet:e,startTime:r,endTime:n},o);if(typeof i!="string"||i.length>64)throw new TypeError("source must be bounded text");let l=new Map;for(let f of bo(t,r,n))Ir(l,f);return Eo({wallet:e,startTime:r,endTime:n,records:l,status:"unknown",pages:0,reasons:["import_coverage_unverified"],source:"import",fetchedAt:s})}async function Na({wallet:e,startTime:t,endTime:r,maxPages:n=5},i={}){let a=mo({wallet:e,startTime:t,endTime:r},i);if(!Number.isInteger(n)||n<1||n>10)throw new TypeError("maxPages must be an integer from 1 to 10");if(i.requestInfo!==void 0&&typeof i.requestInfo!="function")throw new TypeError("requestInfo must be a function");let o=i.requestInfo??(m=>_e(m,{timeoutMs:15e3,maxResponseBytes:2*1024*1024,sameOriginRedirectsOnly:!0})),s=new Map,l=[],f=["api_recent_10000_retention","unknown_first_history"],u="unknown",c=0,h=t,d=[],p=0;for(;c<n;){let m;c+=1;try{m=await o({type:"userFillsByTime",user:e,startTime:h,endTime:r,aggregateByTime:!1})}catch(g){if(g?.oversize===!0)throw new TypeError("payload byte limit exceeded");u="partial",f.push("network_error");break}let y=bo(m,h,r,{limit:2e3,bytes:2*1024*1024}).sort(go),E=`[${y.map(g=>g.canonical).join(",")}]`;l.push({startTime:h,hash:fo("sha256").update(E).digest("hex")}),p+=Buffer.byteLength(E);let x=new Map;for(let g of y){Ir(x,g);let v=s.get(String(g.fill.tid));if(v&&v.canonical!==g.canonical)throw new TypeError("contradictory duplicate trade ID")}if(p>ho){u="partial",f.push("payload_limit");break}for(let g of x.values())s.size<$r&&Ir(s,g);if(d.some(g=>!x.has(g))){u="partial",f.push("pagination_continuity_unproven");break}if(s.size>=$r){u="partial",f.push("record_limit");break}if(m.length<2e3){m.length===0&&f.push("empty_response");break}let A=y.at(-1).fill.time;if(A<=h){u="partial",f.push("ambiguous_same_timestamp_overflow");break}if(c===n){u="partial",f.push("page_limit");break}h=A,d=y.filter(g=>g.fill.time===h).map(g=>String(g.fill.tid))}return Eo({wallet:e,startTime:t,endTime:r,records:s,status:u,pages:c,reasons:f,source:"hyperliquid",fetchedAt:a,rawPages:l})}var $r,ho,Oa,va,Pa,_a,Mt=B(()=>{tt();$r=1e4,ho=8*1024*1024,Oa=16*1024,va=18446744073709551615n,Pa=/^-?(?:0|[1-9]\d{0,29})(?:\.\d{1,30})?$/,_a=/^[A-Za-z0-9@#][A-Za-z0-9._:@/#-]{0,63}$/});function Ra(e,t){return e===0n?{action:"entry",side:ae(t)}:t===0n?{action:"exit",side:ae(e)}:ae(e)!==ae(t)?{action:"reverse",side:ae(t)}:{action:re(t)>re(e)?"increase":"reduce",side:ae(e)}}function Ma(e,t){if(!(e.action==="reverse"||e.action==="entry"&&t.action==="increase")){if(e.action==="exit"&&t.action==="entry"){Object.assign(e,{action:"reverse",side:t.side});return}Object.assign(e,t)}}function jr(e,t,r,n,i){let a=Lt(re(t)),o={coin:e.coin,side:ae(t),openedAt:e.time,closedAt:null,entryPrice:r?null:Number(e.px),exitPrice:null,size:a,partialStart:r,partialEnd:!0,fillIds:[]};return n.push(o),r&&i.push(`left_censored:${e.coin}:${e.time}`),{episode:o,peak:re(t),entryQuantity:r?0:a,entryValue:r?0:a*Number(e.px),exitQuantity:0,exitValue:0}}function La(e,t,r){let n=t.filter(o=>!o.partialStart&&!o.partialEnd),i=n.map(o=>o.closedAt-o.openedAt).sort((o,s)=>o-s),a=Math.floor(i.length/2);return{markets:[...new Set(e.map(o=>o.coin))].sort(),fillCount:e.length,decisionCount:r.length,episodeCount:t.length,closedEpisodeCount:t.filter(o=>o.closedAt!==null).length,completeEpisodeCount:n.length,partialStartCount:t.filter(o=>o.partialStart).length,partialEndCount:t.filter(o=>o.partialEnd).length,longEpisodeCount:t.filter(o=>o.side==="long").length,shortEpisodeCount:t.filter(o=>o.side==="short").length,reversalCount:r.filter(o=>o.action==="reverse").length,medianHoldingMs:i.length===0?null:i.length%2?i[a]:i[a-1]/2+i[a]/2}}function Nr(e){if(!e||e.schemaVersion!==1||e.venue!=="hyperliquid"||!e.requested)throw new TypeError("history must have schemaVersion 1 and venue hyperliquid");let{fills:t,coverage:r}=Ge({wallet:e.wallet,fills:e.fills,startTime:e.requested.startTime,endTime:e.requested.endTime},{nowMs:e.requested.endTime}),n=new Map,i=[],a=[],o=[e.coverage?.status==="partial"?"history_coverage_partial":"history_coverage_unverified"],s=new Set(r.reasons.filter(l=>l.startsWith("ambiguous_fill_order:")));o.push(...s);for(let l of t){if(s.has(`ambiguous_fill_order:${l.coin}:${l.time}`)){n.delete(l.coin);continue}let f=Me(l.startPosition),u=Me(l.sz)*(l.side==="B"?1n:-1n),c=f+u,h=String(l.tid),d=String(l.oid);n.has(l.coin)||n.set(l.coin,{position:null,active:null,epoch:0,groups:new Map});let p=n.get(l.coin);p.position!==null&&p.position!==f&&(o.push(`position_discontinuity:${l.coin}:${l.time}`),p.active=null,p.epoch+=1,p.groups.clear()),!p.active&&f!==0n&&(p.active=jr(l,f,!0,i,o));let m=`${d}:${l.side}`,y=Ra(f,c),E=p.groups.get(m);if(!E||E.epoch!==p.epoch){let x={coin:l.coin,time:l.time,...y,orderId:d,fillIds:[]};a.push(x),E={epoch:p.epoch,decision:x},p.groups.set(m,E)}else Ma(E.decision,y);if(E.decision.fillIds.push(h),f===0n)p.epoch+=1,p.active=jr(l,c,!1,i,o),p.active.episode.fillIds.push(h);else if(ae(f)===ae(c)&&c!==0n&&re(c)>re(f)){let x=p.active,A=Lt(re(u));x.entryQuantity+=A,x.entryValue+=A*Number(l.px),x.episode.partialStart||(x.episode.entryPrice=x.entryValue/x.entryQuantity),re(c)>x.peak&&(x.peak=re(c),x.episode.size=Lt(x.peak)),x.episode.fillIds.push(h)}else{let x=p.active,A=Lt(re(u)<re(f)?re(u):re(f));x.exitQuantity+=A,x.exitValue+=A*Number(l.px),x.episode.fillIds.push(h),(c===0n||ae(f)!==ae(c))&&(p.epoch+=1,x.episode.closedAt=l.time,x.episode.exitPrice=x.exitValue/x.exitQuantity,x.episode.partialEnd=!1,p.active=null,c!==0n&&(p.epoch+=1,p.active=jr(l,c,!1,i,o),p.active.episode.fillIds.push(h)))}p.position=c,E.epoch=p.epoch}for(let l of i)l.partialEnd&&o.push(`incomplete_episode:${l.coin}:${l.openedAt}`);return{episodes:i,decisions:a,fingerprint:La(t,i,a),warnings:o}}var re,ae,Lt,So=B(()=>{Mt();re=e=>e<0n?-e:e,ae=e=>e<0n?"short":"long",Lt=e=>+`${e}e-30`});var Ao={};yt(Ao,{inferWalletStrategy:()=>qa});import{createHash as Ha}from"node:crypto";function Mr(e){if(Array.isArray(e))return e.map(Mr);if(e&&typeof e=="object")return Object.fromEntries(Object.keys(e).sort().map(t=>[t,Mr(e[t])]));if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("non-finite inference result");return e}function Ke(e){return Ha("sha256").update(JSON.stringify(Mr(e))).digest("hex")}function Ht(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be an epoch millisecond safe integer`)}function dt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("invalid input object");if(Object.keys(e).some(r=>!t.includes(r)))throw new TypeError("unknown input field")}function Fa(e,t,r,n,i){if(!Array.isArray(e)||e.length>5e3)throw new TypeError("bars must be a bounded array, limit 5000");for(let a=0;a<e.length;a++){let o=e[a];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("invalid bar");if(Ht(o.t,"bar time"),!Number.isSafeInteger(o.t+t)||o.t+t>r)throw new TypeError("bar close time must not be in the future");if(a&&o.t-e[a-1].t!==t)throw new TypeError("invalid bar cadence");if("T"in o&&o.T!==o.t+t-1&&o.T!==o.t+t)throw new TypeError("invalid bar close time");for(let s of["o","h","l","c"])if(typeof o[s]!="number"||!Number.isFinite(o[s])||o[s]<=0||o[s]>1e12)throw new TypeError("bar price must be positive finite and bounded");if(typeof o.v!="number"||!Number.isFinite(o.v)||o.v<0||o.v>1e24)throw new TypeError("bar volume must be non-negative finite and bounded");if(o.h<Math.max(o.o,o.c,o.l)||o.l>Math.min(o.o,o.c,o.h))throw new TypeError("invalid bar OHLC");if("s"in o&&o.s!==n)throw new TypeError("invalid bar market");if("i"in o&&o.i!==i)throw new TypeError("invalid bar interval");for(let s of["fundingRate","fundingPaymentRate"])if(o[s]!=null&&(typeof o[s]!="number"||!Number.isFinite(o[s])||Math.abs(o[s])>1))throw new TypeError("invalid finite funding rate");for(let s of["openInterest","premium","oiDelta","bookImbalance"])if(o[s]!=null&&(typeof o[s]!="number"||!Number.isFinite(o[s])))throw new TypeError("invalid optional bar series");if(o.openInterest!=null&&o.openInterest<0)throw new TypeError("invalid open interest");if(o.bookImbalance!=null&&Math.abs(o.bookImbalance)>1)throw new TypeError("invalid book imbalance")}}function Ca(e,t,r){let n=e.map((s,l)=>l>=de.warmupBars&&s.t+r>=t.startTime&&s.t+2*r<=t.endTime?l:-1).filter(s=>s>=0);if(n.length<5)return null;let i=n[0],a=n.length,o=[i,i+Math.floor(a*de.trainFraction),i+Math.floor(a*de.validationEndFraction),n.at(-1)+1];return Object.fromEntries(["train","validation","holdout"].map((s,l)=>[s,{startIndex:o[l],endIndex:o[l+1],startTime:e[o[l]].t+r,endTime:e[o[l+1]-1].t+2*r}]))}function To(e,t,r,n,i){let a=t.labels.length,o=[];return(t.rows.length<de.minimumSplitBars||r.endTime-r.startTime<de.minimumSplitSpanMs)&&o.push(`${e}: insufficient bars or time coverage`),(a<de.minimumSplitPositives||t.rows.length-a<de.minimumSplitNegatives)&&o.push(`${e}: insufficient positive episodes or no-trade observations`),a&&t.labels.at(-1).time-t.labels[0].time<de.minimumSplitSpanMs&&o.push(`${e}: positive episodes span insufficient time`),n.warnings.some(s=>s.startsWith(`position_discontinuity:${i}:`))&&o.push(`${e}: unstable position continuity`),n.warnings.some(s=>s.startsWith(`ambiguous_fill_order:${i}:`))&&o.push(`${e}: ambiguous same-time fill ordering`),t.ambiguousBars&&o.push(`${e}: multiple entry decisions share a candle; use finer cadence`),o}function ko(e,t){return e.length?{startTime:e[0].t,endTime:e.at(-1).t+t,entryPrice:e[0].o,exitPrice:e.at(-1).c,grossReturnPct:(e.at(-1).c/e[0].o-1)*100}:null}function qa(e){let t=We(e);dt(t,["history","coin","interval","bars","maxTrials","nowMs"]);let{history:r,coin:n,bars:i,interval:a="15m",maxTrials:o=Z.max}=t;if(dt(r,["schemaVersion","venue","wallet","requested","fills","coverage","provenance"]),r.schemaVersion!==1||r.venue!=="hyperliquid")throw new TypeError("invalid wallet history schema or venue");if(dt(r.requested,["startTime","endTime"]),dt(r.coverage,["status","firstTime","lastTime","fillCount","pages","reasons"]),dt(r.provenance,["source","fetchedAt","hash"]),!["complete","partial","unknown"].includes(r.coverage.status)||!Array.isArray(r.coverage.reasons)||r.coverage.reasons.some(k=>typeof k!="string"))throw new TypeError("invalid history coverage");for(let k of["firstTime","lastTime"])r.coverage[k]!==null&&Ht(r.coverage[k],`coverage ${k}`);if(!Number.isInteger(r.coverage.fillCount)||r.coverage.fillCount<0||r.coverage.fillCount>1e4||!Number.isInteger(r.coverage.pages)||r.coverage.pages<0||r.coverage.pages>10)throw new TypeError("invalid coverage counts");if(typeof r.provenance.source!="string"||r.provenance.source.length>64||typeof r.provenance.hash!="string"||!/^[a-f0-9]{64}$/i.test(r.provenance.hash))throw new TypeError("invalid history provenance");let s=Object.hasOwn(t,"nowMs")?t.nowMs:r.provenance.fetchedAt;if(Ht(s,"nowMs"),Ht(r.provenance.fetchedAt,"history fetchedAt time"),r.provenance.fetchedAt>s||!Number.isSafeInteger(s+864e5))throw new TypeError("invalid nowMs time");if(typeof a!="string"||!/^(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)$/.test(a))throw new TypeError("unsupported interval");if(!Number.isInteger(o)||o<Z.min||o>Z.max)throw new TypeError(`maxTrials must be an integer from ${Z.min} to ${Z.max}`);if(typeof n!="string"||n.length>32||!/^(?:@[0-9]+|(?:[a-z][a-z0-9_-]*:)?[A-Za-z0-9][A-Za-z0-9._-]*)$/.test(n))throw new TypeError("invalid perp coin");let l=Ne(a);Fa(i,l,s,n,a);let f=Ge({wallet:r.wallet,fills:r.fills,...r.requested,source:r.provenance.source,coverage:r.coverage},{nowMs:s}),u=Nr(f),c={...f.coverage,status:r.coverage.status==="partial"?"partial":"unknown",reasons:[...new Set([...f.coverage.reasons,...r.coverage.reasons])]},h=["Behavioral imitation candidate only, not recovery of the wallet owner algorithm or evidence of a profitable edge.","Imported history coverage is unverified; no-trade labels mean no observed entry, not proof of wallet inactivity.","Fill times are decision proxies. Hidden hedges, private signals and off-venue positions are unknown.","Risk defaults are fixed research caps, never inferred from wallet size; evidence, shadow and owner execution gates remain mandatory."],d={schemaVersion:1,status:"insufficient_evidence",strategy:null,reasons:h,fingerprint:u.fingerprint,coverage:c,warnings:u.warnings,armed:!1,executionReady:!1,requiredGates:["evidence","shadow","owner_execution"],split:null,selectedCandidate:null,candidateTrials:[],trialsRun:0,fit:{},noTradeBaseline:{},observations:{labels:[],positiveDecisions:0,partialStartEpisodes:u.episodes.filter(k=>k.coin===n&&k.partialStart).length}},p={coin:n,interval:a,maxTrials:o,nowMs:s,policy:de,replay:Rr,scoring:"directional entry proxies, mean train/validation F1; fixed risk exits excluded from imitation"};function m(){return d.provenance={source:"wallet_behavioral_inference",fetchedAt:s,historyCoverageVerified:!1,historyHash:Ke(r),normalizedHistoryHash:Ke(f),barsHash:je(i),compilerHash:ge,optionsHash:Ke(p),splitHash:Ke(d.split),candidateTrialsHash:Ke(d.candidateTrials),selectedStrategyHash:d.selectedCandidate?.strategyHash??null},d.provenance.hash=Ke(d),d}if(n.startsWith("@"))return d.status="unsupported_market",h.push("Spot @indices are unsupported, not leveraged perpetual markets."),m();let y=ao({coin:n,interval:a,maxTrials:o,nowMs:s});if(d.split=Ca(i,r.requested,l),!d.split)return h.push("Insufficient market overlap, bars and positive episodes."),m();let E=d.split,x={};function A(k){let F=E[k],L=Ge({wallet:f.wallet,fills:f.fills.filter(j=>j.time<F.endTime),startTime:f.requested.startTime,endTime:F.endTime-1},{nowMs:s}),R=Nr(L);x[k]={reconstruction:R,observations:lo(R,{coin:n,bars:i,...F,intervalMs:l})};let _=x[k].observations.rows;d.noTradeBaseline[k]=Nt(_.map(j=>j.label),_.map(()=>null))}function g(){d.observations.evaluatedSplits=Object.keys(x),d.observations.labels=Object.values(x).flatMap(k=>k.observations.labels),d.observations.positiveDecisions=d.observations.labels.length,d.observations.ambiguousBars=Object.values(x).reduce((k,F)=>k+F.observations.ambiguousBars,0)}A("train"),A("validation"),g();let v=["train","validation"].flatMap(k=>To(k,x[k].observations,E[k],x[k].reconstruction,n));if(E.holdout.endTime-E.train.startTime<de.minimumSpanMs&&v.push("Insufficient time coverage: at least seven days are required."),v.length)return h.push(...v),m();let O=co({trials:y,bars:i.slice(0,E.validation.endIndex),trainRows:x.train.observations.rows,validationRows:x.validation.observations.rows});if(Object.assign(d,O),!O.selectedCandidate)return h.push("All-no-trade or inadequate train/validation fits; no candidate clears the behavioral baseline."),m();let w=y.find(k=>k.id===O.selectedCandidate.id),M=O.candidateTrials.find(k=>k.id===w.id);A("holdout"),g();let q=jt(w.strategy,i);d.fit={train:M.train,validation:M.validation,holdout:Nt(x.holdout.observations.rows.map(k=>k.label),x.holdout.observations.rows.map(k=>q[k.barIndex]))};let J=To("holdout",x.holdout.observations,E.holdout,x.holdout.reconstruction,n);(d.fit.holdout.predictedPositives===0||d.fit.holdout.balancedAccuracy<=.5||d.fit.holdout.recall<.1||d.fit.holdout.precision<.1)&&J.push("Frozen candidate has insufficient holdout behavioral fit; no re-optimization performed."),(c.status==="partial"||c.reasons.some(k=>/page_limit|record_limit|network_error|pagination_continuity|timestamp_overflow|payload_limit/.test(k)))&&J.push("Partial or truncated history cannot establish a reliable inference window.");let P=se(w.strategy,i,Rr),b=i.slice(E.holdout.startIndex,E.holdout.endIndex+1),N=i.filter(k=>typeof k.fundingPaymentRate=="number").length;return d.backtest={full:P,holdout:se(w.strategy,b,Rr),fundingCoverage:{status:"unknown",barsWithPaymentRates:N,totalBars:i.length,limitation:"Only explicit supplied fundingPaymentRate values are charged; event completeness is unverified, absent payments are not evidence of zero funding."},limitations:["Replay is not observed wallet profitability or delayed-copy performance.","Holdout replay starts flat and resets indicator warmup; full replay is descriptive, not out-of-sample performance.","Fixed research risk, next-open latency, fees, adverse slippage and volume participation are simulated, not venue execution guarantees."]},d.marketExposureComparison={basis:"Unlevered long price-only return; excludes fees, funding, slippage and execution constraints.",full:ko(i,l),holdout:ko(b,l)},J.length?h.push(...J):(d.status="candidate",d.strategy=w.strategy),m()}var Rr,de,Oo=B(()=>{$t();Mt();So();be();rt();st();Pr();Rr=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:1}),de=Object.freeze({warmupBars:64,trainFraction:.6,validationEndFraction:.8,minimumSpanMs:6048e5,minimumSplitSpanMs:864e5,minimumSplitBars:64,minimumSplitPositives:3,minimumSplitNegatives:20})});var _o={};yt(_o,{runWalletStrategyOperation:()=>Ua});function Le(e,t,r,n){if(!Number.isSafeInteger(e)||e<t||e>r)throw new TypeError(`${n} must be an integer from ${t} to ${r}`);return e}async function Ua(e,t,r={}){let n=We(t,{omitUndefined:!0});if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("wallet strategy input must be an object");let i=new Set(e==="collect"?Po:Ba);for(let v of Object.keys(n))if(!i.has(v))throw new TypeError("unsupported wallet strategy field");let a=r.nowMs;Le(a,0,Number.MAX_SAFE_INTEGER,"nowMs");let o=n.history;if(o!==void 0&&(!o||typeof o!="object"||Array.isArray(o)))throw new TypeError("history must be a wallet history object");let s=n.wallet??o?.wallet;if(typeof s!="string"||!vo.test(s))throw new TypeError("wallet must be an EVM address");if(o&&(typeof o.wallet!="string"||!vo.test(o.wallet)||o.wallet.toLowerCase()!==s.toLowerCase()))throw new TypeError("history wallet identity must match wallet");let l=n.days??7;Le(l,1,90,"days");let f=Le(n.maxPages??5,1,10,"maxPages"),u=n.endTime??o?.requested?.endTime??a,c=n.startTime??o?.requested?.startTime??Math.max(0,u-l*864e5);if(Le(u,1,a,"endTime"),Le(c,0,u-1,"startTime"),o&&(c!==o.requested?.startTime||u!==o.requested?.endTime))throw new TypeError("history requested window must match the inference window");let h=n.interval??"15m",d=n.count??1500,p=n.maxTrials??Z.max;if(e==="infer"){if(typeof n.coin!="string"||n.coin.length>32||!Da.test(n.coin))throw new TypeError("coin must be a Hyperliquid market identifier");if(Ne(h),Le(d,20,5e3,"count"),Le(p,Z.min,Z.max,"maxTrials"),n.bars!==void 0&&(!Array.isArray(n.bars)||n.bars.length>5e3))throw new TypeError("bars must be an array with at most 5000 candles")}r.signal?.throwIfAborted?.();let{collectWalletHistory:m,normalizeWalletHistory:y}=await Promise.resolve().then(()=>(Mt(),xo)),x=o?y({wallet:s,fills:o.fills,startTime:c,endTime:u,source:"import",coverage:o.coverage},{nowMs:a}):await m({wallet:s,startTime:c,endTime:u,maxPages:f},{nowMs:a,requestInfo:async v=>{r.signal?.throwIfAborted?.();let O=r.requestInfo?await r.requestInfo(v):await _e(v,{timeoutMs:1e4,maxResponseBytes:2*1024*1024,sameOriginRedirectsOnly:!0});return r.signal?.throwIfAborted?.(),O}});if(r.signal?.throwIfAborted?.(),e==="collect")return x;let{inferWalletStrategy:A}=await Promise.resolve().then(()=>(Oo(),Ao)),g=n.bars;if(g===void 0&&!n.coin.startsWith("@")&&x.fills.some(v=>v.coin===n.coin)){let O=await(r.fetchBars??St)({coin:n.coin,interval:h,count:d,endTime:u},{signal:r.signal});if(g=Array.isArray(O)?O:O?.bars,!Array.isArray(g))throw new TypeError("strategy history provider returned no bars")}return r.signal?.throwIfAborted?.(),A({history:o??x,coin:n.coin,interval:h,bars:g??[],maxTrials:p,nowMs:a})}var Po,Ba,vo,Da,$o=B(()=>{st();tt();Pr();$t();Po=["wallet","startTime","endTime","days","maxPages","nowMs"],Ba=[...Po,"history","coin","interval","bars","count","maxTrials"],vo=/^0x[0-9a-fA-F]{40}$/,Da=/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,31}|[a-z][a-z0-9]{0,15}:[A-Za-z0-9][A-Za-z0-9._-]{0,15}|@[0-9]+)$/});var No={};yt(No,{runStrategyOperation:()=>Za});import za from"node:os";import Ja from"node:path";function pt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Wa(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Hr(e){if(Array.isArray(e)){for(let t of e)Hr(t);return}if(pt(e))for(let[t,r]of Object.entries(e)){if(Va.some(n=>Wa(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Hr(r)}}function Ga(e){if(!pt(e))throw new TypeError("strategy input must be a plain object");return Hr(e),e}function Ka(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function Lr(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let i=or(e.venue),a=r.fetchBars??i.fetchBars;if(typeof a!="function")throw new Error(`strategy venue ${i.id} does not support history`);r.signal?.throwIfAborted?.();let o=await a({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.signal?.throwIfAborted?.();let s=Array.isArray(o)?o:o?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function Fr(e,t){let r=e.backtestOptions??{};if(!pt(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Io(e,t,r,n,i={}){let a=e.evidenceOptions??{};if(!pt(a))throw new TypeError("evidenceOptions must be a plain object");return{...a,...i,strategy:t,bars:r,backtestOptions:Fr(e,n)}}function jo(){return Ja.join(za.homedir(),".oracle","strategy-shadow.json")}function Ya(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function Za(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Ga(e==="collect"||e==="infer"?We(t,{omitUndefined:!0}):t),i=Ka(n,r);if(e==="collect"||e==="infer"){let{runWalletStrategyOperation:a}=await Promise.resolve().then(()=>($o(),_o));return a(e,n,{...r,nowMs:i})}if(e==="draft")return{strategy:Jn(n.prompt,{nowMs:i})};if(e==="validate"){let a=K(n.strategy);if(a.strategy.risk.expiresAt<=i)throw new Error("strategy is expired");return{valid:!0,strategy:a.strategy,strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:a.compilerVersion,requiredSeries:a.requiredSeries}}if(e==="backtest"||e==="evidence"){let a=K(n.strategy),o=await Lr(a.strategy,n,r,i);ct(a,o);let s=Xt(Io(n,a.strategy,o,i));return e==="evidence"?s:{backtest:se(a.strategy,o,Fr(n,i)),evidence:s}}if(e==="optimize"){let a=K(n.strategy),o=await Lr(a.strategy,n,r,i);ct(a,o);let s=n.trainFraction,l=n.evidenceOptions?.trainFraction;if(s!=null&&l!=null&&s!==l)throw new TypeError("conflicting trainFraction controls are forbidden");let f=s??l??.7;if(typeof f!="number"||f<=0||f>=1)throw new TypeError("trainFraction must be in (0,1)");let u=o.slice(0,Math.floor(o.length*f)),c=n.options??{};if(!pt(c))throw new TypeError("options must be a plain object");let h=Zn(a.strategy,u,{...c,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Fr(n,i)}),d=h.bestStrategy;return{strategy:d,optimization:h,evidence:Xt(Io(n,d,o,i,{trainFraction:f}))}}if(e==="shadow"){let a=kr({storePath:r.storePath??jo(),clock:()=>i}),o=n.action;if(o==="start")return await a.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(o==="list")return await a.list();if(o==="get")return await a.get(n.id);if(o==="stop")return await a.stop(n.id);if(o==="step"){let s=await a.get(n.id);if(!s)throw new Error(`shadow runner not found: ${n.id}`);let l=await Lr(s.strategy,n,r,i);return ct(K(s.strategy),l),await a.step(n.id,l,n.stepOptions??{})}throw new Error(`unknown shadow action: ${o}`)}if(e==="prepare"){let a=K(n.strategy),o=or(a.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let l=await kr({storePath:r.storePath??jo(),clock:()=>i}).get(n.shadowId);if(!l)throw new Error("strategy prepare shadow runner not found");if(l.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(l.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(l.strategyHash!==a.strategyHash||l.compilerHash!==a.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(l.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let f=n.caps??Ya(a.strategy,i);return o.prepareIntent({strategy:a.strategy,evidence:n.evidence,shadow:{id:l.id,stateHash:io(l),status:l.status,cursor:l.cursor,updatedAt:l.updatedAt},caps:f,nowMs:i,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Va,Ro=B(()=>{rt();be();Qt();Vn();Xn();so();ir();$t();Va=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import Mo from"node:fs";function Xa(e){let t={},r=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i.startsWith("--")){r.push(i);continue}let a=i.slice(2),o=e[n+1];o!=null&&!o.startsWith("--")?(t[a]=o,n++):t[a]=!0}return{flags:t,positional:r}}function xe(e,t){if(!e)throw new Error(`${t} path required`);let r;try{r=e==="-"?Mo.readFileSync(0,"utf8"):Mo.readFileSync(e,"utf8")}catch{throw new Error(`${t} could not be read`)}try{return JSON.parse(r)}catch{throw new Error(`${t} must contain valid JSON`)}}function He(e,t){if(e==null)return;if(typeof e=="boolean")throw new Error(`${t} requires a numeric value`);let r=Number(e);if(!Number.isFinite(r))throw new Error(`${t} must be a finite number`);return r}var Qa=`oracle strategy <draft|validate|backtest|optimize|evidence|shadow|prepare|collect|infer> [args]
1
+ var qo=Object.defineProperty;var B=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var yt=(e,t)=>{for(var r in t)qo(e,r,{get:t[r],enumerable:!0})};import{AsyncLocalStorage as Bo}from"node:async_hooks";function wt(e){let t=Do.getStore();if(!t||t.closed||!Uo.includes(e))return null;if(t.spans.length>=zo)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,i=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(i)&&i>=100&&i<=599?i:null)}}var Do,Uo,zo,Dr=B(()=>{Do=new Bo,Uo=["http","retry","shared"],zo=512});import ve from"node:net";import Jo from"node:dns";function gt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=u=>{if(!u)return[];let c=u.split(":"),m=c.at(-1);if(m?.includes(".")){let d=m.split(".").map(Number);if(d.length!==4||d.some(p=>!Number.isInteger(p)||p<0||p>255))return null;c.splice(c.length-1,1,(d[0]<<8|d[1]).toString(16),(d[2]<<8|d[3]).toString(16))}return c.some(d=>!/^[0-9a-f]{1,4}$/.test(d))?null:c.map(d=>Number.parseInt(d,16))},[n,i]=t.split("::"),a=r(n),o=r(i);if(!a||!o)return null;let s=t.includes("::"),l=8-a.length-o.length;if(!s&&l!==0||s&&l<1)return null;let f=[...a,...Array(Math.max(0,l)).fill(0),...o];return f.length!==8?null:Uint8Array.from(f.flatMap(u=>[u>>8,u&255]))}function Bt(e,t,r){let n=Math.floor(r/8),i=r%8;for(let o=0;o<n;o+=1)if(e[o]!==t[o])return!1;if(!i)return!0;let a=255<<8-i;return(e[n]&a)===(t[n]&a)}function Dt(e){if(ve.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(ve.isIPv6(e)){let t=gt(e);if(!t)return!1;let r=gt("::ffff:0:0");return Bt(t,r,96)?Dt([...t.slice(12)].join(".")):Bt(t,gt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([i,a])=>Bt(t,gt(i),a)):!1}return!1}function Wo(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(Vo.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ve.isIP(r);return n!==0&&!Dt(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ut(e,{lookupFn:t=Jo.promises.lookup}={}){let r=Wo(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:ve.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(i=>!Dt(i.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function Go(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function zt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,i;try{i=await t(),r=i.Agent,n=i.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 a=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),o=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||(ve.isIPv6(p.address)?6:4)})),l=(d,p,h)=>{o.set(a(d),s(typeof p=="string"?[{address:p,family:h}]:p))},f=d=>{let p=a(d);if(ve.isIP(p))return[{address:p,family:ve.isIPv6(p)?6:4}];let h=o.get(p);if(!h||!h.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return h},u=Go(),c=u&&typeof i.ProxyAgent=="function"?new i.ProxyAgent({uri:u.uri,token:`Bearer ${u.token}`,connectTimeout:1e4}):new r({connect:{lookup(d,p,h){let y;try{y=f(d)}catch(E){return h(E)}return p?.all?h(null,y):h(null,y[0].address,y[0].family)}}}),m=Ko((d,p={})=>n(d,{...p,dispatcher:c}),l);return{dispatcher:c,fetch:m,pin:l,resolve:f,async close(){try{await c.destroy()}catch{}}}}function Ko(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[Jt]=Object.freeze({pin:t}),e}function Vt(e){return typeof e=="function"&&typeof e[Jt]?.pin=="function"}function Ur(e,t,r){if(!Vt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Jt].pin(t,r)}var Vo,Jt,zr=B(()=>{Vo=new Set(["localhost","metadata.google.internal","metadata.goog"]);Jt=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Yo}from"node:crypto";import{types as we}from"node:util";function W(e){return Se(`HTTP JSON body refused: ${e}`)}function ii(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 we[t]=="function"&&we[t](e))}function si(e){let t=[],r=0,n=0,i=0,a=0,o=new WeakSet,s=u=>{if(r+=Buffer.byteLength(u,"utf8"),r>ye.bytes)throw W("serialized byte limit exceeded");t.push(u)},l=u=>{if(Buffer.byteLength(u,"utf8")>ye.bytes)throw W("serialized byte limit exceeded");return JSON.stringify(u)},f=(u,c)=>{if(n+=1,n>ye.nodes)throw W("node limit exceeded");if(c>ye.depth)throw W("depth limit exceeded");if(u===null){s("null");return}if(typeof u=="string"){s(l(u));return}if(typeof u=="boolean"){s(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw W("non-finite number");s(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw W("unsupported non-JSON value");if(we.isProxy(u))throw W("proxy value");if(ii(u))throw W("unsupported exotic object");if(o.has(u))throw W("cyclic value");o.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw W("symbol-keyed fields are unsupported");if(Array.isArray(u)){let p=Object.getPrototypeOf(u),h=0;for(;p!==null;){if(we.isProxy(p))throw W("proxy array prototype");if(h+=1,h>ye.depth)throw W("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(u.length>ye.arrayLength)throw W("array length limit exceeded");for(let E=0;E<u.length;E+=1){let x=Object.getOwnPropertyDescriptor(u,String(E));if(!x||!Object.hasOwn(x,"value")||x.enumerable!==!0)throw W("array entries must be dense enumerable own data")}let y=0;for(let E in u){if(a+=1,a>ye.fields)throw W("enumeration limit exceeded");if(Object.hasOwn(u,E)&&(y+=1,y>u.length))throw W("named array fields are unsupported")}if(y!==u.length)throw W("array entries must be dense enumerable own data");s("[");for(let E=0;E<u.length;E+=1)E&&s(","),f(Object.getOwnPropertyDescriptor(u,String(E)).value,c+1);s("]");return}let m=Object.getPrototypeOf(u);if(m!==Object.prototype&&m!==null)throw W("non-plain object");let d=[];for(let p in u){if(a+=1,a>ye.fields)throw W("enumeration limit exceeded");if(!Object.hasOwn(u,p))continue;if(i+=1,i>ye.fields)throw W("field limit exceeded");let h=Object.getOwnPropertyDescriptor(u,p);if(!h||!Object.hasOwn(h,"value")||h.enumerable!==!0)throw W("object fields must be enumerable own data");d.push([p,h.value])}s("{");for(let p=0;p<d.length;p+=1)p&&s(","),s(l(d[p][0])),s(":"),f(d[p][1],c+1);s("}")}finally{o.delete(u)}};return f(e,0),t.join("")}function ai(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(we.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 i=n.toLowerCase();if(r.has(i))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(i);let a=Object.getOwnPropertyDescriptor(e,n);if(!a||!Object.hasOwn(a,"value"))throw new TypeError("HTTP headers must contain own data properties");let o=a.value;if(o==null||["object","function","symbol"].includes(typeof o))throw new TypeError("HTTP header values must be scalar");t[n]=String(o)}return t}function li(){return Object.assign(Object.create(null),{Accept:"application/json"})}function ci(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 ui(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function bt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Kr.get(e);return t||(t=Yr,Yr+=1,Kr.set(e,t)),`reference:${t}`}function Zr(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?fi.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 Xr(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(Zr);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Zr(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&di.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function pi(e,t,r,n={},i=null){let a=Yo("sha256"),o=(l,f)=>{let u=String(f);a.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),a.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
2
+ `)};o("method",e),o("url",t),Object.keys(r||{}).map((l,f)=>({name:l.toLowerCase(),order:f,value:String(r[l])})).sort((l,f)=>l.name.localeCompare(f.name)||l.order-f.order).forEach((l,f)=>{o(`header-name-${f}`,l.name),o(`header-value-${f}`,l.value)}),o("body",i??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])o(`context-${l}`,n[l]??"-");return a.digest("hex")}function mi(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Vr):Math.min(250*2**e,Vr)+Math.floor(Math.random()*100)}function Se(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Gt(e,t,r){return Se(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Pe(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function yi(e){return e?e.byteLength??e.length??0:0}async function wi(e,t,{url:r,truncate:n=!1,onOversize:i}={}){if(t==null)return await e.text();let a=Number(e.headers?.get?.("content-length"));if(Number.isFinite(a)&&a>t&&(Pe(e),!n))throw Gt(r,`content-length ${a}`,t);let o=e.body?.getReader?.();if(!o){let c=await e.text(),m=Buffer.byteLength(c,"utf8");if(m>t){if(!n)throw Gt(r,`body ${m} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let s=[],l=0,f=!1;try{for(;;){let{value:c,done:m}=await o.read();if(m)break;if(c&&(s.push(Buffer.from(c)),l+=yi(c),l>t)){f=!0;break}}}finally{if(f)try{await o.cancel()}catch{}try{o.releaseLock?.()}catch{}}if(f&&(typeof i=="function"&&i(),!n))throw Gt(r,`streamed ${l} bytes`,t);let u=Buffer.concat(s);return(f?u.subarray(0,t):u).toString("utf8")}function gi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function bi(e,{fetchImpl:t,method:r,headers:n,body:i,timeoutMs:a,lookupFn:o,realFetch:s,untrustedUrl:l=!1,maxResponseBytes:f=null,sameOriginRedirectsOnly:u=!1,importUndici:c,validateResponse:m,signal:d,redirectPolicy:p="follow",maxRedirects:h=Et}){let y=null,E=t,x=o?{lookupFn:o}:{};if(l&&!s&&!Vt(E))throw Se(`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 O=new AbortController,g=setTimeout(()=>O.abort(),a),v=d?Gr?Gr([d,O.signal]):d:O.signal,A=async(w,{status:M=null}={})=>{let C=await Ut(w,x);if(!C.ok)throw Se(M==null?`HTTP refused ${w}: ${C.error}`:`HTTP redirect to ${w} ${C.error}`,M==null?{}:{status:M});let J=new URL(w).hostname;if(s){if(y&&(await y.close(),y=null),!y)try{y=await zt({requireUndici:!0,...c?{importUndici:c}:{}})}catch(P){throw Se(M==null?`HTTP refused ${w}: ${P?.message||P}`:`HTTP redirect to ${w} refused: ${P?.message||P}`,M==null?{}:{status:M})}y.pin(J,C.addresses),E=y.fetch}else Ur(E,J,C.addresses);return C};try{let w=String(e),M=Object.assign(Object.create(null),n||{});l&&await A(w);for(let C=0;C<=h;C+=1){let J=Object.assign(Object.create(null),{method:r,headers:M,body:i,signal:v,redirect:"manual",dispatcher:void 0}),P=await E(w,J);if((p==="error"||h===0)&&P.status>=300&&P.status<400)throw Pe(P),Se(`HTTP ${P.status} ${r} redirect refused`,{status:P.status,redirectRefused:!0});if(oi.has(P.status)){let j=u===!0&&r==="POST"&&[307,308].includes(P.status)&&Xr(r,i);if(r!=="GET"&&r!=="HEAD"&&!j){Pe(P);let k=new Error(`HTTP ${P.status} ${r} ${w} redirected non-idempotent request`);throw k.status=P.status,k}if(C===h)throw Pe(P),Se(`HTTP ${P.status} ${r} redirect budget exhausted`,{status:P.status,redirectRefused:!0});let q=P.headers?.get?.("location"),L;try{L=ci(q,w)}catch(k){throw Pe(P),k}let R=!ui(L,w);if(Pe(P),R&&r==="POST"){let k=new Error(`HTTP ${P.status} ${r} cross-origin redirect refused`);throw k.status=P.status,k}if(R&&u){let k=new Error(`HTTP ${P.status} ${r} cross-origin redirect refused`);throw k.status=P.status,k.retryable=!1,k}if(R&&(M=li(M)),l)await A(L,{status:P.status});else if(R){let k=await Ut(L,x);if(!k.ok){let I=new Error(`HTTP redirect from ${w} ${k.error}`);throw I.status=P.status,I.retryable=!1,I}s&&k.addresses?.length&&(y||(y=await zt(c?{importUndici:c}:{})),y&&(y.pin(new URL(L).hostname,k.addresses),E=y.fetch))}w=L;continue}if(typeof m=="function")try{await m(P,{url:w})}catch(j){throw Pe(P),Se(j?.message||String(j))}let b=await wi(P,f,{url:w,onOversize:()=>O.abort()}),N=gi(b);if(!P.ok){let j=new Error(`HTTP ${P.status} ${r} ${w}`);throw j.status=P.status,j.retryAfter=P.headers?.get?.("retry-after")??null,j.body=N??b.slice(0,300),j}return N??b}throw new Error(`HTTP redirect loop for ${e}`)}catch(w){if(O.signal.aborted&&!et(d)){let M=w&&(typeof w=="object"||typeof w=="function")&&!we.isProxy(w)?w:null,C=M?Object.getOwnPropertyDescriptor(M,"oversize"):null;if(!(C&&Object.hasOwn(C,"value")&&C.value===!0))try{if(!M)throw new TypeError("unsafe rejection");Object.defineProperties(M,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let P=new Error("HTTP request timed out");throw Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),P}}throw w}finally{clearTimeout(g),y&&await y.close()}}async function Qr(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&we.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let I of Object.getOwnPropertyNames(t)){let $=Object.getOwnPropertyDescriptor(t,I);if(!(I==="toJSON"&&$&&Object.hasOwn($,"value")&&$.value===void 0)){if(!r.has(I))throw new TypeError("HTTP options contain unknown fields");if(!$||!$.enumerable||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=I=>{if(t==null||!Object.hasOwn(t,I))return;let $=Object.getOwnPropertyDescriptor(t,I);if(!$||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain own data properties");return $.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let i=n("method");if(i!==void 0&&(typeof i!="string"||!/^[A-Za-z]+$/u.test(i)))throw new TypeError("HTTP method must be a string token");let a=n("timeoutMs");if(a!==void 0&&(!Number.isInteger(a)||a<1||a>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let o=n("retries");if(o!==void 0&&(!Number.isInteger(o)||o<0||o>10))throw new TypeError("HTTP retries must be a bounded integer");let s=n("redirectPolicy");if(s!==void 0&&s!=="follow"&&s!=="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>Et))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Et}`);if(s==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let f=s??"follow",u=f==="error"?0:l??Et;for(let I of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let $=n(I);if($!==void 0&&typeof $!="boolean")throw new TypeError(`HTTP ${I} must be boolean`)}let c=n("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let m=n("signal");if(m!==void 0){if(we.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{et(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let I of["importUndici","lookupFn","validateResponse"]){let $=n(I);if($!==void 0&&typeof $!="function")throw new TypeError(`HTTP ${I} must be a function`)}let d=n("fetchImpl"),p=d||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let h=a??12e3,y=(i||"GET").toUpperCase(),E=n("headers"),x=ai(E),O=Object.assign(Object.create(null),x);Object.keys(O).some(I=>I.toLowerCase()==="accept")||(O.Accept="application/json");let g=n("body");g!=null&&typeof g!="string"&&(Object.keys(O).find($=>$.toLowerCase()==="content-type")||(O["Content-Type"]="application/json"),g=si(g));let v=o??Xo,A=n("lookupFn"),w=!d,M=n("untrustedUrl")===!0,C=n("sameOriginRedirectsOnly")===!0,J=n("importUndici"),P=n("validateResponse"),b=m,N=c??null,j=async()=>{let I;for(let $=0;$<=v;$++){b&&ti.call(b);let Q=wt("http");try{let Y=await bi(e,{fetchImpl:p,method:y,headers:O,body:g,timeoutMs:h,lookupFn:A,realFetch:w,untrustedUrl:M,maxResponseBytes:N,sameOriginRedirectsOnly:C,importUndici:J,validateResponse:P,signal:b,redirectPolicy:f,maxRedirects:u});return Q?.("succeeded"),Y}catch(Y){I=Y;let ee=Ae=>{if(!Y||typeof Y!="object"&&typeof Y!="function"||we.isProxy(Y))return;let me=Object.getOwnPropertyDescriptor(Y,Ae);return me&&Object.hasOwn(me,"value")?me.value:void 0},pe=ee("status");Q?.("failed",pe);let mt=ee("oracleTimeout")===!0||ee("name")==="AbortError"||ee("name")==="TimeoutError"||et(b),ht=new Set([408,425,429]),Cr=ee("retryable")===!1?!1:pe!=null?ht.has(pe)||Zo.has(pe)&&Jr.has(y):!mt&&Jr.has(y);if($===v||!Cr)throw Y;let Ye=mi($,ee("retryAfter")),Ft=wt("retry"),Ze=!1;try{b?await new Promise((Ae,me)=>{let Fe,Oe=()=>{clearTimeout(Fe),Wr.call(b,"abort",Oe),me(ni(b)||new DOMException("Aborted","AbortError"))};if(et(b)){Oe();return}Fe=setTimeout(()=>{Wr.call(b,"abort",Oe),Ae()},Ye),ri.call(b,"abort",Oe,{once:!0}),et(b)&&Oe()}):await hi(Ye),Ze=!0}finally{Ft?.(Ze?"succeeded":"failed")}}}throw I};if(!(n("dedupe")!==!1&&!b&&Xr(y,g)))return j();let L=pi(y,e,O,{untrustedUrl:M,maxResponseBytes:N,sameOriginRedirectsOnly:C,redirectPolicy:f,maxRedirects:u,timeoutMs:h,retries:v,fetchImpl:bt(p),realFetch:w,lookupFn:bt(A),importUndici:bt(J),validateResponse:bt(P)},g),R=Wt.get(L);if(R){let I=wt("shared");try{let $=await R;return I?.("succeeded"),$}catch($){throw I?.("failed"),$}}let k=j().finally(()=>Wt.delete(L));return Wt.set(L,k),k}var Zo,Jr,Xo,Vr,Qo,ei,ti,ri,Wr,Gr,et,ni,oi,Et,fl,ye,Wt,Kr,Yr,fi,di,hi,en=B(()=>{Dr();zr();Zo=new Set([408,425,429,500,502,503,504]),Jr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Xo=2,Vr=4e3,Qo=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ei=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ti=AbortSignal.prototype.throwIfAborted,ri=EventTarget.prototype.addEventListener,Wr=EventTarget.prototype.removeEventListener,Gr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,et=e=>e?Qo.call(e):!1,ni=e=>e?ei.call(e):void 0,oi=new Set([301,302,303,307,308]),Et=3,fl=64*1024,ye=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Wt=new Map,Kr=new WeakMap,Yr=1;fi=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),di=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);hi=e=>new Promise(t=>setTimeout(t,e))});import{types as tn}from"node:util";function Ei(e){if(!e||typeof e!="object"||tn.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function xt(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(tn.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let i=new Array(e.length);for(let a=0;a<e.length;a+=1){let o=Object.getOwnPropertyDescriptor(e,String(a));if(!o||!Object.hasOwn(o,"value"))throw new Error(`${t} arrays must contain dense own data`);i[a]=xt(o.value,t,r+1)}return i}if(!Ei(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let i of Object.keys(e)){let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${t} objects must contain own data`);n[i]=xt(a.value,t,r+1)}return n}var rn=B(()=>{});function Ti({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"?Si:xi}async function _e(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Ti(t);return xt(await Qr(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function nn(e={}){return _e({type:"meta"},e)}async function on({coin:e,interval:t="1h",startTime:r,endTime:n},i={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let a={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return _e(a,i)}async function sn({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return _e({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var xi,Si,tt=B(()=>{en();rn();xi="https://api.hyperliquid.xyz/info",Si="https://api.hyperliquid-testnet.xyz/info"});import{createHash as ki}from"node:crypto";function ce(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ce(e){return typeof e=="number"&&Number.isFinite(e)}function Zt(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Zt(t);return Object.freeze(e)}for(let t of Object.keys(e))Zt(e[t]);return Object.freeze(e)}function $e(e){if(Array.isArray(e))return e.map($e);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=$e(e[r]);return t}return e}function Kt(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function an(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Oi(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function vi(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Pi(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function cn(e){if(!ce(e))throw new TypeError("evidence artifact must be a plain object");if(!Ai.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!ce(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!ce(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!ce(e.train)||!ce(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return $e({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>$e(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function un(e){return ki("sha256").update(JSON.stringify(cn(e)),"utf8").digest("hex")}function ie(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function Yt(e,t){if(!ce(e)||!ce(e.metrics))throw new Error(`${t} metrics required`);let r=ie(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Ce(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function _i(e,{maxDailyLossPct:t}={}){let r=e.split,n=ie(r.trainStartIndex,"split.trainStartIndex"),i=ie(r.trainEndIndex,"split.trainEndIndex"),a=ie(r.trainBarCount,"split.trainBarCount",1),o=ie(r.holdoutStartIndex,"split.holdoutStartIndex"),s=ie(r.holdoutEndIndex,"split.holdoutEndIndex"),l=ie(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||i-n+1!==a||o!==i+1||s-o+1!==l)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Ce(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Yt(e.train,"train");let f=Yt(e.holdout,"holdout");if(f.tradeCount<1||f.netPnlUsd<=0||f.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Ce(t)&&f.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,c=u.windows;if(c.length<1||u.windowsRun!==c.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let m=0,d=-1;for(let h=0;h<c.length;h++){let y=c[h];if(!ce(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let E=ie(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=ie(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),O=ie(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),g=ie(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(E!==0||x>=O||O>g||O<=d)throw new Error("walk-forward windows must be chronological and disjoint");if(d=g,y.passed){if(m+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let v=Yt({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(v.tradeCount<1||v.netPnlUsd<=0||v.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Ce(t)&&v.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(y.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let p=m/c.length;if(!Ce(u.passRate)||Math.abs(u.passRate-p)>Number.EPSILON||p<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function fn(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let r=cn(e),n=$e({id:e.id,...r});if(JSON.stringify($e(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let i=un(e);if(e.id!==i)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&_i(e,t),e}function Xt({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:i=3,minTrades:a=10}={}){let o=[];if(!ce(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!ce(r))throw new TypeError("backtestOptions must be a plain object");if(!Ce(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(i)||i<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(a)||a<0)throw new TypeError("minTrades must be an integer >= 0");let s=te(e),l=qe(s),f=je(t),u=t.length,c=(R=[],k={})=>ln({status:"fail",strategy:s,sHash:l,barsHash:f,split:k.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:k.train||null,holdout:k.holdout||null,walkForward:k.walkForward||{windows:[],passRate:0},flags:[...o,...R]});if(u<10)return c([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let m=Math.floor(u*n),d=m,p=u-d;if(m<5||p<3)return c([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:m,holdoutCount:p}]);let h=t.slice(0,m),y=t.slice(d),E,x;try{E=se(s,h,r),x=se(s,y,r)}catch(R){return c([{type:"backtest_error",message:String(R.message||R)}])}let O={metrics:Kt(E),costs:an(E),tradeCount:E.metrics.tradeCount},g={metrics:Kt(x),costs:an(x),tradeCount:x.metrics.tradeCount},v={trainStartIndex:0,trainEndIndex:m-1,trainBarCount:m,holdoutStartIndex:d,holdoutEndIndex:u-1,holdoutBarCount:p,trainFraction:n},A=[],w=Math.floor(u/(i+1));if(w<3)o.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:w});else for(let R=0;R<i;R++){let k=w*(R+1),I=k,$=Math.min(u,I+w);if($-I<3||k<3){A.push({index:R,trainStartIndex:0,trainEndIndex:k-1,evalStartIndex:I,evalEndIndex:$-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Q=t.slice(I,$),Y;try{Y=se(s,Q,r)}catch{A.push({index:R,trainStartIndex:0,trainEndIndex:k-1,evalStartIndex:I,evalEndIndex:$-1,passed:!1,reason:"backtest_error",metrics:null});continue}let ee=Kt(Y),pe=Pi(ee,s.risk,a);A.push({index:R,trainStartIndex:0,trainEndIndex:k-1,evalStartIndex:I,evalEndIndex:$-1,passed:pe,reason:pe?"pass":"fail_metrics",metrics:ee})}let M=A.filter(R=>R.passed).length,C=A.length===0?0:M/A.length,J={windows:A,passRate:C,windowsRun:A.length};g.metrics.tradeCount===0&&O.metrics.tradeCount===0&&o.push({type:"no_trades",message:"no trades in train or holdout"}),g.metrics.tradeCount===0&&o.push({type:"absent_oos_trades",message:"holdout produced no trades"}),g.metrics.netPnlUsd<0&&o.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),O.metrics.netPnlUsd>0&&g.metrics.netPnlUsd<0&&O.metrics.netPnlUsd>Math.abs(g.metrics.netPnlUsd)*.25?o.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):O.metrics.netPnlUsd>0&&g.metrics.netPnlUsd>0&&g.metrics.netPnlUsd<O.metrics.netPnlUsd*.1&&O.metrics.tradeCount>=a&&o.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let P=Oi(g.costs),b=vi(x);b>0&&P>b&&o.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let N=o.some(R=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(R.type)),j=o.some(R=>R.type==="overfit"),q="fail";return g.metrics.tradeCount>=a&&g.metrics.netPnlUsd>0&&g.metrics.profitFactor>1&&g.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&C>=.6&&!(b>0&&P>b)&&!j&&!o.some(R=>R.type==="severe_oos_collapse"||R.type==="invalid_windowing")?q="pass_live_eligible":!N&&g.metrics.tradeCount>0&&O.metrics.tradeCount>0&&Number.isFinite(g.metrics.netPnlUsd)?(q="pass_paper_only",g.metrics.tradeCount<a&&o.push({type:"undersampled",message:"holdout trades below minTrades"})):j&&g.metrics.tradeCount>0&&O.metrics.netPnlUsd>0?q="fail":g.metrics.tradeCount>0&&O.metrics.tradeCount>0&&!N?q="pass_paper_only":q="fail",g.metrics.netPnlUsd<0&&(q=q==="pass_live_eligible"?"fail":q==="pass_paper_only"?"pass_paper_only":"fail",q="fail"),ln({status:q,strategy:s,sHash:l,barsHash:f,split:v,train:O,holdout:g,walkForward:J,flags:o})}function ln({status:e,strategy:t,sHash:r,barsHash:n,split:i,train:a,holdout:o,walkForward:s,flags:l}){let f={status:e,strategyHash:r,compilerHash:ge,barsHash:n,split:i,train:a,holdout:o,walkForward:s,flags:l};return f.id=un(f),Zt($e(JSON.parse(JSON.stringify(f))))}var Ai,Qt=B(()=>{be();Ie();rt();Ai=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as $i,createHmac as Ii,timingSafeEqual as kl}from"node:crypto";function er(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(er).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${er(e[r])}`).join(",")}}`}function dn(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function pn(e=process.env){return dn(process.env)||dn(e)}function Mi(e){let{prepareHash:t,prepareMac:r,note:n,...i}=e||{};return i}function Li(e){let t=Mi(e);return $i("sha256").update(er(t)).digest("hex")}function Hi(e,t=pn()){return t?Ii("sha256",t).update(String(e)).digest("hex"):""}function mn(e,{provider:t,kind:r,env:n=process.env,nowMs:i=Date.now(),expiresAtMs:a}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let o=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(o&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:o?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let l=Number(i),f=a==null?l+Ni:Number(a),u=f-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(f)||u<=0||u>Ri)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...s,preparedAt:l,expiresAt:f,prepareVersion:ji},d=Li(m),p=pn(n),h=p?Hi(d,p):void 0,y={...m,prepareHash:d};return h&&(y.prepareMac=h),y}var ji,Ni,Ri,hn=B(()=>{ji=2,Ni=300*1e3,Ri=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function nt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ci(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function rr(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>rr(r,`${t}[${n}]`));return}if(nt(e))for(let[r,n]of Object.entries(e)){let i=Ci(r);if(Fi.some(a=>i.includes(a)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);rr(n,`${t}.${r}`)}}function tr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function yn({strategy:e,evidence:t,shadow:r,caps:n,nowMs:i=Date.now(),env:a=process.env}={}){if(rr({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!nt(e))throw new Error("handoff: strategy required");if(!nt(t))throw new Error("handoff: evidence required");if(!nt(r))throw new Error("handoff: shadow required");if(!nt(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>i)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let o=te(e,{nowMs:i}),s=K(o);if(fn(t,{maxDailyLossPct:o.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let l=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let m of l)if(!(m in n)||n[m]==null)throw new Error(`handoff: caps.${m} required`);if(!tr(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!tr(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!tr(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let f=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>f)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(m=>m==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>i))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},c={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:ot,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return mn(c,{provider:"hl-strategy",kind:"strategy-live-handoff",env:a})}var Fi,wn=B(()=>{be();Qt();Ie();hn();Fi=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Be(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function De(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function it(e){if(Array.isArray(e))for(let t of e)it(t);else if(e&&typeof e=="object")for(let t of Object.values(e))it(t);return Object.freeze(e)}function Ne(e){if(typeof e!="string")throw new TypeError("unsupported strategy interval");let t=qi[e];if(typeof t!="number")throw new TypeError("unsupported strategy interval");return t}function Bi(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");De(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let i=e[n];if(!i||typeof i!="object"||Array.isArray(i))throw new TypeError(`candles[${n}] must be an object`);let a=De(Number(i.t),`candles[${n}].t`);if(De(Number(i.T),`candles[${n}].T`)>t)continue;let s={t:a,o:Be(i.o,`candles[${n}].o`),h:Be(i.h,`candles[${n}].h`),l:Be(i.l,`candles[${n}].l`),c:Be(i.c,`candles[${n}].c`),v:Be(i.v,`candles[${n}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${n}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${n}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let l=r.get(a);if(l&&JSON.stringify(l)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${a}`);l||r.set(a,s)}return it([...r.values()].sort((n,i)=>n.t-i.t))}function Di(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let i=e[n];if(!i||typeof i!="object"||Array.isArray(i))throw new TypeError(`funding[${n}] must be an object`);let a=De(Number(i.time),`funding[${n}].time`);a>t||r.set(a,{time:a,fundingRate:Be(i.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,i)=>n.time-i.time)}async function Ui({coin:e,startTime:t,endTime:r},n){let i=[],a=Math.max(0,t-288e5),o=!1;for(let s=0;s<16&&a<=r;s++){n.signal?.throwIfAborted();let l=await sn({coin:e,startTime:a,endTime:r},n);if(!Array.isArray(l))throw new TypeError("Hyperliquid funding history must be an array");i.push(...l);let f=a;for(let u of l){let c=Number(u?.time);Number.isSafeInteger(c)&&c>f&&(f=c)}if(l.length<500||f>=r){o=!0;break}if(f<=a)throw new Error("Hyperliquid funding history pagination did not advance");a=f+1}if(!o)throw new Error("strategy history exceeds the bounded funding history limit");return Di(i,r)}function zi(e,t,r){let n=0,i=null;return e.map(a=>{let o=a.t+r,s=0;for(;n<t.length&&t[n].time<o;){let l=t[n];i=l.fundingRate,l.time>=a.t&&(s+=l.fundingRate),n+=1}return i==null?{...a,fundingPaymentRate:s}:{...a,fundingRate:i,fundingPaymentRate:s}})}async function St(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=e.coin;if(typeof r!="string"||r.length>32||!/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,31}|[a-z][a-z0-9]{0,15}:[A-Za-z0-9][A-Za-z0-9._-]{0,15})$/.test(r))throw new TypeError("coin must be a Hyperliquid market identifier");let n=String(e.interval||"15m"),i=Ne(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let a=De(e.endTime,"endTime"),o=e.count==null?1500:e.count;if(!Number.isInteger(o)||o<20||o>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,a-o*i):De(e.startTime,"startTime");if(s>=a)throw new TypeError("startTime must be before endTime");let[l,f]=await Promise.all([on({coin:r,interval:n,startTime:s,endTime:a},t),Ui({coin:r,startTime:s,endTime:a},t)]),u=Bi(l,{endTime:a}),c=it(zi(u,f,i));return it({coin:r,interval:n,range:{startTime:s,endTime:a},bars:c})}var qi,st=B(()=>{tt();qi=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function Wi(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let r of Object.keys(e))Vi.has(r)||t.push({path:`market.${r}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!Ji.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function Gi(e={}){let t=await nn(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var Ji,Vi,gn,bn=B(()=>{tt();wn();st();Ji=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Vi=new Set(["coin","interval"]);gn=Object.freeze({id:"hyperliquid",validateMarket:Wi,fetchBars:St,listMarkets:Gi,prepareIntent(e){return yn(e)}})});function Yi(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of Ki.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function nr(e){return typeof e!="string"?null:Zi.get(e)??null}function or(e){let t=nr(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Ki,En,Zi,Fl,ir=B(()=>{bn();Ki=Object.freeze(["id","validateMarket","prepareIntent"]);En=[gn].map(Yi),Zi=new Map(En.map(e=>[e.id,e])),Fl=Object.freeze([...En])});import{createHash as Xi}from"node:crypto";function oe(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function V(e){return typeof e=="number"&&Number.isFinite(e)}function Pn(e){return Number.isInteger(e)&&e>0}function ur(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ur(t);return Object.freeze(e)}for(let t of Object.keys(e))ur(e[t]);return Object.freeze(e)}function fr(e){if(Array.isArray(e))return e.map(fr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=fr(e[r]);return t}return e}function S(e,t,r){e.push({path:t,message:r})}function Te(e,t,r,n){for(let i of Object.keys(e))t.has(i)||S(n,r?`${r}.${i}`:i,"unknown field is not allowed")}function jn(e,t,r,n){if(!V(e)||!V(t)||!V(r)||!V(n)||n<=0||e<t||e>r)return!1;let i=(e-t)/n;if(!Number.isFinite(i))return!1;let a=Math.round(i);return Math.abs(i-a)<=1e-9}function cr(e,t,r,n){if(oe(e)){if(Te(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return S(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return S(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let i=r[e.param];return!oe(i)||![i.value,i.min,i.max,i.step].every(Pn)?(S(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Pn(e)?e:(S(n,t,"must be a positive integer or {param}"),null)}function _n(e,t,r,n){return oe(e)?(Te(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(S(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(S(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):V(e)?e:(S(n,t,"must be a finite number or {param}"),null)}function Tt(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function as(e){let t=new Map,r=n=>{let i=t.get(n)||0;if(i===1)return!0;if(i===2)return!1;t.set(n,1);let a=e.get(n);if(a){for(let o of Tt(a))if(e.has(o)&&r(o))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function ls(e,t){if(!oe(e))return S(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>An)return S(t,"parameters",`too many parameters (max ${An})`),null;let n={};for(let i of r){if(!$n.test(i)){S(t,`parameters.${i}`,"parameter name is malformed");continue}let a=e[i],o=`parameters.${i}`;if(!oe(a)){S(t,o,"must be a plain object");continue}Te(a,Sn,o,t);for(let c of Sn)c in a||S(t,`${o}.${c}`,"required field is missing");let{value:s,min:l,max:f,step:u}=a;V(l)||S(t,`${o}.min`,"must be a finite number"),V(f)||S(t,`${o}.max`,"must be a finite number"),(!V(u)||u<=0)&&S(t,`${o}.step`,"must be a positive finite number"),V(s)||S(t,`${o}.value`,"must be a finite number"),V(l)&&V(f)&&l>f&&S(t,`${o}.min`,"min must be <= max"),V(s)&&V(l)&&V(f)&&V(u)&&u>0&&(jn(s,l,f,u)||S(t,`${o}.value`,"value must lie on the declared min/max/step grid")),n[i]={value:s,min:l,max:f,step:u}}return n}function cs(e,t,r,n){let i=`nodes.${t}`;if(!oe(e))return S(n,i,"must be a plain object"),null;if(typeof e.type!="string"||!kn[e.type])return S(n,`${i}.type`,"unknown or missing node type"),Te(e,ss,i,n),null;switch(Te(e,kn[e.type],i,n),(typeof e.id!="string"||!In.test(e.id))&&S(n,`${i}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Qi.has(e.field))&&S(n,`${i}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let a=_n(e.value,`${i}.value`,r,n);return{id:e.id,type:"constant",value:a}}case"indicator":{(typeof e.indicator!="string"||!es.has(e.indicator))&&S(n,`${i}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let a=e.indicator,o={id:e.id,type:"indicator",indicator:a};if(a==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?S(n,`${i}.input`,"must be a node id string when provided"):o.input=e.input);let s=cr(e.period,`${i}.period`,r,n);s!=null&&(o.period=s)}else typeof e.input!="string"||!e.input?S(n,`${i}.input`,"must be a node id string"):o.input=e.input;if((a==="sma"||a==="ema"||a==="rsi"||a==="bollinger"||a==="atr")&&("period"in e,a!=="macd"))if(!("period"in e))S(n,`${i}.period`,"required field is missing");else{let s=cr(e.period,`${i}.period`,r,n);s!=null&&(o.period=s)}if(a==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))S(n,`${i}.${s}`,"required field is missing");else{let l=cr(e[s],`${i}.${s}`,r,n);l!=null&&(o[s]=l)}"output"in e?os.has(e.output)?o.output=e.output:S(n,`${i}.output`,"must be line|signal|histogram"):S(n,`${i}.output`,"required field is missing"),"period"in e&&S(n,`${i}.period`,"forbidden for macd"),"stdDev"in e&&S(n,`${i}.stdDev`,"forbidden for macd")}else if(a==="bollinger"){if(!("stdDev"in e))S(n,`${i}.stdDev`,"required field is missing");else{let s=_n(e.stdDev,`${i}.stdDev`,r,n);s!=null&&(typeof s=="number"&&s<=0?S(n,`${i}.stdDev`,"must be > 0"):o.stdDev=s)}"output"in e?is.has(e.output)?o.output=e.output:S(n,`${i}.output`,"must be upper|middle|lower"):S(n,`${i}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&S(n,`${i}.${s}`,`forbidden for ${a}`)}else{"output"in e&&S(n,`${i}.output`,`forbidden for ${a}`),"stdDev"in e&&a!=="bollinger"&&S(n,`${i}.stdDev`,`forbidden for ${a}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&S(n,`${i}.${s}`,`forbidden for ${a}`)}return o}case"compare":return(typeof e.op!="string"||!ts.has(e.op))&&S(n,`${i}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&S(n,`${i}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&S(n,`${i}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!rs.has(e.op))&&S(n,`${i}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return S(n,`${i}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let a=[];for(let o=0;o<e.inputs.length;o++){let s=e.inputs[o];typeof s!="string"||!s?S(n,`${i}.inputs.${o}`,"must be a node id"):a.push(s)}return e.op==="not"?a.length!==1&&S(n,`${i}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&a.length<2&&S(n,`${i}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:a}}case"cross":return(typeof e.direction!="string"||!ns.has(e.direction))&&S(n,`${i}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&S(n,`${i}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&S(n,`${i}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function us(e,t,r){if(!oe(e))return S(t,"risk","must be a plain object"),null;Te(e,Tn,"risk",t);for(let m of Tn)(!(m in e)||e[m]==null)&&S(t,`risk.${m}`,"required field is missing");let n={},i=e.maxLeverage;!V(i)||i<=0||i>50?S(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=i;let a=e.maxNotionalUsd;!V(a)||a<=0?S(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=a;let o=e.positionSizePct;!V(o)||o<=0||o>100?S(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=o;let s=e.stopLossPct;!V(s)||s<=0||s>100?S(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=s;let l=e.takeProfitPct;!V(l)||l<=0||l>1e3?S(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=l;let f=e.cooldownBars;!Number.isInteger(f)||f<0||f>1e5?S(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=f;let u=e.maxDailyLossPct;!V(u)||u<=0||u>100?S(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=u;let c=e.expiresAt;return!Number.isInteger(c)||c<=0?S(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?c<=r.nowMs&&S(t,"risk.expiresAt","must be strictly greater than nowMs"):S(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=c),n}function dr(e,t={}){let r=[];if(!oe(e))return S(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};Te(e,xn,"",r);for(let c of xn)(!(c in e)||e[c]==null)&&S(r,c,"required field is missing");e.version!==sr&&S(r,"version",`must be ${sr}`),(typeof e.id!="string"||!$n.test(e.id))&&S(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>vn)&&S(r,"name",`must be a non-empty string max ${vn}`);let n=nr(e.venue);n||S(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let i=null;if(!n)oe(e.market)||S(r,"market","must be a plain object");else{let c=n.validateMarket(e.market);if(!c||typeof c.ok!="boolean"||!Array.isArray(c.errors))S(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(c.ok)i=c.market;else for(let m of c.errors)S(r,m.path,m.message)}let a=ls(e.parameters,r),o=null,s=new Map;if(!Array.isArray(e.nodes))S(r,"nodes","must be an array");else if(e.nodes.length>On)S(r,"nodes",`too many nodes (max ${On})`);else{o=[];for(let c=0;c<e.nodes.length;c++){let m=cs(e.nodes[c],c,a||{},r);m&&(typeof m.id=="string"&&In.test(m.id)&&(s.has(m.id)?S(r,`nodes.${c}.id`,`duplicate node id "${m.id}"`):s.set(m.id,m)),o.push(m))}for(let c=0;c<o.length;c++){let m=o[c],d=`nodes.${c}`;for(let p of Tt(m))s.has(p)||S(r,d,`unknown node ref "${p}"`);if(m.type==="indicator"||m.type==="compare"||m.type==="cross")for(let p of Tt(m)){let h=s.get(p);h&&ar.has(h.type)&&S(r,d,`node ref "${p}" must be numeric`)}if(m.type==="logic")for(let p of Tt(m)){let h=s.get(p);h&&!ar.has(h.type)&&S(r,d,`node ref "${p}" must be boolean`)}}as(s)&&S(r,"nodes","graph contains a cycle")}let l=null;if(!oe(e.rules))S(r,"rules","must be a plain object");else{Te(e.rules,lr,"rules",r);for(let c of lr)c in e.rules||S(r,`rules.${c}`,"required field is missing");l={};for(let c of lr){let m=e.rules[c];if(m===null){l[c]=null;continue}if(typeof m!="string"||!m){S(r,`rules.${c}`,"must be a node id or null"),l[c]=m;continue}if(!s.has(m)){S(r,`rules.${c}`,`unknown node ref "${m}"`),l[c]=m;continue}let d=s.get(m);ar.has(d.type)||S(r,`rules.${c}`,`rule must reference a boolean node, not ${d.type}`),l[c]=m}}let f=us(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let u=ur({version:sr,id:e.id,name:e.name,venue:n.id,market:i,parameters:a,nodes:o,rules:l,risk:f});return{ok:!0,errors:[],strategy:u}}function te(e,t={}){let r=dr(e,t);if(!r.ok)throw new Ue(r.errors);return r.strategy}function fs(e){let t=te(e);return JSON.stringify(fr(t))}function qe(e){let t=fs(e);return Xi("sha256").update(t,"utf8").digest("hex")}function at(e,t){if(!oe(e))throw new Ue([{path:"",message:"strategy must be a plain object"}]);if(!oe(t))throw new Ue([{path:"overrides",message:"must be a plain object"}]);let r=te(e),n={};for(let[a,o]of Object.entries(r.parameters))n[a]={value:o.value,min:o.min,max:o.max,step:o.step};let i=[];for(let[a,o]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,a)){S(i,a,`unknown parameter "${a}"`);continue}let s=n[a];if(!V(o)){S(i,a,"override must be a finite number");continue}if(!jn(o,s.min,s.max,s.step)){S(i,a,"override must lie on the declared min/max/step grid");continue}n[a]={...s,value:o}}if(i.length)throw new Ue(i);return te({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(a=>{let o={...a};return Array.isArray(a.inputs)&&(o.inputs=[...a.inputs]),o}),rules:{...r.rules},risk:{...r.risk}})}var sr,$n,In,Qi,es,ts,rs,ns,os,is,ar,xn,Sn,lr,Tn,ss,kn,An,On,vn,Ue,Ie=B(()=>{ir();sr=1,$n=/^[a-z0-9][a-z0-9._-]{0,63}$/,In=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Qi=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),es=new Set(["sma","ema","rsi","macd","bollinger","atr"]),ts=new Set(["gt","gte","lt","lte","eq"]),rs=new Set(["and","or","not"]),ns=new Set(["above","below"]),os=new Set(["line","signal","histogram"]),is=new Set(["upper","middle","lower"]),ar=new Set(["compare","logic","cross"]),xn=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Sn=new Set(["value","min","max","step"]),lr=new Set(["entryLong","entryShort","exitLong","exitShort"]),Tn=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),ss=new Set(["id","type"]),kn={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},An=16,On=128,vn=100,Ue=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function lt(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function ke(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function ds(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let i=r[n];if(typeof i!="number"||!Number.isFinite(i))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function Rn(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let i=0;i<e.length;i++)n+=e[i],i>=t&&(n-=e[i-t]),i>=t-1&&(r[i]=n/t);return r}function kt(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<t;o++)n+=e[o];let i=n/t;r[t-1]=i;let a=2/(t+1);for(let o=t;o<e.length;o++)i=a*e[o]+(1-a)*i,r[o]=i;return r}function Mn(e,t){lt(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,i=0;for(let s=1;s<=t;s++){let l=e[s]-e[s-1];l>=0?n+=l:i-=l}let a=n/t,o=i/t;r[t]=Nn(a,o);for(let s=t+1;s<e.length;s++){let l=e[s]-e[s-1],f=l>0?l:0,u=l<0?-l:0;a=(a*(t-1)+f)/t,o=(o*(t-1)+u)/t,r[s]=Nn(a,o)}return r}function Nn(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Ln(e,t={}){lt(e);let r=t.fastPeriod,n=t.slowPeriod,i=t.signalPeriod;if(ke(r),ke(n),ke(i),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let a=kt(e,r),o=kt(e,n),s=new Array(e.length).fill(null);for(let c=0;c<e.length;c++)a[c]!=null&&o[c]!=null&&(s[c]=a[c]-o[c]);let l=new Array(e.length).fill(null),f=new Array(e.length).fill(null),u=[];for(let c=0;c<s.length;c++)s[c]!=null&&u.push(c);if(u.length>=i){let c=0;for(let h=0;h<i;h++)c+=s[u[h]];let m=c/i,d=u[i-1];l[d]=m,f[d]=s[d]-m;let p=2/(i+1);for(let h=i;h<u.length;h++){let y=u[h];m=p*s[y]+(1-p)*m,l[y]=m,f[y]=s[y]-m}}return{line:s,signal:l,histogram:f}}function Hn(e,t={}){lt(e);let r=t.period,n=t.stdDev;if(ke(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let i=new Array(e.length).fill(null),a=new Array(e.length).fill(null),o=new Array(e.length).fill(null);if(e.length<r)return{upper:a,middle:i,lower:o};let s=0,l=0;for(let f=0;f<e.length;f++){let u=e[f];if(s+=u,l+=u*u,f>=r){let c=e[f-r];s-=c,l-=c*c}if(f>=r-1){let c=s/r,m=l/r-c*c;m<0&&m>-1e-12&&(m=0);let d=Math.sqrt(m);i[f]=c,a[f]=c+n*d,o[f]=c-n*d}}return{upper:a,middle:i,lower:o}}function Fn(e,t){ds(e),ke(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let o=0;o<e.length;o++){let s=e[o];if(o===0)n[o]=s.h-s.l;else{let l=e[o-1].c;n[o]=Math.max(s.h-s.l,Math.abs(s.h-l),Math.abs(s.l-l))}}let i=0;for(let o=0;o<t;o++)i+=n[o];let a=i/t;r[t-1]=a;for(let o=t;o<e.length;o++)a=(a*(t-1)+n[o])/t,r[o]=a;return r}var Cn=B(()=>{});import{createHash as ps}from"node:crypto";var pr,ms,hs,ys,qn,Bn=B(()=>{pr=3,ms="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",hs="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",ys="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",qn=ps("sha256").update(JSON.stringify({version:pr,compilerSourceHash:ms,indicatorsSourceHash:hs,schemaSourceHash:ys})).digest("hex")});function re(e){return typeof e=="number"&&Number.isFinite(e)}function bs(e){let t=new Map(e.map(s=>[s.id,s])),r=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},n=new Map,i=new Map;for(let s of e)n.set(s.id,0),i.set(s.id,[]);for(let s of e)for(let l of r(s))t.has(l)&&(i.get(l).push(s.id),n.set(s.id,n.get(s.id)+1));let a=[];for(let[s,l]of n)l===0&&a.push(s);let o=[];for(;a.length;){let s=a.shift();o.push(s);for(let l of i.get(s))n.set(l,n.get(l)-1),n.get(l)===0&&a.push(l)}if(o.length!==e.length)throw new Error("strategy graph is cyclic");return o}function ze(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Es(e,t,r){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let n=null;for(let i=0;i<=t;i++){let a=e[i];if(a==null||typeof a!="object"||Array.isArray(a))throw new TypeError(`bars[${i}] must be an object`);let{t:o,o:s,h:l,l:f,c:u,v:c}=a;if(!re(o)&&(typeof o=="number"&&Number.isFinite(o)),!Number.isFinite(o))throw new TypeError(`bars[${i}].t must be finite`);for(let[m,d]of[["o",s],["h",l],["l",f],["c",u],["v",c]])if(!re(d))throw new TypeError(`bars[${i}].${m} must be a finite number`);for(let[m,d]of[["o",s],["h",l],["l",f],["c",u]])if(!(d>0))throw new TypeError(`bars[${i}].${m} price must be positive`);if(c<0)throw new TypeError(`bars[${i}].v volume must be non-negative`);if(l<Math.max(s,u,f))throw new TypeError(`bars[${i}] high must be >= max(open, close, low)`);if(f>Math.min(s,u,l))throw new TypeError(`bars[${i}] low must be <= min(open, close, high)`);if(n!=null){if(!(o>n))throw new TypeError("bars t must be strictly increasing");if(o-n!==gs[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=o,"fundingRate"in a&&a.fundingRate!=null&&!re(a.fundingRate))throw new TypeError(`bars[${i}].fundingRate must be finite when present`);if("openInterest"in a&&a.openInterest!=null){if(!re(a.openInterest))throw new TypeError(`bars[${i}].openInterest must be finite when present`);if(a.openInterest<0)throw new TypeError(`bars[${i}].openInterest must be non-negative`)}for(let m of["premium","oiDelta"])if(m in a&&a[m]!=null&&!re(a[m]))throw new TypeError(`bars[${i}].${m} must be finite when present`);if("bookImbalance"in a&&a.bookImbalance!=null){if(!re(a.bookImbalance))throw new TypeError(`bars[${i}].bookImbalance must be finite when present`);if(a.bookImbalance<-1||a.bookImbalance>1)throw new TypeError(`bars[${i}].bookImbalance must be within [-1, 1]`)}}}function Re(e,t,r,n,i,a){if(a.has(e))return a.get(e);let o=t.get(e),s;switch(o.type){case"input":{let l=ws[o.field];s=new Array(i+1);for(let f=0;f<=i;f++){let u=n[f][l];s[f]=u===void 0?null:u}break}case"constant":{let l=ze(o.value,r);s=new Array(i+1).fill(l);break}case"indicator":{let l=o.period!=null?ze(o.period,r):void 0;if(o.indicator==="atr"){let c=[];for(let m=0;m<=i;m++){let d=n[m];c.push({o:d.o,h:d.h,l:d.l,c:d.c})}s=Fn(c,l);break}let u=Re(o.input,t,r,n,i,a).map((c,m)=>{if(c==null||!re(c))throw new TypeError(`indicator input ${o.input} has non-finite value at ${m}`);return c});if(o.indicator==="sma")s=Rn(u,l);else if(o.indicator==="ema")s=kt(u,l);else if(o.indicator==="rsi")s=Mn(u,l);else if(o.indicator==="macd")s=Ln(u,{fastPeriod:ze(o.fastPeriod,r),slowPeriod:ze(o.slowPeriod,r),signalPeriod:ze(o.signalPeriod,r)})[o.output];else if(o.indicator==="bollinger")s=Hn(u,{period:l,stdDev:ze(o.stdDev,r)})[o.output];else throw new Error(`unsupported indicator ${o.indicator}`);break}case"compare":{let l=Re(o.left,t,r,n,i,a),f=Re(o.right,t,r,n,i,a);s=new Array(i+1);for(let u=0;u<=i;u++){let c=l[u],m=f[u];if(c==null||m==null||!re(c)||!re(m)){s[u]=!1;continue}switch(o.op){case"gt":s[u]=c>m;break;case"gte":s[u]=c>=m;break;case"lt":s[u]=c<m;break;case"lte":s[u]=c<=m;break;case"eq":s[u]=c===m;break;default:s[u]=!1}}break}case"logic":{let l=o.inputs.map(f=>Re(f,t,r,n,i,a));s=new Array(i+1);for(let f=0;f<=i;f++)if(o.op==="not"){let u=l[0][f];s[f]=u===!0?!1:u===!1}else if(o.op==="and"){let u=!0;for(let c of l)if(c[f]!==!0){u=!1;break}s[f]=u}else if(o.op==="or"){let u=!1;for(let c of l)if(c[f]===!0){u=!0;break}s[f]=u}else s[f]=!1;break}case"cross":{let l=Re(o.left,t,r,n,i,a),f=Re(o.right,t,r,n,i,a);s=new Array(i+1),s[0]=!1;for(let u=1;u<=i;u++){let c=l[u-1],m=f[u-1],d=l[u],p=f[u];if(c==null||m==null||d==null||p==null||!re(c)||!re(m)||!re(d)||!re(p)){s[u]=!1;continue}o.direction==="above"?s[u]=c<=m&&d>p:s[u]=c>=m&&d<p}break}default:throw new Error(`unknown node type ${o.type}`)}return a.set(e,s),s}function K(e,t={}){let r=te(e);t&&Object.keys(t).length&&(r=at(r,t));let n=new Map(r.nodes.map(d=>[d.id,d])),i=Object.freeze(bs(r.nodes)),a=r.parameters,o=new Set(r.nodes.filter(d=>d.type==="input").map(d=>d.field));if(r.nodes.some(d=>d.type==="indicator"&&d.indicator==="atr"))for(let d of["open","high","low","close"])o.add(d);let s=Object.freeze([...o].sort()),l=qe(r);function f(d,p){let h={};for(let E of i){let x=d.get(E);h[E]=x[p]}let y=E=>E!=null&&h[E]===!0;return{values:h,signals:{entryLong:y(r.rules.entryLong),entryShort:y(r.rules.entryShort),exitLong:y(r.rules.exitLong),exitShort:y(r.rules.exitShort)}}}function u(d,p){Es(d,p,r.market.interval);let h=new Map;for(let y of i)Re(y,n,a,d,p,h);return h}function c(d,p){return f(u(d,p),p)}function m(d){if(!Array.isArray(d)||d.length===0)throw new TypeError("bars must be a non-empty array");let p=d.length-1,h=u(d,p);return Object.freeze(d.map((y,E)=>Object.freeze(f(h,E))))}return Object.freeze({strategy:r,strategyHash:l,compilerVersion:ot,compilerHash:ge,requiredSeries:s,nodeOrder:i,evaluate:c,evaluateAll:m})}var ot,ge,ws,gs,be=B(()=>{Ie();Cn();Bn();ot=pr,ge=qn,ws=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),gs=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as xs}from"node:crypto";function Ts(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ue(e){return typeof e=="number"&&Number.isFinite(e)}function mr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)mr(t);return Object.freeze(e)}for(let t of Object.keys(e))mr(e[t]);return Object.freeze(e)}function At(e){if(Array.isArray(e))return e.map(At);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=At(e[r]);return t}return e}function hr(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((r,n)=>hr(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))hr(n,`${t}.${r}`)}}function Un(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:i,o:a,h:o,l:s,c:l,v:f}=n;if(!ue(i))throw new TypeError(`bars[${r}].t must be finite`);for(let[u,c]of[["o",a],["h",o],["l",s],["c",l],["v",f]])if(!ue(c))throw new TypeError(`bars[${r}].${u} must be a finite number`);for(let[u,c]of[["o",a],["h",o],["l",s],["c",l]])if(!(c>0))throw new TypeError(`bars[${r}].${u} price must be positive`);if(f<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(o<Math.max(a,l,s))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(s>Math.min(a,l,o))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(i>t))throw new TypeError("bars t must be strictly increasing");if(t=i,"fundingRate"in n&&n.fundingRate!=null&&!ue(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!ue(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!ue(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function je(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Un(e),xs("sha256").update(JSON.stringify(At(e)),"utf8").digest("hex")}function ks(e){if(e==null&&(e={}),!Ts(e))throw new TypeError("options must be a plain object");let t={...Ss},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!ue(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let i=e[n];if(!ue(i)||i<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?i>=1e4:i>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=i}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!ue(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function Ot(e){return e/1e4}function As(e,t,r){let n=Ot(r);return t==="long"?e*(1+n):e*(1-n)}function Os(e,t,r){let n=Ot(r);return t==="long"?e*(1-n):e*(1+n)}function Dn(e,t,r){let n=Math.abs(e)*Ot(t),i=Math.abs(e)*Ot(r);return{taker:n,builder:i,total:n+i}}function vs(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function Ps(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function _s(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function $s(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let i=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-i):e*(1+1/r)/(1+i)}function Is(e,t,r){return t==="long"?e.l<=r:e.h>=r}function js(e,t,r){return t==="long"?e.h>=r:e.l<=r}function Ns(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ct(e,t){for(let r of e.requiredSeries)if(Rs.includes(r)&&!t.every(n=>ue(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function Ms(e){if(e.length<3)return 0;let t=[];for(let o=1;o<e.length;o++){let s=e[o-1].equity,l=e[o].equity;s>0&&t.push((l-s)/s)}if(t.length<2)return 0;let r=0;for(let o of t)r+=o;let n=r/t.length,i=0;for(let o of t)i+=(o-n)**2;let a=Math.sqrt(i/(t.length-1));return a>0?n/a:0}function Ls(e){let t=-1/0,r=0;for(let n of e){let i=n.equity;if(i>t&&(t=i),t>0){let a=(t-i)/t*100;a>r&&(r=a)}}return r}function se(e,t,r={}){let n=ks(r);Un(t);let i=je(t);n.nowMs!==void 0&&te(e,{nowMs:n.nowMs});let a=K(e);if(ct(a,t),n.nowMs!==void 0&&a.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let o=a.strategy.risk,s=a.evaluateAll(t),l=n.latencyBars,f=n.slippageBps,u=n.takerFeeBps,c=n.builderFeeBps,m=n.initialEquityUsd,d=0,p=0,h=0,y=0,E=0,x=[],O=[],g=[],v=[],A=[],w=null,M=0,C=null,J=m,P=!1,b=0,N=0,j=[],q=new Array(t.length).fill(0);function L(T){j.push(T)}function R(T){let H=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,H-q[T])}function k(T){if(!w)return m;let H=w.side==="long"?(T-w.entryPrice)*w.qty:(w.entryPrice-T)*w.qty;return m+H}function I(T,H,_){let U=_.o,F=vs(m,o);if(!(F>0)||!(U>0))return;let z=As(U,H,f),D=F/z,G=R(T),Xe=z*G;if(D>G){g.push({kind:"entry",barIndex:T,time:_.t,side:H,requestedNotionalUsd:F,maxFillNotionalUsd:Xe,reason:"volume_participation"});return}q[T]+=D;let le=Math.abs(z-U)*D,he=Dn(F,u,c);m-=he.total,d+=he.taker,p+=he.builder,y+=le,E+=F,w={lifecycleEpoch:++N,side:H,entryBarIndex:T,entryReferencePrice:U,entryPrice:z,qty:D,notionalUsd:F,stop:Ps(z,H,o.stopLossPct),take:_s(z,H,o.takeProfitPct),liq:$s(z,H,o.maxLeverage,u+c),entryFees:he.taker,entryBuilderFees:he.builder,entrySlippageUsd:le,fundingAccrued:0}}function $(T,H,_,U){if(!w)return!1;let F=w.side,z=H,D=z;_!=="liquidation"&&U&&(D=Os(z,F,f));let G=w.qty,Xe=G*D;if(_!=="liquidation"){let Br=R(T),Co=D*Br;if(G>Br)return g.push({kind:"exit",barIndex:T,time:t[T].t,side:F,requestedNotionalUsd:Xe,maxFillNotionalUsd:Co,reason:"volume_participation",triggerReason:_}),!1;q[T]+=G}let le=Dn(Xe,u,c),he=_==="liquidation"?0:Math.abs(D-z)*G,Qe,qt;F==="long"?(Qe=(z-w.entryReferencePrice)*G,qt=(D-w.entryPrice)*G):(Qe=(w.entryReferencePrice-z)*G,qt=(w.entryPrice-D)*G),m+=qt,m-=le.total,d+=le.taker,p+=le.builder,y+=he,E+=Xe;let Fo={side:F,entryBarIndex:w.entryBarIndex,entryTime:t[w.entryBarIndex].t,entryPrice:w.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:D,exitReason:_,qty:G,notionalUsd:w.notionalUsd,grossPnlUsd:Qe,feesUsd:w.entryFees+le.taker,builderFeesUsd:w.entryBuilderFees+le.builder,fundingUsd:w.fundingAccrued,slippageUsd:w.entrySlippageUsd+he,netPnlUsd:Qe-(w.entryFees+le.taker+w.entryBuilderFees+le.builder)-w.fundingAccrued-(w.entrySlippageUsd+he)};return x.push(Fo),_==="liquidation"&&O.push({barIndex:T,time:t[T].t,side:F,price:D,tradeIndex:x.length-1}),w=null,N+=1,b=T+1+(o.cooldownBars||0),!0}function Q(T,H,_,U){let F=T+1;if(F>=t.length)return;j.some(D=>D.kind==="exit"&&D.side===H&&D.fillBar===F&&D.epoch===U)||L({kind:"exit",side:H,signalBar:T,fillBar:F,reason:_,epoch:U})}function Y(T){let H=j.filter(_=>_.fillBar===T);for(let _=j.length-1;_>=0;_--)j[_].fillBar===T&&j.splice(_,1);H.sort((_,U)=>{let F=z=>z.kind==="exit"?0:1;return F(_)-F(U)});for(let _ of H)if(_.kind==="exit"){if(!w||w.side!==_.side||w.lifecycleEpoch!==_.epoch)continue;let U=_.reason||"rule";$(T,t[T].o,U,!0)||Q(T,_.side,U,_.epoch)}else if(_.kind==="entry"){if(w||_.epoch!==N||T<b)continue;I(T,_.side,t[T])}}function ee(T){if(!w)return;let H=t[T],_=H.fundingPaymentRate;if(_==null||!ue(_)||_===0)return;let U=Math.abs(w.qty*H.c),F=_*U;w.side==="long"?(m-=F,w.fundingAccrued+=F,h+=F):(m+=F,w.fundingAccrued-=F,h-=F)}function pe(T){if(!w)return;let H=t[T].o;(w.side==="long"?H<=w.liq:H>=w.liq)&&$(T,H,"liquidation",!1)}function mt(T){if(!w)return;let H=t[T],_=w.side,U=Ns(H,_,w.liq),F=Is(H,_,w.stop),z=js(H,_,w.take),D=G=>_==="long"?Math.min(G,H.o):Math.max(G,H.o);if(U){$(T,D(w.liq),"liquidation",!1);return}if(F&&z){$(T,D(w.stop),"stop_loss",!0)||Q(T,_,"stop_loss",w.lifecycleEpoch);return}if(F){$(T,D(w.stop),"stop_loss",!0)||Q(T,_,"stop_loss",w.lifecycleEpoch);return}z&&($(T,w.take,"take_profit",!0)||Q(T,_,"take_profit",w.lifecycleEpoch))}for(let T=0;T<t.length;T++){let H=Math.floor(t[T].t/864e5);H!==C&&(C=H,J=k(t[T].o),P=!1),pe(T),Y(T),mt(T),ee(T),!P&&k(t[T].c)<=J*(1-o.maxDailyLossPct/100)&&(P=!0,v.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let _=s[T].signals,U=T+l;if(w)(w.side==="long"&&_.exitLong===!0||w.side==="short"&&_.exitShort===!0)&&U<t.length&&(j.some(G=>G.kind==="exit"&&G.side===w.side&&G.fillBar===U&&G.epoch===w.lifecycleEpoch)||L({kind:"exit",side:w.side,signalBar:T,fillBar:U,reason:"rule",epoch:w.lifecycleEpoch}));else{let z=_.entryLong===!0,D=_.entryShort===!0;z&&D?v.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!P&&(z||D)&&U<t.length&&T>=b&&L({kind:"entry",side:z?"long":"short",signalBar:T,fillBar:U,epoch:N})}let F=m;w&&(M+=1,F=k(t[T].c)),A.push({barIndex:T,time:t[T].t,equity:F,positionSide:w?w.side:null})}let ht=null;if(w){let T=t.length-1;if($(T,t[T].c,"end_of_data",!0))A[T]={barIndex:T,time:t[T].t,equity:m,positionSide:null};else{let _=k(t[T].c);ht={side:w.side,entryBarIndex:w.entryBarIndex,entryTime:t[w.entryBarIndex].t,entryPrice:w.entryPrice,qty:w.qty,notionalUsd:w.notionalUsd,markPrice:t[T].c,markedEquityUsd:_},v.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ye=(w?k(t[t.length-1].c):m)-n.initialEquityUsd,Ft=Ye/n.initialEquityUsd*100,Ze=0,Ae=0,me=0;for(let T of x)T.netPnlUsd>0?(Ze+=1,Ae+=T.netPnlUsd):T.netPnlUsd<0&&(me+=-T.netPnlUsd);let Fe=x.length,Oe=Fe===0?0:Ze/Fe,Ct=0;me>0?Ct=Ae/me:Ae>0&&(Ct=1e12);let Lo={netPnlUsd:Ye,netPnlPct:Ft,maxDrawdownPct:Ls(A),winRate:Oe,profitFactor:Ct,tradeCount:Fe,sharpe:Ms(A),turnoverUsd:E,exposurePct:M/t.length*100},Ho={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},qr={barsHash:i,strategyHash:a.strategyHash,compilerHash:ge,compilerVersion:ot,config:Ho,trades:x,equityCurve:A,metrics:Lo,costs:{feesUsd:d,builderFeesUsd:p,fundingUsd:h,slippageUsd:y},liquidations:O,missedFills:g,openPositionAtEnd:ht,flags:v};return hr(qr),mr(At(qr))}var Ss,Rs,rt=B(()=>{be();Ie();Ss=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});Rs=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as Hs}from"node:crypto";function Js(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function yr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)yr(t);return Object.freeze(e)}for(let t of Object.keys(e))yr(e[t]);return Object.freeze(e)}function Vs(e){return String(e).trim().replace(/\s+/g," ")}function Ws(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Gs(e){for(let r of Cs)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function Ks(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let r=t[1].toLowerCase();return Fs.has(r)?r:null}function Ys(e){let t={...Bs},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[1]));let i=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);i&&(t.maxLeverage=Number(i[1]));let a=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);a&&(t.positionSizePct=Number(a[1]));let o=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return o&&(t.maxNotionalUsd=Number(o[1])),t}function Zs(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(r=>(e.match(r)??[]).length>1)}function Xs(e){let t=Hs("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),i=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(i)?i:`d${i}`.slice(0,64)}function Qs(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let r=Number(t[1]),n=t[2].toLowerCase(),i=Number(t[3]);if(!(r>0)||!(i>0)||r===i)return null;let a=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:i,direction:n,reverse:a}}function ea(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function ta(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function ra(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:r}}function na(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?(t[3]==="%"&&(r=r/100),{kind:"premium",op:t[1].toLowerCase(),threshold:r}):null}function oa(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:r}:null}function ia(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<-1||r>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:r}}function sa(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?r=r.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?r=r.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?r=r.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?r=r.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let i of n)r=r.replace(i,"");return r.replace(/[\s,;]+/g,"")===""}function zn(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function aa({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:s.direction,left:"emaLeft",right:"emaRight"}],f={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?f.entryLong="cross":f.entryShort="cross",s.reverse){let u=s.direction==="above"?"below":"above";l.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?f.exitLong="crossRev":f.exitShort="crossRev"}return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:zn(s.fast),ema_right_period:zn(s.slow)},nodes:l,rules:f,risk:{...n,expiresAt:i}}}function la({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:s.period},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function ca({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function ua({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let l=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function da({side:e,coin:t,interval:r,risk:n,expiresAt:i,id:a,name:o,spec:s}){let f=[{id:"sig_input",type:"input",field:fa[s.kind]},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:a,name:o,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:f,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:i}}}function Jn(e,t={}){if(typeof e!="string")throw new Z("prompt must be a string");if(e.length>1e3)throw new Z("prompt length must be <= 1000");if(!Js(t))throw new Z("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Z("options.nowMs is required integer epoch ms");let r=t.nowMs,n=zs;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Z("expiresInMs must be an integer");if(n=t.expiresInMs,n<Ds||n>Us)throw new Z("expiresInMs must be between 1h and 30d")}if(qs.test(e))throw new Z(`prompt appears to contain secrets and is rejected. ${Je}`);let i=Vs(e);if(!i)throw new Z(`empty prompt. ${Je}`);if(Zs(i))throw new Z(`duplicate interval or risk clause. ${Je}`);let a=Ws(i),o=Gs(i),s=Ks(i);if(!a||!o||!s)throw new Z(`could not parse side/coin/interval. ${Je}`);let l=Ys(i);if(!(l.maxLeverage>0)||l.maxLeverage>50)throw new Z("leverage out of range");if(!(l.positionSizePct>0)||l.positionSizePct>100)throw new Z("position size out of range");let f=r+n,u=Xs(i),c=`Draft ${o} ${a}`.slice(0,100),m=Qs(i),d=ea(i),p=ta(i),h=ra(i),y=na(i),E=oa(i),x=ia(i),O=[m,d,p,h,y,E,x].filter(Boolean);if(O.length!==1)throw new Z(`unsupported or ambiguous prompt. ${Je}`);if(!sa(i,O[0]))throw new Z(`unsupported or ambiguous prompt. ${Je}`);let g,v=O[0],A={side:a,coin:o,interval:s,risk:l,expiresAt:f,id:u,name:c,spec:v};v.kind==="ema_cross"?g=aa(A):v.kind==="rsi"?g=la(A):v.kind==="open_interest"?g=ua(A):v.kind==="funding"?g=ca(A):g=da(A);let w=dr(g,{nowMs:r});if(!w.ok)throw new Z(`draft failed validation: ${w.errors.map(M=>M.message).join("; ")}`);return yr(te(g,{nowMs:r}))}var Z,Fs,Cs,qs,Je,Bs,Ds,Us,zs,fa,Vn=B(()=>{Ie();Z=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Fs=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Cs=new Set(["BTC","ETH","SOL","HYPE"]),qs=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Je="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",Bs=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),Ds=36e5,Us=30*864e5,zs=864e5;fa=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as pa}from"node:crypto";function Kn(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function Yn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function gr(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)gr(t);return Object.freeze(e)}for(let t of Object.keys(e))gr(e[t]);return Object.freeze(e)}function ut(e){if(Array.isArray(e))return e.map(ut);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=ut(e[r]);return t}return e}function vt(e){return JSON.stringify(ut(e))}function ma(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let i=[],a=Math.floor((r-t)/n+1e-9);for(let s=0;s<=a;s++){let l=t+s*n;if(l>r+1e-9)break;let f=Math.abs(l-Math.round(l))<1e-9?Math.round(l):Number(l.toPrecision(12));f<t-1e-9||f>r+1e-9||i.push(f)}if(i.length===0)return[];let o=i[i.length-1];if(Math.abs(o-r)>1e-9){let s=(r-t)/n;Math.abs(s-Math.round(s))<=1e-9&&i.push(r)}return i}function ha(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let i=t[n],a=[];for(let o of r)for(let s of i)a.push({...o,[n]:s});r=a}return r.sort((n,i)=>{let a=vt(n),o=vt(i);return a<o?-1:a>o?1:0}),r}function wr(e,t,r,n,i){let a=0;if(e==="maxDrawdownPct"){if(a=t.maxDrawdownPct-n.maxDrawdownPct,a!==0)return a<0}else if(a=t[e]-n[e],a!==0)return a>0;let o=vt(r),s=vt(i);return o<s}function Zn(e,t,r={}){if(!Yn(r))throw new TypeError("options must be a plain object");for(let g of Object.keys(r))if(Kn(g))throw new TypeError(`options must not include holdout/test/oos key "${g}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let g of Object.keys(r))if(!n.has(g))throw new TypeError(`unknown option "${g}"`);let i=64;if("maxTrials"in r){let g=r.maxTrials;if(!Number.isInteger(g)||g<1||g>Wn)throw new TypeError(`maxTrials must be an integer 1..${Wn}`);i=g}let a=r.objective??"netPnlUsd";if(!Gn.has(a))throw new TypeError(`objective must be one of ${[...Gn].join("|")}`);let o=r.backtestOptions??{};if(!Yn(o))throw new TypeError("backtestOptions must be a plain object");for(let g of Object.keys(o))if(Kn(g))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${g}"`);let s=te(e),l=Object.keys(s.parameters).sort();if(l.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let f={},u=1;for(let g of l){let v=ma(s.parameters[g]);if(v.length===0)throw new Error(`parameter "${g}" produces an empty grid`);f[g]=v,u*=v.length}let c=ha(l,f);if(c.length===0)throw new Error("parameter grid is empty");let m=c.slice(0,i),d=[],p=null,h=null;for(let g of m){let v=at(s,g),A=se(v,t,o);h==null&&(h=A.config);let w={netPnlUsd:A.metrics.netPnlUsd,netPnlPct:A.metrics.netPnlPct,maxDrawdownPct:A.metrics.maxDrawdownPct,winRate:A.metrics.winRate,profitFactor:A.metrics.profitFactor,tradeCount:A.metrics.tradeCount,sharpe:A.metrics.sharpe,turnoverUsd:A.metrics.turnoverUsd},M={parameters:{...g},metrics:w};d.push(M),(!p||wr(a,w,g,p.metrics,p.parameters))&&(p=M)}d.sort((g,v)=>wr(a,g.metrics,g.parameters,v.metrics,v.parameters)?-1:wr(a,v.metrics,v.parameters,g.metrics,g.parameters)?1:0);let y={...p.parameters},E=at(s,y),x={strategyHash:qe(s),compilerHash:ge,trainBarsHash:je(t),backtestConfig:h,objective:a,maxTrials:i,trialsRun:d.length,candidates:d,bestParameters:y,bestStrategy:E},O={id:pa("sha256").update(JSON.stringify(ut(x)),"utf8").digest("hex"),...x};return gr(ut(JSON.parse(JSON.stringify(O))))}var Wn,Gn,Xn=B(()=>{be();Ie();rt();Wn=256,Gn=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Ee from"node:fs";import Pt from"node:path";function _t(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function fe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function wa(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ve(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ve(r,`${t}[${n}]`));return}if(_t(e))for(let[r,n]of Object.entries(e)){let i=wa(r);if(ya.some(a=>i.includes(a)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ve(n,`${t}.${r}`)}}function ga(e){if(typeof e!="string"||!e||!Pt.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Qn(e){let t;try{t=Ee.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function ba(){return{version:Er,runners:[]}}function eo(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!_t(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Er)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Ve(r,Pt.basename(t)),{version:Er,runners:r.runners.map(n=>fe(n))}}function to(e,t){Ve(t,"store");let r=Pt.dirname(e);Ee.mkdirSync(r,{recursive:!0,mode:448});let n=Pt.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),i=`${JSON.stringify(t)}
3
+ `;try{Ee.writeFileSync(n,i,{mode:384,flag:"wx"}),Ee.renameSync(n,e);try{Ee.chmodSync(e,384)}catch{}}catch(a){try{Ee.unlinkSync(n)}catch{}throw a}}function ro(e={}){let t=e.path;if(ga(t),Qn(t),Ee.existsSync(t)?eo(Ee.readFileSync(t,"utf8"),t):to(t,ba()),br.has(t))return br.get(t);let r=!1,n=[];function i(){if(r)return;let p=n.shift();if(p){r=!0;try{let h=p.fn();r=!1,p.resolve(h),i()}catch(h){r=!1,p.reject(h),i()}}}function a(p){if(!r&&n.length===0){r=!0;try{return p()}finally{r=!1,queueMicrotask(i)}}return new Promise((h,y)=>{n.push({fn:p,resolve:h,reject:y}),queueMicrotask(i)})}function o(){return Qn(t),eo(Ee.readFileSync(t,"utf8"),t)}function s(p){to(t,p)}function l(p){if(!_t(p)||typeof p.id!="string"||!p.id)throw new Error("shadow-store: create requires record with string id");Ve(p,"record");let h=o();if(h.runners.some(E=>E.id===p.id))throw new Error(`shadow-store: runner id already exists: ${p.id}`);let y=fe(p);return h.runners.push(y),s(h),fe(y)}function f(p){let h=o().runners.find(y=>y.id===p);return h?fe(h):null}function u(){return o().runners.map(p=>fe(p))}function c(p,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let y=o(),E=y.runners.findIndex(g=>g.id===p);if(E<0)throw new Error(`shadow-store: runner not found: ${p}`);let x=fe(y.runners[E]),O=h(x);if(!_t(O)||O.id!==p)throw new Error("shadow-store: updater must return record with same id");return Ve(O,"record"),y.runners[E]=fe(O),s(y),fe(y.runners[E])}function m(p){let h=o(),y=h.runners.findIndex(x=>x.id===p);if(y<0)throw new Error(`shadow-store: runner not found: ${p}`);let E=fe(h.runners[y]);return E.status!=="stopped"&&(E.status="stopped",h.runners[y]=E,s(h)),fe(h.runners[y])}let d={create(p){return a(()=>l(p))},get(p){return f(p)},list(){return u()},update(p,h){return a(()=>c(p,h))},stop(p){return a(()=>m(p))}};return br.set(t,d),d}var Er,ya,br,no=B(()=>{Er=1,ya=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];br=new Map});import{createHash as Tr}from"node:crypto";function xr(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Sr(e){return Array.isArray(e)?e.map(Sr):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Sr(e[t])])):e}function io(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Tr("sha256").update(JSON.stringify(Sr(e))).digest("hex")}function Ea(e,t,r,n,i){return Tr("sha256").update(`${e}|${t}|${r}|${n}|${i}`).digest("hex")}function xa(e,t,r,n){return Tr("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Sa(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function oo(e){return e==="entryLong"||e==="entryShort"}function kr({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=ro({path:e});function n({strategy:l,evidenceId:f=null}={}){let u=K(l),c=f==null?null:String(f),m=r.list().filter(E=>E.status==="running"&&E.strategyHash===u.strategyHash&&E.compilerHash===u.compilerHash&&E.evidenceId===c).sort((E,x)=>E.createdAt-x.createdAt||E.id.localeCompare(x.id))[0];if(m)return xr(m);let d=t(),p=xa(d,u.strategyHash,u.compilerHash,c),h=r.get(p);if(h)return xr(h);let y={id:p,strategy:xr(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:c,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:d,updatedAt:d,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(y)}function i(l){return r.get(l)}function a(){return r.list()}function o(l){return r.stop(l)}function s(l,f,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(f))throw new TypeError("shadow-runner: bars must be an array");return r.update(l,c=>{if(c.status!=="running")throw new Error("shadow-runner: runner is stopped");if(f.length===0)return c;let d=K(c.strategy).evaluateAll(f),p=new Map;for(let b=0;b<f.length;b++)p.set(f[b].t,b);let h=c.cursor,y=[];for(let b=0;b<f.length;b++){let N=f[b].t;(h==null||N>h)&&y.push(b)}if(y.length===0)return c;let E=new Map(c.intendedOrders.map(b=>[b.id,b])),x=new Set(c.fills.map(b=>b.orderId)),O=new Map(c.missedFills.map(b=>[b.orderId,b])),g=(b,N)=>`${b}|${N}`,v=new Map(c.markouts.map(b=>[g(b.orderId,b.horizon),b])),A=c.position?{...c.position}:null,w=Number.isInteger(c.cooldownBarsRemaining)?Math.max(0,c.cooldownBarsRemaining):0,M=Number.isFinite(c.cooldownStartT)?c.cooldownStartT:null;function C({action:b,signalBarT:N,signalIndex:j}){let q=Sa(b),L=Ea(c.id,c.strategyHash,N,q,b);if(E.has(L))return E.get(L);let R=j+1,k=R<f.length,I={id:L,action:b,type:b,side:q,signalBarT:N,fillBarT:k?f[R].t:null,status:k?"open":"missed"};return E.set(L,I),c.intendedOrders.push(I),I}function J(b,N,j){if(x.has(b.id))return;let q={orderId:b.id,action:oo(b.action)?"entry":"exit",side:b.side,price:N.o,barT:N.t,signalBarT:b.signalBarT,barIndex:j};if(c.fills.push(q),x.add(b.id),b.status="filled",b.fillBarT=N.t,O.has(b.id)&&(O.delete(b.id),c.missedFills=c.missedFills.filter(L=>L.orderId!==b.id)),oo(b.action)){A={side:b.action==="entryLong"?"long":"short",entryOrderId:b.id,entryBarT:N.t,entryPrice:N.o,entryBarIndex:j};for(let L of u){let R=g(b.id,L);if(v.has(R))continue;let k={orderId:b.id,horizon:L,entryBarT:N.t,entryPrice:N.o,side:A.side,status:"pending",close:null,barT:null};v.set(R,k),c.markouts.push(k)}}else A=null,w=Number(c.strategy?.risk?.cooldownBars)||0,M=N.t}function P(b){if(x.has(b.id)||O.has(b.id))return;let N={orderId:b.id,action:b.action,side:b.side,signalBarT:b.signalBarT,status:"missed"};O.set(b.id,N),c.missedFills.push(N),b.status="missed"}for(let b of c.intendedOrders){if(b.status==="filled"||x.has(b.id))continue;let N=p.get(b.signalBarT);if(N==null)continue;let j=N+1;j<f.length&&(h==null||f[j].t>h)&&J(b,f[j],j)}for(let b of y){let N=f[b],j=d[b].signals,q=A,L=k=>{if(A||w>0&&(M==null||N.t>=M))return;let $=C({action:k,signalBarT:N.t,signalIndex:b}),Q=b+1;Q<f.length?J($,f[Q],Q):P($)},R=k=>{if(!A||A.side==="long"&&k!=="exitLong"||A.side==="short"&&k!=="exitShort")return;let I=C({action:k,signalBarT:N.t,signalIndex:b}),$=b+1;$<f.length?J(I,f[$],$):P(I)};q?(j.exitLong&&R("exitLong"),j.exitShort&&R("exitShort")):j.entryLong&&j.entryShort||(j.entryLong&&L("entryLong"),j.entryShort&&L("entryShort")),w>0&&M!=null&&N.t>=M&&(w-=1,w===0&&(M=null)),c.cursor=N.t,c.lastProcessedBarIndex=b}for(let b of c.markouts){if(b.status!=="pending")continue;let N=c.fills.find(L=>L.orderId===b.orderId&&L.action==="entry");if(!N)continue;let j=p.get(N.barT);if(j==null)continue;let q=j+b.horizon;if(q<f.length){b.close=f[q].c,b.barT=f[q].t,b.status="filled";let L=b.entryPrice;b.markout=b.side==="long"?(b.close-L)/L:(L-b.close)/L}}return c.position=A,c.cooldownBarsRemaining=w,c.cooldownStartT=M,c.updatedAt=t(),c})}return{start:n,step:s,list:a,get:i,stop:o}}var so=B(()=>{be();no()});import{types as Ta}from"node:util";function We(e,{omitUndefined:t=!1}={}){let r=new WeakSet,n=0,i=0;function a(o,s="",l=0){if(++n>3e5||l>10)throw new TypeError("bounded JSON input limit exceeded");if(o===null||typeof o=="boolean")return o;if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError("JSON numbers must be finite");return o}if(typeof o=="string"){if(i+=Buffer.byteLength(o),o.length>2048||i>8*1024*1024)throw new TypeError("bounded JSON string limit exceeded");if(Aa.test(o)||/^(?:0x)?[a-fA-F0-9]{64}$/.test(o)&&!/hash$/i.test(s))throw new TypeError("secret-like or secret-bearing input is forbidden");return o}if(!o||typeof o!="object"||Ta.isProxy(o))throw new TypeError("input must be plain JSON");if(r.has(o))throw new TypeError("JSON cycle is forbidden");let f=Array.isArray(o);if(!f&&![Object.prototype,null].includes(Object.getPrototypeOf(o)))throw new TypeError("input must be plain JSON");if(f&&o.length>1e4)throw new TypeError("bounded array limit exceeded");let u=Reflect.ownKeys(o).filter(m=>!(f&&m==="length"));if(!f&&u.length>64||f&&u.length!==o.length)throw new TypeError("bounded dense JSON required");r.add(o);let c=f?[]:{};for(let m of u){if(typeof m!="string"||m.length>64||["__proto__","constructor","prototype"].includes(m))throw new TypeError("invalid JSON key");if(ka.test(m.toLowerCase().replace(/[^a-z]/g,"")))throw new TypeError("secret-like or secret-bearing input is forbidden");let d=Object.getOwnPropertyDescriptor(o,m);if(!d.enumerable||!Object.hasOwn(d,"value"))throw new TypeError("JSON accessors are forbidden");if(f&&!/^(0|[1-9]\d*)$/.test(m))throw new TypeError("invalid JSON array");t&&l===0&&!f&&d.value===void 0||(c[m]=a(d.value,m,l+1))}return r.delete(o),c}return a(e)}var ka,Aa,$t=B(()=>{ka=/privatekey|privkey|mnemonic|seed|secret|password|passphrase|apikey|authorization|accesstoken|refreshtoken|signer|keystore|keymaterial|authtoken|credential|bearer|signature|xprv|xpriv|wif/,Aa=/\b(?:private[\s_-]*key|mnemonic|seed[\s_-]*phrase|api[\s_-]*key|bearer\s+|sk-[A-Za-z0-9_-]{20,}|-----BEGIN .*PRIVATE KEY)/i});function ao({coin:e,interval:t="15m",maxTrials:r=X.max,nowMs:n}){if(!Number.isInteger(r)||r<X.min||r>X.max)throw new TypeError(`maxTrials must be an integer from ${X.min} to ${X.max}`);if(typeof t!="string"||!/^(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)$/.test(t))throw new TypeError("unsupported interval");if(Ne(t),typeof e!="string"||e.length>32||!/^(?:[a-z][a-z0-9_-]*:)?[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e))throw new TypeError("unsupported perp coin");if(!Number.isSafeInteger(n)||n<0||!Number.isSafeInteger(n+864e5))throw new TypeError("invalid nowMs");let i=[];for(let a=0;a<It.length;a++)for(let o of Or)for(let s of vr){if(i.length===r)return i;let l=s==="long",f=o==="rsi_mean_reversion"?{period:Ar[a][0],threshold:l?Ar[a][1]:100-Ar[a][1]}:{fast:It[a][0],slow:It[a][1]},u=`wallet-${o.replaceAll("_","-")}-${s}-${a}`,c=[{id:"close",type:"input",field:"close"}];o==="rsi_mean_reversion"?c.push({id:"rsi",type:"indicator",indicator:"rsi",input:"close",period:{param:"period"}},{id:"threshold",type:"constant",value:{param:"threshold"}},{id:"mid",type:"constant",value:50},{id:"entry",type:"compare",op:l?"lt":"gt",left:"rsi",right:"threshold"},{id:"exit",type:"compare",op:l?"gte":"lte",left:"rsi",right:"mid"}):c.push({id:"fast",type:"indicator",indicator:"ema",input:"close",period:{param:"fast"}},{id:"slow",type:"indicator",indicator:"ema",input:"close",period:{param:"slow"}},o==="ema_cross"?{id:"entry",type:"cross",direction:l?"above":"below",left:"fast",right:"slow"}:{id:"entry",type:"compare",op:l?"gt":"lt",left:"fast",right:"slow"},{id:"exit",type:"compare",op:l?"lte":"gte",left:"fast",right:"slow"});let m=K({version:1,id:u,name:`Wallet candidate ${o} ${s}`,venue:"hyperliquid",market:{coin:e,interval:t},parameters:Object.fromEntries(Object.entries(f).map(([d,p])=>[d,{value:p,min:p,max:p,step:1}])),nodes:c,rules:{entryLong:l?"entry":null,entryShort:l?null:"entry",exitLong:l?"exit":null,exitShort:l?null:"exit"},risk:{maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3,expiresAt:n+864e5}});i.push({id:u,family:o,direction:s,parameters:f,strategy:m.strategy,strategyHash:m.strategyHash})}return i}function lo({episodes:e,decisions:t},{coin:r,bars:n,startIndex:i,endIndex:a,intervalMs:o}){if(!Array.isArray(e)||!Array.isArray(t)||e.length>2e4||t.length>2e4)throw new TypeError("bounded reconstructed observations required");if(!Array.isArray(n)||n.length>5e3||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<i||a>n.length||!Number.isSafeInteger(o)||o<=0)throw new TypeError("invalid observation window");let s=e.filter(h=>h.coin===r),l=s.filter(h=>h.partialStart),f=new Map(s.filter(h=>!h.partialStart).map(h=>[`${h.fillIds[0]}:${h.side}`,h])),u=new Map;for(let h of t){if(h.coin!==r||!["entry","reverse"].includes(h.action))continue;let y=h.fillIds.map(v=>f.get(`${v}:${h.side}`)).find(Boolean);if(!y)continue;let E=y.openedAt,x=Math.floor((E-n[0].t)/o)-1;if(x<i||x>=a)continue;let O=n[x].t+o;if(O>E||E>=O+o)continue;let g=u.get(x)??[];g.push({...h,time:E,barIndex:x,featureClosedAt:O}),u.set(x,g)}let c=[],m=[],d=0,p=0;for(let h=i;h<a;h++){let y=n[h].t+o;if(l.some(x=>y<=(x.closedAt??Number.MAX_SAFE_INTEGER))){p++;continue}let E=u.get(h)??[];if(E.length>1){d++;continue}E.length&&m.push(E[0]),c.push({barIndex:h,label:E[0]?.side??null})}return{rows:c,labels:m,partialStartEpisodes:l.length,partialStartBars:p,ambiguousBars:d}}function jt(e,t){if(!Array.isArray(t)||!t.length||t.length>5e3)throw new TypeError("bounded bars required");let r=null;return K(e).evaluateAll(t).map(({signals:n})=>((r==="long"&&n.exitLong||r==="short"&&n.exitShort)&&(r=null),r||n.entryLong===n.entryShort?null:(r=n.entryLong?"long":"short",r)))}function co(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("invalid fitting input");if(Object.keys(e).some(u=>!["trials","bars","trainRows","validationRows"].includes(u)))throw new TypeError("unknown fitting option; holdout is forbidden");let{trials:t,bars:r,trainRows:n,validationRows:i}=e;if(!Array.isArray(t)||t.length<X.min||t.length>X.max)throw new TypeError("bounded candidate trials required");if(!Array.isArray(r)||!r.length||r.length>5e3)throw new TypeError("bounded bars required");let a=-1;for(let u of[n,i]){if(!Array.isArray(u)||u.length>5e3)throw new TypeError("bounded observations required");for(let c of u){if(!Number.isInteger(c?.barIndex)||c.barIndex<0||c.barIndex>=r.length)throw new TypeError("invalid observation index");if(c.barIndex<=a)throw new TypeError("observations must be chronological without overlap");a=c.barIndex}}let o=t.map(u=>{let c=K(u.strategy),m=n.at(-1)?.barIndex??0,d=i.at(-1)?.barIndex??m,p=jt(c.strategy,r.slice(0,m+1)),h=jt(c.strategy,r.slice(0,d+1)),y=(g,v)=>Nt(g.map(A=>A.label),g.map(A=>v[A.barIndex])),E=y(n,p),x=y(i,h),O=[E,x].every(g=>g.positives>=3&&g.negatives>=20&&g.predictedPositives>=3&&g.precision>=.1&&g.recall>=.1&&g.balancedAccuracy>.5);return{id:u.id,family:u.family,direction:u.direction,parameters:u.parameters,strategyHash:c.strategyHash,train:E,validation:x,eligible:O,selectionScore:(E.f1+x.f1)/2}}),l=o.filter(u=>u.eligible).sort((u,c)=>c.selectionScore-u.selectionScore||u.id.localeCompare(c.id,"en"))[0],f=l?Object.freeze({id:l.id,family:l.family,direction:l.direction,parameters:Object.freeze({...l.parameters}),strategyHash:l.strategyHash,selectionScore:l.selectionScore}):null;return{trialsRun:o.length,candidateTrials:o,selectedCandidate:f}}function Nt(e,t){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length||e.length>5e3)throw new TypeError("label arrays must have equal bounded length");if([...e,...t].some(d=>d!==null&&d!=="long"&&d!=="short"))throw new TypeError("invalid decision label");let r=0,n=0,i=0,a=0,o=0,s={};for(let d=0;d<e.length;d++)e[d]!==null&&r++,t[d]!==null&&n++,e[d]===null&&t[d]===null&&a++,e[d]!==null&&e[d]===t[d]&&i++,e[d]!==null&&t[d]!==null&&e[d]!==t[d]&&o++;let l=(d,p)=>p?d/p:0,f=l(i,n),u=l(i,r),c=e.length-r,m=l(a,c);for(let d of["long","short"]){let p=0,h=0,y=0,E=0;for(let x=0;x<e.length;x++)e[x]===d&&t[x]===d?p++:t[x]===d?h++:e[x]===d?y++:E++;s[d]={truePositive:p,falsePositive:h,falseNegative:y,trueNegative:E,precision:l(p,p+h),recall:l(p,p+y)}}return{samples:e.length,positives:r,negatives:c,predictedPositives:n,correctEntries:i,trueNegative:a,wrongDirection:o,precision:f,recall:u,f1:l(2*f*u,f+u),specificity:m,balancedAccuracy:r&&c?(u+m)/2:null,accuracy:l(i+a,e.length),byDirection:s}}var It,Ar,Or,vr,X,Pr=B(()=>{be();st();It=[[5,20],[8,21],[12,26],[20,50]],Ar=[[7,30],[14,30],[14,25],[21,35]],Or=["ema_cross","ema_trend","rsi_mean_reversion"],vr=["long","short"],X=Object.freeze({min:Or.length*vr.length,max:It.length*Or.length*vr.length})});var xo={};yt(xo,{collectWalletHistory:()=>Na,normalizeWalletHistory:()=>Ge,walletPositionUnits:()=>Me});import{createHash as fo}from"node:crypto";import{types as po}from"node:util";function Rt(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be an epoch millisecond safe integer`);return e}function ho({wallet:e,startTime:t,endTime:r},n){if(typeof e!="string"||!/^0x[\da-fA-F]{40}$/.test(e))throw new TypeError("wallet must be a 20-byte hex address");Rt(t,"startTime"),Rt(r,"endTime");let i=Rt(n.nowMs??Date.now(),"nowMs time");if(t>=r||r>i)throw new TypeError("invalid time window");return i}function yo(e,t,r=0){if(r>5)throw new TypeError("JSON depth limit exceeded");let n=s=>{if(t.row+=Buffer.byteLength(s),t.total+=Buffer.byteLength(s),t.row>Oa||t.total>t.limit)throw new TypeError("payload byte limit exceeded");return s};if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return n(JSON.stringify(e));if(typeof e=="string"){if(e.length>4096)throw new TypeError("JSON string limit exceeded");return n(JSON.stringify(e))}if(!e||typeof e!="object")throw new TypeError("unsafe fill JSON value");if(po.isProxy(e))throw new TypeError("unsafe JSON proxy");let i=Array.isArray(e);if(!i&&![Object.prototype,null].includes(Object.getPrototypeOf(e)))throw new TypeError("unsafe JSON prototype");let a=Reflect.ownKeys(e).filter(s=>!(i&&s==="length"));if(a.length>64||i&&e.length>64)throw new TypeError("JSON member limit exceeded");if(i&&a.length!==e.length)throw new TypeError("unsafe JSON array");let o=[];for(let s of a.sort()){if(typeof s!="string"||s.length>64||["__proto__","constructor","prototype"].includes(s))throw new TypeError("unsafe JSON key");let l=Object.getOwnPropertyDescriptor(e,s);if(!l.enumerable||!Object.hasOwn(l,"value"))throw new TypeError("unsafe JSON accessor");if(i&&!/^(?:0|[1-9]\d*)$/.test(s))throw new TypeError("unsafe JSON array key");let f=i?"":n(`${JSON.stringify(s)}:`);o.push([s,f+yo(l.value,t,r+1)])}return i&&o.sort((s,l)=>Number(s[0])-Number(l[0])),n((i?"[]":"{}")+",".repeat(Math.max(0,o.length-1))),`${i?"[":"{"}${o.map(s=>s[1]).join(",")}${i?"]":"}"}`}function ft(e,t,{signed:r=!1,positive:n=!1}={}){if(typeof e!="string"||e.length>62||!Pa.test(e)||!Number.isFinite(Number(e)))throw new TypeError(`fill.${t} must be a bounded decimal string`);if(!r&&e.startsWith("-")||n&&Number(e)<=0)throw new TypeError(`fill.${t} has invalid quantity`);return e}function _r(e,t){let r=Number.isSafeInteger(e)&&e>=0,n=typeof e=="string"&&/^(?:0|[1-9]\d{0,19})$/.test(e)&&BigInt(e)<=va;if(!r&&!n)throw new TypeError(`fill.${t} must be an unsigned exact ID`);return e}function uo(e,t){if(typeof e!="string"||!_a.test(e))throw new TypeError(`fill.${t} must be a bounded market token`);return e}function $a(e,t,r,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("fill must be an object");n.row=0;let i=yo(e,n),a=JSON.parse(i);for(let s of["coin","time","px","sz","side","startPosition","tid","oid"])if(!Object.hasOwn(a,s))throw new TypeError(`fill.${s} is required`);let o={coin:uo(a.coin,"coin"),time:Rt(a.time,"fill.time"),px:ft(a.px,"px",{positive:!0}),sz:ft(a.sz,"sz",{positive:!0}),side:a.side,startPosition:ft(a.startPosition,"startPosition",{signed:!0}),tid:_r(a.tid,"tid"),oid:_r(a.oid,"oid")};if(o.side!=="B"&&o.side!=="A")throw new TypeError("fill.side must be B or A");if(o.time<t||o.time>r)throw new TypeError("fill outside requested time window");for(let s of["fee","closedPnl","builderFee"])Object.hasOwn(a,s)&&(o[s]=ft(a[s],s,{signed:s!=="builderFee"}));if(Object.hasOwn(a,"dir")){if(typeof a.dir!="string"||!/^[\x20-\x7e]{1,96}$/.test(a.dir))throw new TypeError("fill.dir must be bounded text");o.dir=a.dir}if(Object.hasOwn(a,"crossed")){if(typeof a.crossed!="boolean")throw new TypeError("fill.crossed must be boolean");o.crossed=a.crossed}Object.hasOwn(a,"feeToken")&&(o.feeToken=uo(a.feeToken,"feeToken"));for(let[s,l]of[["hash",64],["cloid",32]])if(Object.hasOwn(a,s)){if(!(s==="cloid"&&a[s]===null)&&(typeof a[s]!="string"||!new RegExp(`^0x[\\da-fA-F]{${l}}$`).test(a[s])))throw new TypeError(`fill.${s} must be exact hex`);o[s]=a[s]}if(Object.hasOwn(a,"twapId")&&(o.twapId=a.twapId===null?null:_r(a.twapId,"twapId")),Object.hasOwn(a,"liquidation")){let s=a.liquidation;if(!s||typeof s!="object"||Array.isArray(s)||typeof s.liquidatedUser!="string"||!/^0x[\da-fA-F]{40}$/.test(s.liquidatedUser)||typeof s.method!="string"||!/^[\x20-\x7e]{1,64}$/.test(s.method))throw new TypeError("fill.liquidation is invalid");o.liquidation={liquidatedUser:s.liquidatedUser,markPx:ft(s.markPx,"liquidation.markPx",{positive:!0}),method:s.method}}return{fill:o,canonical:i}}function Me(e){let t=e.startsWith("-"),[r,n=""]=(t?e.slice(1):e).split("."),i=BigInt(r)*10n**30n+BigInt(n.padEnd(30,"0"));return t?-i:i}function wo(e){return Me(e.startPosition)+Me(e.sz)*(e.side==="B"?1n:-1n)}function go(e,t){return e.fill.time!==t.fill.time?e.fill.time-t.fill.time:e.fill.coin!==t.fill.coin?e.fill.coin<t.fill.coin?-1:1:e.canonical<t.canonical?-1:e.canonical>t.canonical?1:0}function Ia(e,t){if(e.length===1)return e;let r=new Map,n=f=>(r.has(f)||r.set(f,{outgoing:[],balance:0}),r.get(f));for(let f of e){let u=Me(f.fill.startPosition),c=wo(f.fill);n(u).outgoing.push({record:f,before:u,after:c}),n(u).balance++,n(c).balance--}let i=null,a=0;for(let[f,{balance:u}]of r)if(u===1&&i===null)i=f;else if(u===-1)a++;else if(u!==0)return null;if(i===null?a!==0:a!==1)return null;if(i===null){if(t===null||!r.has(t))return null;i=t}function o(f){let u=new Map,c=[{after:i,record:null}],m=[];for(;c.length;){let p=c.at(-1).after,h=r.get(p).outgoing,y=u.get(p)??0;if(y<h.length)u.set(p,y+1),c.push(h[f?h.length-1-y:y]);else{let E=c.pop();E.record&&m.push(E)}}if(m.reverse(),m.length!==e.length)return null;let d=i;for(let p of m){if(p.before!==d)return null;d=p.after}return m.map(p=>p.record)}let s=o(!1),l=o(!0);return s&&l&&s.every((f,u)=>f===l[u])?s:null}function ja(e){let t=[...e].sort(go),r=[],n=[],i=new Map;for(let a=0;a<t.length;){let{coin:o,time:s}=t[a].fill,l=a+1;for(;l<t.length&&t[l].fill.coin===o&&t[l].fill.time===s;)l++;let f=t.slice(a,l),u=Ia(f,i.get(o)??null);u?(r.push(...u),i.set(o,wo(u.at(-1).fill))):(n.push(`ambiguous_fill_order:${o}:${s}`),r.push(...f),i.set(o,null)),a=l}return{ordered:r,reasons:n}}function bo(e,t,r,{limit:n=$r,bytes:i=mo}={}){if(po.isProxy(e))throw new TypeError("unsafe fills proxy");if(!Array.isArray(e))throw new TypeError("fills must be an array");if(e.length>n)throw new TypeError("fill record count limit exceeded");let a={row:0,total:2+e.length,limit:i},o=[];for(let s=0;s<e.length;s++){let l=Object.getOwnPropertyDescriptor(e,String(s));if(!l?.enumerable||!Object.hasOwn(l,"value"))throw new TypeError("fills require dense own data, no accessors");o.push($a(l.value,t,r,a))}return o}function Ir(e,t){let r=String(t.fill.tid),n=e.get(r);if(n&&n.canonical!==t.canonical)throw new TypeError("contradictory duplicate trade ID");n||e.set(r,t)}function Eo({wallet:e,startTime:t,endTime:r,records:n,status:i,pages:a,reasons:o,source:s,fetchedAt:l,rawPages:f}){let{ordered:u,reasons:c}=ja(n.values()),m=u.map(y=>y.fill),d={status:i,firstTime:m[0]?.time??null,lastTime:m.at(-1)?.time??null,fillCount:m.length,pages:a,reasons:[...o,...c]},p={startTime:t,endTime:r},h=fo("sha256").update(JSON.stringify({schemaVersion:1,venue:"hyperliquid",wallet:e,requested:p,source:s,coverage:d,rawFills:u.map(y=>y.canonical),...f?{rawPages:f}:{}})).digest("hex");return{schemaVersion:1,venue:"hyperliquid",wallet:e,requested:p,fills:m,coverage:d,provenance:{source:s,fetchedAt:l,hash:h}}}function Ge({wallet:e,fills:t,startTime:r,endTime:n,source:i="import",coverage:a},o={}){let s=ho({wallet:e,startTime:r,endTime:n},o);if(typeof i!="string"||i.length>64)throw new TypeError("source must be bounded text");let l=new Map;for(let f of bo(t,r,n))Ir(l,f);return Eo({wallet:e,startTime:r,endTime:n,records:l,status:"unknown",pages:0,reasons:["import_coverage_unverified"],source:"import",fetchedAt:s})}async function Na({wallet:e,startTime:t,endTime:r,maxPages:n=5},i={}){let a=ho({wallet:e,startTime:t,endTime:r},i);if(!Number.isInteger(n)||n<1||n>10)throw new TypeError("maxPages must be an integer from 1 to 10");if(i.requestInfo!==void 0&&typeof i.requestInfo!="function")throw new TypeError("requestInfo must be a function");let o=i.requestInfo??(h=>_e(h,{timeoutMs:15e3,maxResponseBytes:2*1024*1024,sameOriginRedirectsOnly:!0})),s=new Map,l=[],f=["api_recent_10000_retention","unknown_first_history"],u="unknown",c=0,m=t,d=[],p=0;for(;c<n;){let h;c+=1;try{h=await o({type:"userFillsByTime",user:e,startTime:m,endTime:r,aggregateByTime:!1})}catch(g){if(g?.oversize===!0)throw new TypeError("payload byte limit exceeded");u="partial",f.push("network_error");break}let y=bo(h,m,r,{limit:2e3,bytes:2*1024*1024}).sort(go),E=`[${y.map(g=>g.canonical).join(",")}]`;l.push({startTime:m,hash:fo("sha256").update(E).digest("hex")}),p+=Buffer.byteLength(E);let x=new Map;for(let g of y){Ir(x,g);let v=s.get(String(g.fill.tid));if(v&&v.canonical!==g.canonical)throw new TypeError("contradictory duplicate trade ID")}if(p>mo){u="partial",f.push("payload_limit");break}for(let g of x.values())s.size<$r&&Ir(s,g);if(d.some(g=>!x.has(g))){u="partial",f.push("pagination_continuity_unproven");break}if(s.size>=$r){u="partial",f.push("record_limit");break}if(h.length<2e3){h.length===0&&f.push("empty_response");break}let O=y.at(-1).fill.time;if(O<=m){u="partial",f.push("ambiguous_same_timestamp_overflow");break}if(c===n){u="partial",f.push("page_limit");break}m=O,d=y.filter(g=>g.fill.time===m).map(g=>String(g.fill.tid))}return Eo({wallet:e,startTime:t,endTime:r,records:s,status:u,pages:c,reasons:f,source:"hyperliquid",fetchedAt:a,rawPages:l})}var $r,mo,Oa,va,Pa,_a,Mt=B(()=>{tt();$r=1e4,mo=8*1024*1024,Oa=16*1024,va=18446744073709551615n,Pa=/^-?(?:0|[1-9]\d{0,29})(?:\.\d{1,30})?$/,_a=/^[A-Za-z0-9@#][A-Za-z0-9._:@/#-]{0,63}$/});function Ra(e,t){return e===0n?{action:"entry",side:ae(t)}:t===0n?{action:"exit",side:ae(e)}:ae(e)!==ae(t)?{action:"reverse",side:ae(t)}:{action:ne(t)>ne(e)?"increase":"reduce",side:ae(e)}}function Ma(e,t){if(!(e.action==="reverse"||e.action==="entry"&&t.action==="increase")){if(e.action==="exit"&&t.action==="entry"){Object.assign(e,{action:"reverse",side:t.side});return}Object.assign(e,t)}}function jr(e,t,r,n,i){let a=Lt(ne(t)),o={coin:e.coin,side:ae(t),openedAt:e.time,closedAt:null,entryPrice:r?null:Number(e.px),exitPrice:null,size:a,partialStart:r,partialEnd:!0,fillIds:[]};return n.push(o),r&&i.push(`left_censored:${e.coin}:${e.time}`),{episode:o,peak:ne(t),entryQuantity:r?0:a,entryValue:r?0:a*Number(e.px),exitQuantity:0,exitValue:0}}function La(e,t,r){let n=t.filter(o=>!o.partialStart&&!o.partialEnd),i=n.map(o=>o.closedAt-o.openedAt).sort((o,s)=>o-s),a=Math.floor(i.length/2);return{markets:[...new Set(e.map(o=>o.coin))].sort(),fillCount:e.length,decisionCount:r.length,episodeCount:t.length,closedEpisodeCount:t.filter(o=>o.closedAt!==null).length,completeEpisodeCount:n.length,partialStartCount:t.filter(o=>o.partialStart).length,partialEndCount:t.filter(o=>o.partialEnd).length,longEpisodeCount:t.filter(o=>o.side==="long").length,shortEpisodeCount:t.filter(o=>o.side==="short").length,reversalCount:r.filter(o=>o.action==="reverse").length,medianHoldingMs:i.length===0?null:i.length%2?i[a]:i[a-1]/2+i[a]/2}}function Nr(e){if(!e||e.schemaVersion!==1||e.venue!=="hyperliquid"||!e.requested)throw new TypeError("history must have schemaVersion 1 and venue hyperliquid");let{fills:t,coverage:r}=Ge({wallet:e.wallet,fills:e.fills,startTime:e.requested.startTime,endTime:e.requested.endTime},{nowMs:e.requested.endTime}),n=new Map,i=[],a=[],o=[e.coverage?.status==="partial"?"history_coverage_partial":"history_coverage_unverified"],s=new Set(r.reasons.filter(l=>l.startsWith("ambiguous_fill_order:")));o.push(...s);for(let l of t){if(s.has(`ambiguous_fill_order:${l.coin}:${l.time}`)){n.delete(l.coin);continue}let f=Me(l.startPosition),u=Me(l.sz)*(l.side==="B"?1n:-1n),c=f+u,m=String(l.tid),d=String(l.oid);n.has(l.coin)||n.set(l.coin,{position:null,active:null,epoch:0,groups:new Map});let p=n.get(l.coin);p.position!==null&&p.position!==f&&(o.push(`position_discontinuity:${l.coin}:${l.time}`),p.active=null,p.epoch+=1,p.groups.clear()),!p.active&&f!==0n&&(p.active=jr(l,f,!0,i,o));let h=`${d}:${l.side}`,y=Ra(f,c),E=p.groups.get(h);if(!E||E.epoch!==p.epoch){let x={coin:l.coin,time:l.time,...y,orderId:d,fillIds:[]};a.push(x),E={epoch:p.epoch,decision:x},p.groups.set(h,E)}else Ma(E.decision,y);if(E.decision.fillIds.push(m),f===0n)p.epoch+=1,p.active=jr(l,c,!1,i,o),p.active.episode.fillIds.push(m);else if(ae(f)===ae(c)&&c!==0n&&ne(c)>ne(f)){let x=p.active,O=Lt(ne(u));x.entryQuantity+=O,x.entryValue+=O*Number(l.px),x.episode.partialStart||(x.episode.entryPrice=x.entryValue/x.entryQuantity),ne(c)>x.peak&&(x.peak=ne(c),x.episode.size=Lt(x.peak)),x.episode.fillIds.push(m)}else{let x=p.active,O=Lt(ne(u)<ne(f)?ne(u):ne(f));x.exitQuantity+=O,x.exitValue+=O*Number(l.px),x.episode.fillIds.push(m),(c===0n||ae(f)!==ae(c))&&(p.epoch+=1,x.episode.closedAt=l.time,x.episode.exitPrice=x.exitValue/x.exitQuantity,x.episode.partialEnd=!1,p.active=null,c!==0n&&(p.epoch+=1,p.active=jr(l,c,!1,i,o),p.active.episode.fillIds.push(m)))}p.position=c,E.epoch=p.epoch}for(let l of i)l.partialEnd&&o.push(`incomplete_episode:${l.coin}:${l.openedAt}`);return{episodes:i,decisions:a,fingerprint:La(t,i,a),warnings:o}}var ne,ae,Lt,So=B(()=>{Mt();ne=e=>e<0n?-e:e,ae=e=>e<0n?"short":"long",Lt=e=>+`${e}e-30`});var Ao={};yt(Ao,{inferWalletStrategy:()=>Ba});import{createHash as Ha}from"node:crypto";function Mr(e){if(Array.isArray(e))return e.map(Mr);if(e&&typeof e=="object")return Object.fromEntries(Object.keys(e).sort().map(t=>[t,Mr(e[t])]));if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("non-finite inference result");return e}function Ke(e){return Ha("sha256").update(JSON.stringify(Mr(e))).digest("hex")}function Ht(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be an epoch millisecond safe integer`)}function dt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("invalid input object");if(Object.keys(e).some(r=>!t.includes(r)))throw new TypeError("unknown input field")}function Ca(e,t,r,n,i){if(!Array.isArray(e)||e.length>5e3)throw new TypeError("bars must be a bounded array, limit 5000");for(let a=0;a<e.length;a++){let o=e[a];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("invalid bar");if(Ht(o.t,"bar time"),!Number.isSafeInteger(o.t+t)||o.t+t>r)throw new TypeError("bar close time must not be in the future");if(a&&o.t-e[a-1].t!==t)throw new TypeError("invalid bar cadence");if("T"in o&&o.T!==o.t+t-1&&o.T!==o.t+t)throw new TypeError("invalid bar close time");for(let s of["o","h","l","c"])if(typeof o[s]!="number"||!Number.isFinite(o[s])||o[s]<=0||o[s]>1e12)throw new TypeError("bar price must be positive finite and bounded");if(typeof o.v!="number"||!Number.isFinite(o.v)||o.v<0||o.v>1e24)throw new TypeError("bar volume must be non-negative finite and bounded");if(o.h<Math.max(o.o,o.c,o.l)||o.l>Math.min(o.o,o.c,o.h))throw new TypeError("invalid bar OHLC");if("s"in o&&o.s!==n)throw new TypeError("invalid bar market");if("i"in o&&o.i!==i)throw new TypeError("invalid bar interval");for(let s of["fundingRate","fundingPaymentRate"])if(o[s]!=null&&(typeof o[s]!="number"||!Number.isFinite(o[s])||Math.abs(o[s])>1))throw new TypeError("invalid finite funding rate");for(let s of["openInterest","premium","oiDelta","bookImbalance"])if(o[s]!=null&&(typeof o[s]!="number"||!Number.isFinite(o[s])))throw new TypeError("invalid optional bar series");if(o.openInterest!=null&&o.openInterest<0)throw new TypeError("invalid open interest");if(o.bookImbalance!=null&&Math.abs(o.bookImbalance)>1)throw new TypeError("invalid book imbalance")}}function qa(e,t,r){let n=e.map((s,l)=>l>=de.warmupBars&&s.t+r>=t.startTime&&s.t+2*r<=t.endTime?l:-1).filter(s=>s>=0);if(n.length<5)return null;let i=n[0],a=n.length,o=[i,i+Math.floor(a*de.trainFraction),i+Math.floor(a*de.validationEndFraction),n.at(-1)+1];return Object.fromEntries(["train","validation","holdout"].map((s,l)=>[s,{startIndex:o[l],endIndex:o[l+1],startTime:e[o[l]].t+r,endTime:e[o[l+1]-1].t+2*r}]))}function To(e,t,r,n,i){let a=t.labels.length,o=[];return(t.rows.length<de.minimumSplitBars||r.endTime-r.startTime<de.minimumSplitSpanMs)&&o.push(`${e}: insufficient bars or time coverage`),(a<de.minimumSplitPositives||t.rows.length-a<de.minimumSplitNegatives)&&o.push(`${e}: insufficient positive episodes or no-trade observations`),a&&t.labels.at(-1).time-t.labels[0].time<de.minimumSplitSpanMs&&o.push(`${e}: positive episodes span insufficient time`),n.warnings.some(s=>s.startsWith(`position_discontinuity:${i}:`))&&o.push(`${e}: unstable position continuity`),n.warnings.some(s=>s.startsWith(`ambiguous_fill_order:${i}:`))&&o.push(`${e}: ambiguous same-time fill ordering`),t.ambiguousBars&&o.push(`${e}: multiple entry decisions share a candle; use finer cadence`),o}function ko(e,t){return e.length?{startTime:e[0].t,endTime:e.at(-1).t+t,entryPrice:e[0].o,exitPrice:e.at(-1).c,grossReturnPct:(e.at(-1).c/e[0].o-1)*100}:null}function Ba(e){let t=We(e);dt(t,["history","coin","interval","bars","maxTrials","nowMs"]);let{history:r,coin:n,bars:i,interval:a="15m",maxTrials:o=X.max}=t;if(dt(r,["schemaVersion","venue","wallet","requested","fills","coverage","provenance"]),r.schemaVersion!==1||r.venue!=="hyperliquid")throw new TypeError("invalid wallet history schema or venue");if(dt(r.requested,["startTime","endTime"]),dt(r.coverage,["status","firstTime","lastTime","fillCount","pages","reasons"]),dt(r.provenance,["source","fetchedAt","hash"]),!["complete","partial","unknown"].includes(r.coverage.status)||!Array.isArray(r.coverage.reasons)||r.coverage.reasons.some(k=>typeof k!="string"))throw new TypeError("invalid history coverage");for(let k of["firstTime","lastTime"])r.coverage[k]!==null&&Ht(r.coverage[k],`coverage ${k}`);if(!Number.isInteger(r.coverage.fillCount)||r.coverage.fillCount<0||r.coverage.fillCount>1e4||!Number.isInteger(r.coverage.pages)||r.coverage.pages<0||r.coverage.pages>10)throw new TypeError("invalid coverage counts");if(typeof r.provenance.source!="string"||r.provenance.source.length>64||typeof r.provenance.hash!="string"||!/^[a-f0-9]{64}$/i.test(r.provenance.hash))throw new TypeError("invalid history provenance");let s=Object.hasOwn(t,"nowMs")?t.nowMs:r.provenance.fetchedAt;if(Ht(s,"nowMs"),Ht(r.provenance.fetchedAt,"history fetchedAt time"),r.provenance.fetchedAt>s||!Number.isSafeInteger(s+864e5))throw new TypeError("invalid nowMs time");if(typeof a!="string"||!/^(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)$/.test(a))throw new TypeError("unsupported interval");if(!Number.isInteger(o)||o<X.min||o>X.max)throw new TypeError(`maxTrials must be an integer from ${X.min} to ${X.max}`);if(typeof n!="string"||n.length>32||!/^(?:@[0-9]+|(?:[a-z][a-z0-9_-]*:)?[A-Za-z0-9][A-Za-z0-9._-]*)$/.test(n))throw new TypeError("invalid perp coin");let l=Ne(a);Ca(i,l,s,n,a);let f=Ge({wallet:r.wallet,fills:r.fills,...r.requested,source:r.provenance.source,coverage:r.coverage},{nowMs:s}),u=Nr(f),c={...f.coverage,status:r.coverage.status==="partial"?"partial":"unknown",reasons:[...new Set([...f.coverage.reasons,...r.coverage.reasons])]},m=["Behavioral imitation candidate only, not recovery of the wallet owner algorithm or evidence of a profitable edge.","Imported history coverage is unverified; no-trade labels mean no observed entry, not proof of wallet inactivity.","Fill times are decision proxies. Hidden hedges, private signals and off-venue positions are unknown.","Risk defaults are fixed research caps, never inferred from wallet size; evidence, shadow and owner execution gates remain mandatory."],d={schemaVersion:1,status:"insufficient_evidence",strategy:null,reasons:m,fingerprint:u.fingerprint,coverage:c,warnings:u.warnings,armed:!1,executionReady:!1,requiredGates:["evidence","shadow","owner_execution"],split:null,selectedCandidate:null,candidateTrials:[],trialsRun:0,fit:{},noTradeBaseline:{},observations:{labels:[],positiveDecisions:0,partialStartEpisodes:u.episodes.filter(k=>k.coin===n&&k.partialStart).length}},p={coin:n,interval:a,maxTrials:o,nowMs:s,policy:de,replay:Rr,scoring:"directional entry proxies, mean train/validation F1; fixed risk exits excluded from imitation"};function h(){return d.provenance={source:"wallet_behavioral_inference",fetchedAt:s,historyCoverageVerified:!1,historyHash:Ke(r),normalizedHistoryHash:Ke(f),barsHash:je(i),compilerHash:ge,optionsHash:Ke(p),splitHash:Ke(d.split),candidateTrialsHash:Ke(d.candidateTrials),selectedStrategyHash:d.selectedCandidate?.strategyHash??null},d.provenance.hash=Ke(d),d}if(n.startsWith("@"))return d.status="unsupported_market",m.push("Spot @indices are unsupported, not leveraged perpetual markets."),h();let y=ao({coin:n,interval:a,maxTrials:o,nowMs:s}),E=c.status==="partial"||c.reasons.some(k=>Fa.has(k));if(E&&(c.firstTime===null||c.lastTime===null))return m.push("Insufficient evidence: truncated history has no observed coverage bounds."),h();let x=E?Math.max(r.requested.startTime,c.firstTime):r.requested.startTime,O=i[0]?.t??0,g=E?Math.min(r.requested.endTime,O+(Math.floor((c.lastTime-O)/l)+1)*l):r.requested.endTime;if(d.split=qa(i,{startTime:x,endTime:g},l),!d.split)return m.push("Insufficient market overlap, bars and positive episodes."),h();let v=d.split,A={};function w(k){let I=v[k],$=Ge({wallet:f.wallet,fills:f.fills.filter(ee=>ee.time<I.endTime),startTime:f.requested.startTime,endTime:I.endTime-1},{nowMs:s}),Q=Nr($);A[k]={reconstruction:Q,observations:lo(Q,{coin:n,bars:i,...I,intervalMs:l})};let Y=A[k].observations.rows;d.noTradeBaseline[k]=Nt(Y.map(ee=>ee.label),Y.map(()=>null))}function M(){d.observations.evaluatedSplits=Object.keys(A),d.observations.labels=Object.values(A).flatMap(k=>k.observations.labels),d.observations.positiveDecisions=d.observations.labels.length,d.observations.ambiguousBars=Object.values(A).reduce((k,I)=>k+I.observations.ambiguousBars,0)}w("train"),w("validation"),M();let C=["train","validation"].flatMap(k=>To(k,A[k].observations,v[k],A[k].reconstruction,n));if(v.holdout.endTime-v.train.startTime<de.minimumSpanMs&&C.push("Insufficient time coverage: at least seven days are required."),C.length)return m.push(...C),h();let J=co({trials:y,bars:i.slice(0,v.validation.endIndex),trainRows:A.train.observations.rows,validationRows:A.validation.observations.rows});if(Object.assign(d,J),!J.selectedCandidate)return m.push("All-no-trade or inadequate train/validation fits; no candidate clears the behavioral baseline."),h();let P=y.find(k=>k.id===J.selectedCandidate.id),b=J.candidateTrials.find(k=>k.id===P.id);w("holdout"),M();let N=jt(P.strategy,i);d.fit={train:b.train,validation:b.validation,holdout:Nt(A.holdout.observations.rows.map(k=>k.label),A.holdout.observations.rows.map(k=>N[k.barIndex]))};let j=To("holdout",A.holdout.observations,v.holdout,A.holdout.reconstruction,n);(d.fit.holdout.predictedPositives===0||d.fit.holdout.balancedAccuracy<=.5||d.fit.holdout.recall<.1||d.fit.holdout.precision<.1)&&j.push("Frozen candidate has insufficient holdout behavioral fit; no re-optimization performed."),E&&j.push("Partial or truncated history cannot establish a reliable inference window.");let q=se(P.strategy,i,Rr),L=i.slice(v.holdout.startIndex,v.holdout.endIndex+1),R=i.filter(k=>typeof k.fundingPaymentRate=="number").length;return d.backtest={full:q,holdout:se(P.strategy,L,Rr),fundingCoverage:{status:"unknown",barsWithPaymentRates:R,totalBars:i.length,limitation:"Only explicit supplied fundingPaymentRate values are charged; event completeness is unverified, absent payments are not evidence of zero funding."},limitations:["Replay is not observed wallet profitability or delayed-copy performance.","Holdout replay starts flat and resets indicator warmup; full replay is descriptive, not out-of-sample performance.","Fixed research risk, next-open latency, fees, adverse slippage and volume participation are simulated, not venue execution guarantees."]},d.marketExposureComparison={basis:"Unlevered long price-only return; excludes fees, funding, slippage and execution constraints.",full:ko(i,l),holdout:ko(L,l)},j.length?m.push(...j):(d.status="candidate",d.strategy=P.strategy),h()}var Rr,de,Fa,Oo=B(()=>{$t();Mt();So();be();rt();st();Pr();Rr=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:1}),de=Object.freeze({warmupBars:64,trainFraction:.6,validationEndFraction:.8,minimumSpanMs:6048e5,minimumSplitSpanMs:864e5,minimumSplitBars:64,minimumSplitPositives:3,minimumSplitNegatives:20}),Fa=new Set(["network_error","payload_limit","pagination_continuity_unproven","record_limit","ambiguous_same_timestamp_overflow","page_limit"])});var _o={};yt(_o,{runWalletStrategyOperation:()=>za});function Le(e,t,r,n){if(!Number.isSafeInteger(e)||e<t||e>r)throw new TypeError(`${n} must be an integer from ${t} to ${r}`);return e}async function za(e,t,r={}){let n=We(t,{omitUndefined:!0});if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("wallet strategy input must be an object");let i=new Set(e==="collect"?Po:Da);for(let v of Object.keys(n))if(!i.has(v))throw new TypeError("unsupported wallet strategy field");let a=r.nowMs;Le(a,0,Number.MAX_SAFE_INTEGER,"nowMs");let o=n.history;if(o!==void 0&&(!o||typeof o!="object"||Array.isArray(o)))throw new TypeError("history must be a wallet history object");let s=n.wallet??o?.wallet;if(typeof s!="string"||!vo.test(s))throw new TypeError("wallet must be an EVM address");if(o&&(typeof o.wallet!="string"||!vo.test(o.wallet)||o.wallet.toLowerCase()!==s.toLowerCase()))throw new TypeError("history wallet identity must match wallet");let l=n.days??7;Le(l,1,90,"days");let f=Le(n.maxPages??5,1,10,"maxPages"),u=n.endTime??o?.requested?.endTime??a,c=n.startTime??o?.requested?.startTime??Math.max(0,u-l*864e5);if(Le(u,1,a,"endTime"),Le(c,0,u-1,"startTime"),o&&(c!==o.requested?.startTime||u!==o.requested?.endTime))throw new TypeError("history requested window must match the inference window");let m=n.interval??"15m",d=n.count??1500,p=n.maxTrials??X.max;if(e==="infer"){if(typeof n.coin!="string"||n.coin.length>32||!Ua.test(n.coin))throw new TypeError("coin must be a Hyperliquid market identifier");if(Ne(m),Le(d,20,5e3,"count"),Le(p,X.min,X.max,"maxTrials"),n.bars!==void 0&&(!Array.isArray(n.bars)||n.bars.length>5e3))throw new TypeError("bars must be an array with at most 5000 candles")}r.signal?.throwIfAborted?.();let{collectWalletHistory:h,normalizeWalletHistory:y}=await Promise.resolve().then(()=>(Mt(),xo)),x=o?y({wallet:s,fills:o.fills,startTime:c,endTime:u,source:"import",coverage:o.coverage},{nowMs:a}):await h({wallet:s,startTime:c,endTime:u,maxPages:f},{nowMs:a,requestInfo:async v=>{r.signal?.throwIfAborted?.();let A=r.requestInfo?await r.requestInfo(v):await _e(v,{timeoutMs:1e4,maxResponseBytes:2*1024*1024,sameOriginRedirectsOnly:!0});return r.signal?.throwIfAborted?.(),A}});if(r.signal?.throwIfAborted?.(),e==="collect")return x;let{inferWalletStrategy:O}=await Promise.resolve().then(()=>(Oo(),Ao)),g=n.bars;if(g===void 0&&!n.coin.startsWith("@")&&x.fills.some(v=>v.coin===n.coin)){let A=await(r.fetchBars??St)({coin:n.coin,interval:m,count:d,endTime:u},{signal:r.signal});if(g=Array.isArray(A)?A:A?.bars,!Array.isArray(g))throw new TypeError("strategy history provider returned no bars")}return r.signal?.throwIfAborted?.(),O({history:o??x,coin:n.coin,interval:m,bars:g??[],maxTrials:p,nowMs:a})}var Po,Da,vo,Ua,$o=B(()=>{st();tt();Pr();$t();Po=["wallet","startTime","endTime","days","maxPages","nowMs"],Da=[...Po,"history","coin","interval","bars","count","maxTrials"],vo=/^0x[0-9a-fA-F]{40}$/,Ua=/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,31}|[a-z][a-z0-9]{0,15}:[A-Za-z0-9][A-Za-z0-9._-]{0,15}|@[0-9]+)$/});var No={};yt(No,{runStrategyOperation:()=>Xa});import Ja from"node:os";import Va from"node:path";function pt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ga(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Hr(e){if(Array.isArray(e)){for(let t of e)Hr(t);return}if(pt(e))for(let[t,r]of Object.entries(e)){if(Wa.some(n=>Ga(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Hr(r)}}function Ka(e){if(!pt(e))throw new TypeError("strategy input must be a plain object");return Hr(e),e}function Ya(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function Lr(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let i=or(e.venue),a=r.fetchBars??i.fetchBars;if(typeof a!="function")throw new Error(`strategy venue ${i.id} does not support history`);r.signal?.throwIfAborted?.();let o=await a({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.signal?.throwIfAborted?.();let s=Array.isArray(o)?o:o?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function Fr(e,t){let r=e.backtestOptions??{};if(!pt(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Io(e,t,r,n,i={}){let a=e.evidenceOptions??{};if(!pt(a))throw new TypeError("evidenceOptions must be a plain object");return{...a,...i,strategy:t,bars:r,backtestOptions:Fr(e,n)}}function jo(){return Va.join(Ja.homedir(),".oracle","strategy-shadow.json")}function Za(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function Xa(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Ka(e==="collect"||e==="infer"?We(t,{omitUndefined:!0}):t),i=Ya(n,r);if(e==="collect"||e==="infer"){let{runWalletStrategyOperation:a}=await Promise.resolve().then(()=>($o(),_o));return a(e,n,{...r,nowMs:i})}if(e==="draft")return{strategy:Jn(n.prompt,{nowMs:i})};if(e==="validate"){let a=K(n.strategy);if(a.strategy.risk.expiresAt<=i)throw new Error("strategy is expired");return{valid:!0,strategy:a.strategy,strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:a.compilerVersion,requiredSeries:a.requiredSeries}}if(e==="backtest"||e==="evidence"){let a=K(n.strategy),o=await Lr(a.strategy,n,r,i);ct(a,o);let s=Xt(Io(n,a.strategy,o,i));return e==="evidence"?s:{backtest:se(a.strategy,o,Fr(n,i)),evidence:s}}if(e==="optimize"){let a=K(n.strategy),o=await Lr(a.strategy,n,r,i);ct(a,o);let s=n.trainFraction,l=n.evidenceOptions?.trainFraction;if(s!=null&&l!=null&&s!==l)throw new TypeError("conflicting trainFraction controls are forbidden");let f=s??l??.7;if(typeof f!="number"||f<=0||f>=1)throw new TypeError("trainFraction must be in (0,1)");let u=o.slice(0,Math.floor(o.length*f)),c=n.options??{};if(!pt(c))throw new TypeError("options must be a plain object");let m=Zn(a.strategy,u,{...c,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Fr(n,i)}),d=m.bestStrategy;return{strategy:d,optimization:m,evidence:Xt(Io(n,d,o,i,{trainFraction:f}))}}if(e==="shadow"){let a=kr({storePath:r.storePath??jo(),clock:()=>i}),o=n.action;if(o==="start")return await a.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(o==="list")return await a.list();if(o==="get")return await a.get(n.id);if(o==="stop")return await a.stop(n.id);if(o==="step"){let s=await a.get(n.id);if(!s)throw new Error(`shadow runner not found: ${n.id}`);let l=await Lr(s.strategy,n,r,i);return ct(K(s.strategy),l),await a.step(n.id,l,n.stepOptions??{})}throw new Error(`unknown shadow action: ${o}`)}if(e==="prepare"){let a=K(n.strategy),o=or(a.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let l=await kr({storePath:r.storePath??jo(),clock:()=>i}).get(n.shadowId);if(!l)throw new Error("strategy prepare shadow runner not found");if(l.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(l.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(l.strategyHash!==a.strategyHash||l.compilerHash!==a.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(l.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let f=n.caps??Za(a.strategy,i);return o.prepareIntent({strategy:a.strategy,evidence:n.evidence,shadow:{id:l.id,stateHash:io(l),status:l.status,cursor:l.cursor,updatedAt:l.updatedAt},caps:f,nowMs:i,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Wa,Ro=B(()=>{rt();be();Qt();Vn();Xn();so();ir();$t();Wa=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import Mo from"node:fs";function Qa(e){let t={},r=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i.startsWith("--")){r.push(i);continue}let a=i.slice(2),o=e[n+1];o!=null&&!o.startsWith("--")?(t[a]=o,n++):t[a]=!0}return{flags:t,positional:r}}function xe(e,t){if(!e)throw new Error(`${t} path required`);let r;try{r=e==="-"?Mo.readFileSync(0,"utf8"):Mo.readFileSync(e,"utf8")}catch{throw new Error(`${t} could not be read`)}try{return JSON.parse(r)}catch{throw new Error(`${t} must contain valid JSON`)}}function He(e,t){if(e==null)return;if(typeof e=="boolean")throw new Error(`${t} requires a numeric value`);let r=Number(e);if(!Number.isFinite(r))throw new Error(`${t} must be a finite number`);return r}var el=`oracle strategy <draft|validate|backtest|optimize|evidence|shadow|prepare|collect|infer> [args]
4
4
 
5
5
  oracle strategy draft "long BTC when EMA 20 crosses above EMA 50"
6
6
  oracle strategy validate strategy.json
@@ -18,5 +18,5 @@ var qo=Object.defineProperty;var B=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(
18
18
 
19
19
  Strategy simulation and shadowing are local and deterministic. Prepare returns an integrity-bound artifact, HMAC-authenticated when local attestation is configured. Sign and broadcast through an approved execution path.
20
20
  Wallet inference produces testable hypotheses, not the wallet owner's exact algorithm. Save collect output as history.json to retain provenance. Inference returns a reusable strategy plus separate imitation and out-of-sample diagnostics, or insufficient evidence. It does not authorize trading.
21
- `,Wc={name:"strategy",summary:"wallet strategy inference, deterministic backtests, evidence and shadow trading",group:"read",usage:"oracle strategy <draft|validate|backtest|optimize|evidence|shadow|prepare|collect|infer> [args]",async run(e){let{flags:t,positional:r}=Xa(e.argv);if(t.help||r.length===0)return process.stdout.write(Qa),0;let[n,...i]=r,{runStrategyOperation:a}=await Promise.resolve().then(()=>(Ro(),No)),o={nowMs:Date.now(),count:He(t.count,"count")};if(n==="collect"||n==="infer"){let l=new Set(["days","start-time","end-time","max-pages",...n==="infer"?["coin","interval","history","bars","count","max-trials"]:[]]);for(let f of Object.keys(t))if(!l.has(f))throw new Error(`unsupported ${n} option`);if(i.length>1)throw new Error(`${n} accepts one wallet address`);o.wallet=i[0],o.days=He(t.days,"days"),o.startTime=He(t["start-time"],"startTime"),o.endTime=He(t["end-time"],"endTime"),o.maxPages=He(t["max-pages"],"maxPages"),n==="infer"&&(o.coin=t.coin,o.interval=t.interval,o.maxTrials=He(t["max-trials"],"maxTrials"),t.history&&(o.history=xe(t.history,"history")),t.bars&&(o.bars=xe(t.bars,"bars")))}else if(n==="draft")o.prompt=i.join(" ").trim();else if(["validate","backtest","optimize","evidence"].includes(n))o.strategy=xe(i[0],"strategy"),t.bars&&(o.bars=xe(t.bars,"bars")),o.maxTrials=He(t["max-trials"],"max-trials");else if(n==="shadow"){let l=i[0];if(!l)throw new Error("shadow action required");if(!["start","list","get","step","stop"].includes(l))throw new Error("unknown shadow action");o.action=l,l==="start"&&(o.strategy=xe(i[1],"strategy")),l==="step"&&(o.id=i[1],t.bars&&(o.bars=xe(t.bars,"bars"))),l==="stop"&&(o.id=i[1])}else if(n==="prepare")o.strategy=xe(i[0],"strategy"),o.evidence=xe(t.evidence,"evidence"),o.shadowId=t["shadow-id"],t.caps&&(o.caps=xe(t.caps,"caps"));else throw new Error("unknown strategy operation");let s=await a(n,o);return await new Promise((l,f)=>{process.stdout.write(`${JSON.stringify(s,null,2)}
22
- `,u=>u?f(u):l())}),0}};export{Wc as default};
21
+ `,Gc={name:"strategy",summary:"wallet strategy inference, deterministic backtests, evidence and shadow trading",group:"read",usage:"oracle strategy <draft|validate|backtest|optimize|evidence|shadow|prepare|collect|infer> [args]",async run(e){let{flags:t,positional:r}=Qa(e.argv);if(t.help||r.length===0)return process.stdout.write(el),0;let[n,...i]=r,{runStrategyOperation:a}=await Promise.resolve().then(()=>(Ro(),No)),o={nowMs:Date.now(),count:He(t.count,"count")};if(n==="collect"||n==="infer"){let l=new Set(["days","start-time","end-time","max-pages",...n==="infer"?["coin","interval","history","bars","count","max-trials"]:[]]);for(let f of Object.keys(t))if(!l.has(f))throw new Error(`unsupported ${n} option`);if(i.length>1)throw new Error(`${n} accepts one wallet address`);o.wallet=i[0],o.days=He(t.days,"days"),o.startTime=He(t["start-time"],"startTime"),o.endTime=He(t["end-time"],"endTime"),o.maxPages=He(t["max-pages"],"maxPages"),n==="infer"&&(o.coin=t.coin,o.interval=t.interval,o.maxTrials=He(t["max-trials"],"maxTrials"),t.history&&(o.history=xe(t.history,"history")),t.bars&&(o.bars=xe(t.bars,"bars")))}else if(n==="draft")o.prompt=i.join(" ").trim();else if(["validate","backtest","optimize","evidence"].includes(n))o.strategy=xe(i[0],"strategy"),t.bars&&(o.bars=xe(t.bars,"bars")),o.maxTrials=He(t["max-trials"],"max-trials");else if(n==="shadow"){let l=i[0];if(!l)throw new Error("shadow action required");if(!["start","list","get","step","stop"].includes(l))throw new Error("unknown shadow action");o.action=l,l==="start"&&(o.strategy=xe(i[1],"strategy")),l==="step"&&(o.id=i[1],t.bars&&(o.bars=xe(t.bars,"bars"))),l==="stop"&&(o.id=i[1])}else if(n==="prepare")o.strategy=xe(i[0],"strategy"),o.evidence=xe(t.evidence,"evidence"),o.shadowId=t["shadow-id"],t.caps&&(o.caps=xe(t.caps,"caps"));else throw new Error("unknown strategy operation");let s=await a(n,o);return await new Promise((l,f)=>{process.stdout.write(`${JSON.stringify(s,null,2)}
22
+ `,u=>u?f(u):l())}),0}};export{Gc as default};