@oracle-agent/oracle 0.28.29 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assets/skills/oracle-action-semantics/SKILL.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +15 -21
- package/dist/bin/oracle-gateway.mjs +39 -39
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +10 -10
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/cli/commands/chat.mjs +161 -161
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +138 -139
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/follow.mjs +14 -14
- package/dist/cli/commands/model.mjs +165 -165
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/resolve.mjs +6 -6
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/snipe.mjs +8 -8
- package/dist/cli/commands/strategy.mjs +3 -3
- package/dist/cli/commands/swap.mjs +17 -17
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +21 -21
- package/dist/data/names.mjs +2 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +32 -32
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +10 -10
- package/dist/nft/universal-mint-router.mjs +3 -3
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +3 -3
- package/package.json +1 -1
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`),c=Fg("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Jg(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,eu):Math.min(250*2**e,eu)+Math.floor(Math.random()*100)}function Or(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function $i(e,t,r){return Or(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Cr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Yg(e){return e?e.byteLength??e.length??0:0}async function ru(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Cr(e),!n))throw $i(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!n)throw $i(r,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,u=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=Yg(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw $i(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function nu(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Xg(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d}){let p=new AbortController,f=setTimeout(()=>p.abort(),i),m=null,w=t,g=s?{lookupFn:s}:{};if(c&&!a&&!Pi(w))throw Or(`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 y=async(b,{status:T=null}={})=>{let x=await Ci(b,g);if(!x.ok)throw Or(T==null?`HTTP refused ${b}: ${x.error}`:`HTTP redirect to ${b} ${x.error}`,T==null?{}:{status:T});let _=new URL(b).hostname;if(a){if(m&&(await m.close(),m=null),!m)try{m=await Ni({requireUndici:!0,...l?{importUndici:l}:{}})}catch(k){throw Or(T==null?`HTTP refused ${b}: ${k?.message||k}`:`HTTP redirect to ${b} refused: ${k?.message||k}`,T==null?{}:{status:T})}m.pin(_,x.addresses),w=m.fetch}else Xc(w,_,x.addresses);return x};try{let b=String(e),T={...n||{}};c&&await y(b);for(let x=0;x<=tu;x+=1){let _=await w(b,{method:r,headers:T,body:o,signal:p.signal,redirect:"manual"});if(Mg.has(_.status)){if(r!=="GET"&&r!=="HEAD"){let R=await ru(_,u??jg,{url:b,truncate:!0}),I=new Error(`HTTP ${_.status} ${r} ${b} redirected non-idempotent request`);throw I.status=_.status,I.body=nu(R)??R.slice(0,300),I}if(x===tu)throw Cr(_),new Error(`HTTP redirect loop for ${e}`);let E=_.headers?.get?.("location"),A;try{A=Vg(E,b)}catch(R){throw Cr(_),R}let v=!Wg(A,b);if(Cr(_),v&&(T=zg(T)),c)await y(A,{status:_.status});else if(v){let R=await Ci(A,g);if(!R.ok){let I=new Error(`HTTP redirect from ${b} ${R.error}`);throw I.status=_.status,I.retryable=!1,I}a&&R.addresses?.length&&(m||(m=await Ni(l?{importUndici:l}:{})),m&&(m.pin(new URL(A).hostname,R.addresses),w=m.fetch))}b=A;continue}if(typeof d=="function")try{await d(_,{url:b})}catch(E){throw Cr(_),Or(E?.message||String(E))}let k=await ru(_,u,{url:b,onOversize:()=>p.abort()}),h=nu(k);if(!_.ok){let E=new Error(`HTTP ${_.status} ${r} ${b}`);throw E.status=_.status,E.retryAfter=_.headers?.get?.("retry-after")??null,E.body=h??k.slice(0,300),E}return h??k}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function N(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):Ug,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=Number(t.maxResponseBytes),m=Number.isFinite(f)&&f>0?Math.floor(f):null,w=async()=>{let x;for(let _=0;_<=a;_++)try{return await Xg(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:m,importUndici:d,validateResponse:p})}catch(k){x=k;let h=k?.status,E=k?.name==="AbortError",A=new Set([408,425,429]),v=k?.retryable===!1?!1:h!=null?A.has(h)||Dg.has(h)&&Zc.has(o):!E&&Zc.has(o);if(_===a||!v)throw k;await Kg(Jg(_,k?.retryAfter))}throw x};if(!(t.dedupe!==!1&&o==="GET"&&s==null))return w();let y=Gg(o,e,i,{untrustedUrl:l,maxResponseBytes:m}),b=Li.get(y);if(b)return b;let T=w().finally(()=>Li.delete(y));return Li.set(y,T),T}async function Tn(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var Dg,Zc,Ug,eu,ou,Mg,tu,jg,Li,Kg,W=S(()=>{Qc();Dg=new Set([408,425,429,500,502,503,504]),Zc=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ug=2,eu=4e3,ou=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Mg=new Set([301,302,303,307,308]),tu=3,jg=64*1024;Li=new Map;Kg=e=>new Promise(t=>setTimeout(t,e))});function e0({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"?Zg:Qg}async function On(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=e0(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function iu(e={}){return On({type:"meta"},e)}async function su({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return On(i,o)}async function au({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return On({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Qg,Zg,Cn=S(()=>{W();Qg="https://api.hyperliquid.xyz/info",Zg="https://api.hyperliquid-testnet.xyz/info"});import{createHash as t0}from"node:crypto";function Ke(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Xt(e){return typeof e=="number"&&Number.isFinite(e)}function Fi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Fi(t);return Object.freeze(e)}for(let t of Object.keys(e))Fi(e[t]);return Object.freeze(e)}function Ot(e){if(Array.isArray(e))return e.map(Ot);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ot(e[r]);return t}return e}function Bi(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 cu(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function n0(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function o0(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function i0(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 lu(e){if(!Ke(e))throw new TypeError("evidence artifact must be a plain object");if(!r0.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(!Ke(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(!Ke(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ke(e.train)||!Ke(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Ot({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Ot(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 du(e){return t0("sha256").update(JSON.stringify(lu(e)),"utf8").digest("hex")}function Pe(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function qi(e,t){if(!Ke(e)||!Ke(e.metrics))throw new Error(`${t} metrics required`);let r=Pe(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(!Xt(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 s0(e,{maxDailyLossPct:t}={}){let r=e.split,n=Pe(r.trainStartIndex,"split.trainStartIndex"),o=Pe(r.trainEndIndex,"split.trainEndIndex"),i=Pe(r.trainBarCount,"split.trainBarCount",1),s=Pe(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Pe(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Pe(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Xt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");qi(e.train,"train");let u=qi(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Xt(t)&&u.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 l=e.walkForward,d=l.windows;if(d.length<1||l.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let w=0;w<d.length;w++){let g=d[w];if(!Ke(g)||g.index!==w||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let y=Pe(g.trainStartIndex,`walkForward.windows[${w}].trainStartIndex`),b=Pe(g.trainEndIndex,`walkForward.windows[${w}].trainEndIndex`),T=Pe(g.evalStartIndex,`walkForward.windows[${w}].evalStartIndex`),x=Pe(g.evalEndIndex,`walkForward.windows[${w}].evalEndIndex`);if(y!==0||b>=T||T>x||T<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let _=qi({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${w}]`);if(_.tradeCount<1||_.netPnlUsd<=0||_.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Xt(t)&&_.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!Xt(l.passRate)||Math.abs(l.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function pu(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=lu(e),n=Ot({id:e.id,...r});if(JSON.stringify(Ot(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=du(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&s0(e,t),e}function Di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ke(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ke(r))throw new TypeError("backtestOptions must be a plain object");if(!Xt(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=he(e),c=Qt(a),u=Nr(t),l=t.length,d=(q=[],j={})=>uu({status:"fail",strategy:a,sHash:c,barsHash:u,split:j.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:j.train||null,holdout:j.holdout||null,walkForward:j.walkForward||{windows:[],passRate:0},flags:[...s,...q]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(l*n),f=p,m=l-f;if(p<5||m<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let w=t.slice(0,p),g=t.slice(f),y,b;try{y=pt(a,w,r),b=pt(a,g,r)}catch(q){return d([{type:"backtest_error",message:String(q.message||q)}])}let T={metrics:Bi(y),costs:cu(y),tradeCount:y.metrics.tradeCount},x={metrics:Bi(b),costs:cu(b),tradeCount:b.metrics.tradeCount},_={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},k=[],h=Math.floor(l/(o+1));if(h<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:h});else for(let q=0;q<o;q++){let j=h*(q+1),se=j,K=Math.min(l,se+h);if(K-se<3||j<3){k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let We=t.slice(se,K),Sn;try{Sn=pt(a,We,r)}catch{k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let En=Bi(Sn),An=i0(En,a.risk,i);k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:An,reason:An?"pass":"fail_metrics",metrics:En})}let E=k.filter(q=>q.passed).length,A=k.length===0?0:E/k.length,v={windows:k,passRate:A,windowsRun:k.length};x.metrics.tradeCount===0&&T.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),T.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&T.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):T.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<T.metrics.netPnlUsd*.1&&T.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=n0(x.costs),I=o0(b);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(q=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(q.type)),D=s.some(q=>q.type==="overfit"),V="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&A>=.6&&!(I>0&&R>I)&&!D&&!s.some(q=>q.type==="severe_oos_collapse"||q.type==="invalid_windowing")?V="pass_live_eligible":!P&&x.metrics.tradeCount>0&&T.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(V="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&x.metrics.tradeCount>0&&T.metrics.netPnlUsd>0?V="fail":x.metrics.tradeCount>0&&T.metrics.tradeCount>0&&!P?V="pass_paper_only":V="fail",x.metrics.netPnlUsd<0&&(V=V==="pass_live_eligible"?"fail":V==="pass_paper_only"?"pass_paper_only":"fail",V="fail"),uu({status:V,strategy:a,sHash:c,barsHash:u,split:_,train:T,holdout:x,walkForward:v,flags:s})}function uu({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:Nt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=du(u),Fi(Ot(JSON.parse(JSON.stringify(u))))}var r0,Ui=S(()=>{Rt();Ct();Nn();r0=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as a0,createHmac as c0,timingSafeEqual as NI}from"node:crypto";function Mi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Mi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Mi(e[r])}`).join(",")}}`}function fu(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function mu(e=process.env){return fu(process.env)||fu(e)}function p0(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function f0(e){let t=p0(e);return a0("sha256").update(Mi(t)).digest("hex")}function m0(e,t=mu()){return t?c0("sha256",t).update(String(e)).digest("hex"):""}function Z(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+l0:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>d0)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:u0},f=f0(p),m=mu(n),w=m?m0(f,m):void 0,g={...p,prepareHash:f};return w&&(g.prepareMac=w),g}var u0,l0,d0,ge=S(()=>{u0=2,l0=300*1e3,d0=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Rr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function g0(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Hi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Hi(r,`${t}[${n}]`));return}if(Rr(e))for(let[r,n]of Object.entries(e)){let o=g0(r);if(h0.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Hi(n,`${t}.${r}`)}}function ji(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function hu({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(Hi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!Rr(e))throw new Error("handoff: strategy required");if(!Rr(t))throw new Error("handoff: evidence required");if(!Rr(r))throw new Error("handoff: shadow required");if(!Rr(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>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=he(e,{nowMs:o}),a=we(s);if(pu(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!ji(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!ji(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!ji(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)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(p=>p==="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]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.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 l={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.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:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:Pr,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:l},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return Z(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var h0,gu=S(()=>{Rt();Ui();Ct();ge();h0=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Zt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function er(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Lr(e){if(Array.isArray(e))for(let t of e)Lr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Lr(t);return Object.freeze(e)}function y0(e){let t=w0[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function b0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");er(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=er(Number(o.t),`candles[${n}].t`);if(er(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Zt(o.o,`candles[${n}].o`),h:Zt(o.h,`candles[${n}].h`),l:Zt(o.l,`candles[${n}].l`),c:Zt(o.c,`candles[${n}].c`),v:Zt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return Lr([...r.values()].sort((n,o)=>n.t-o.t))}function x0(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 o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=er(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Zt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function S0({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await au({coin:e,startTime:i,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let l of c){let d=Number(l?.time);Number.isSafeInteger(d)&&d>u&&(u=d)}if(c.length<500||u>=r){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return x0(o,r)}function E0(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function wu(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=y0(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=er(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):er(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([su({coin:r,interval:n,startTime:a,endTime:i},t),S0({coin:r,startTime:a,endTime:i},t)]),l=b0(c,{endTime:i}),d=Lr(E0(l,u,o));return Lr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var w0,yu=S(()=>{Cn();w0=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 k0(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))v0.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"||!A0.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 I0(e={}){let t=await iu(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 A0,v0,bu,xu=S(()=>{Cn();gu();yu();A0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),v0=new Set(["coin","interval"]);bu=Object.freeze({id:"hyperliquid",validateMarket:k0,fetchBars:wu,listMarkets:I0,prepareIntent(e){return hu(e)}})});function T0(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 _0.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 zi(e){return typeof e!="string"?null:O0.get(e)??null}function Vi(e){let t=zi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var _0,Su,O0,VI,Wi=S(()=>{xu();_0=Object.freeze(["id","validateMarket","prepareIntent"]);Su=[bu].map(T0),O0=new Map(Su.map(e=>[e.id,e])),VI=Object.freeze([...Su])});import{createHash as C0}from"node:crypto";function Te(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function oe(e){return typeof e=="number"&&Number.isFinite(e)}function Ou(e){return Number.isInteger(e)&&e>0}function Xi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Xi(t);return Object.freeze(e)}for(let t of Object.keys(e))Xi(e[t]);return Object.freeze(e)}function Qi(e){if(Array.isArray(e))return e.map(Qi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Qi(e[r]);return t}return e}function O(e,t,r){e.push({path:t,message:r})}function ft(e,t,r,n){for(let o of Object.keys(e))t.has(o)||O(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function Pu(e,t,r,n){if(!oe(e)||!oe(t)||!oe(r)||!oe(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Yi(e,t,r,n){if(Te(e)){if(ft(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return O(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return O(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Te(o)||![o.value,o.min,o.max,o.step].every(Ou)?(O(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Ou(e)?e:(O(n,t,"must be a positive integer or {param}"),null)}function Cu(e,t,r,n){return Te(e)?(ft(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(O(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(O(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):oe(e)?e:(O(n,t,"must be a finite number or {param}"),null)}function Rn(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 D0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of Rn(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function U0(e,t){if(!Te(e))return O(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>Iu)return O(t,"parameters",`too many parameters (max ${Iu})`),null;let n={};for(let o of r){if(!Nu.test(o)){O(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Te(i)){O(t,s,"must be a plain object");continue}ft(i,Au,s,t);for(let d of Au)d in i||O(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;oe(c)||O(t,`${s}.min`,"must be a finite number"),oe(u)||O(t,`${s}.max`,"must be a finite number"),(!oe(l)||l<=0)&&O(t,`${s}.step`,"must be a positive finite number"),oe(a)||O(t,`${s}.value`,"must be a finite number"),oe(c)&&oe(u)&&c>u&&O(t,`${s}.min`,"min must be <= max"),oe(a)&&oe(c)&&oe(u)&&oe(l)&&l>0&&(Pu(a,c,u,l)||O(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:l}}return n}function M0(e,t,r,n){let o=`nodes.${t}`;if(!Te(e))return O(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!ku[e.type])return O(n,`${o}.type`,"unknown or missing node type"),ft(e,F0,o,n),null;switch(ft(e,ku[e.type],o,n),(typeof e.id!="string"||!Ru.test(e.id))&&O(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!N0.has(e.field))&&O(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Cu(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!R0.has(e.indicator))&&O(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?O(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Yi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?O(n,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))O(n,`${o}.period`,"required field is missing");else{let a=Yi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))O(n,`${o}.${a}`,"required field is missing");else{let c=Yi(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?B0.has(e.output)?s.output=e.output:O(n,`${o}.output`,"must be line|signal|histogram"):O(n,`${o}.output`,"required field is missing"),"period"in e&&O(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&O(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))O(n,`${o}.stdDev`,"required field is missing");else{let a=Cu(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?O(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?q0.has(e.output)?s.output=e.output:O(n,`${o}.output`,"must be upper|middle|lower"):O(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&O(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&O(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&O(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&O(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!P0.has(e.op))&&O(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&O(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(n,`${o}.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"||!L0.has(e.op))&&O(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return O(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?O(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&O(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&O(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!$0.has(e.direction))&&O(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&O(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(n,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function j0(e,t,r){if(!Te(e))return O(t,"risk","must be a plain object"),null;ft(e,vu,"risk",t);for(let p of vu)(!(p in e)||e[p]==null)&&O(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!oe(o)||o<=0||o>50?O(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!oe(i)||i<=0?O(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!oe(s)||s<=0||s>100?O(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!oe(a)||a<=0||a>100?O(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!oe(c)||c<=0||c>1e3?O(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?O(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!oe(l)||l<=0||l>100?O(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?O(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&O(t,"risk.expiresAt","must be strictly greater than nowMs"):O(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function Zi(e,t={}){let r=[];if(!Te(e))return O(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};ft(e,Eu,"",r);for(let d of Eu)(!(d in e)||e[d]==null)&&O(r,d,"required field is missing");e.version!==Gi&&O(r,"version",`must be ${Gi}`),(typeof e.id!="string"||!Nu.test(e.id))&&O(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>Tu)&&O(r,"name",`must be a non-empty string max ${Tu}`);let n=zi(e.venue);n||O(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Te(e.market)||O(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))O(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)O(r,p.path,p.message)}let i=U0(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))O(r,"nodes","must be an array");else if(e.nodes.length>_u)O(r,"nodes",`too many nodes (max ${_u})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=M0(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Ru.test(p.id)&&(a.has(p.id)?O(r,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],f=`nodes.${d}`;for(let m of Rn(p))a.has(m)||O(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of Rn(p)){let w=a.get(m);w&&Ji.has(w.type)&&O(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of Rn(p)){let w=a.get(m);w&&!Ji.has(w.type)&&O(r,f,`node ref "${m}" must be boolean`)}}D0(a)&&O(r,"nodes","graph contains a cycle")}let c=null;if(!Te(e.rules))O(r,"rules","must be a plain object");else{ft(e.rules,Ki,"rules",r);for(let d of Ki)d in e.rules||O(r,`rules.${d}`,"required field is missing");c={};for(let d of Ki){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){O(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){O(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);Ji.has(f.type)||O(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=j0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Xi({version:Gi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function he(e,t={}){let r=Zi(e,t);if(!r.ok)throw new tr(r.errors);return r.strategy}function H0(e){let t=he(e);return JSON.stringify(Qi(t))}function Qt(e){let t=H0(e);return C0("sha256").update(t,"utf8").digest("hex")}function $r(e,t){if(!Te(e))throw new tr([{path:"",message:"strategy must be a plain object"}]);if(!Te(t))throw new tr([{path:"overrides",message:"must be a plain object"}]);let r=he(e),n={};for(let[i,s]of Object.entries(r.parameters))n[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,i)){O(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!oe(s)){O(o,i,"override must be a finite number");continue}if(!Pu(s,a.min,a.max,a.step)){O(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new tr(o);return he({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(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var Gi,Nu,Ru,N0,R0,P0,L0,$0,B0,q0,Ji,Eu,Au,Ki,vu,F0,ku,Iu,_u,Tu,tr,Ct=S(()=>{Wi();Gi=1,Nu=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ru=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,N0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),R0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),P0=new Set(["gt","gte","lt","lte","eq"]),L0=new Set(["and","or","not"]),$0=new Set(["above","below"]),B0=new Set(["line","signal","histogram"]),q0=new Set(["upper","middle","lower"]),Ji=new Set(["compare","logic","cross"]),Eu=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Au=new Set(["value","min","max","step"]),Ki=new Set(["entryLong","entryShort","exitLong","exitShort"]),vu=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),F0=new Set(["id","type"]),ku={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"])},Iu=16,_u=128,Tu=100,tr=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 Br(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 mt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function z0(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 o=r[n];if(typeof o!="number"||!Number.isFinite(o))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 $u(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function Pn(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Bu(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Lu(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,l=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+l)/t,r[a]=Lu(i,s)}return r}function Lu(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function qu(e,t={}){Br(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(mt(r),mt(n),mt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=Pn(e,r),s=Pn(e,n),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),l=[];for(let d=0;d<a.length;d++)a[d]!=null&&l.push(d);if(l.length>=o){let d=0;for(let w=0;w<o;w++)d+=a[l[w]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let w=o;w<l.length;w++){let g=l[w];p=m*a[g]+(1-m)*p,c[g]=p,u[g]=a[g]-p}}return{line:a,signal:c,histogram:u}}function Fu(e,t={}){Br(e);let r=t.period,n=t.stdDev;if(mt(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<r)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let l=e[u];if(a+=l,c+=l*l,u>=r){let d=e[u-r];a-=d,c-=d*d}if(u>=r-1){let d=a/r,p=c/r-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=d,i[u]=d+n*f,s[u]=d-n*f}}return{upper:i,middle:o,lower:s}}function Du(e,t){z0(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Uu=S(()=>{});import{createHash as V0}from"node:crypto";var es,W0,G0,J0,Mu,ju=S(()=>{es=2,W0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",G0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",J0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",Mu=V0("sha256").update(JSON.stringify({version:es,compilerSourceHash:W0,indicatorsSourceHash:G0,schemaSourceHash:J0})).digest("hex")});function Le(e){return typeof e=="number"&&Number.isFinite(e)}function X0(e){let t=new Map(e.map(a=>[a.id,a])),r=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function rr(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Q0(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 o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l:u,c:l,v:d}=i;if(!Le(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l],["v",d]])if(!Le(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,l,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,l,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==Y0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!Le(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Le(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Pt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=K0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=n[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=rr(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?rr(s.period,r):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=n[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Du(d,c);break}let l=Pt(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!Le(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=$u(l,c);else if(s.indicator==="ema")a=Pn(l,c);else if(s.indicator==="rsi")a=Bu(l,c);else if(s.indicator==="macd")a=qu(l,{fastPeriod:rr(s.fastPeriod,r),slowPeriod:rr(s.slowPeriod,r),signalPeriod:rr(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Fu(l,{period:c,stdDev:rr(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Pt(s.left,t,r,n,o,i),u=Pt(s.right,t,r,n,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],p=u[l];if(d==null||p==null||!Le(d)||!Le(p)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>p;break;case"gte":a[l]=d>=p;break;case"lt":a[l]=d<p;break;case"lte":a[l]=d<=p;break;case"eq":a[l]=d===p;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>Pt(u,t,r,n,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let l=c[0][u];a[u]=l===!0?!1:l===!1}else if(s.op==="and"){let l=!0;for(let d of c)if(d[u]!==!0){l=!1;break}a[u]=l}else if(s.op==="or"){let l=!1;for(let d of c)if(d[u]===!0){l=!0;break}a[u]=l}else a[u]=!1;break}case"cross":{let c=Pt(s.left,t,r,n,o,i),u=Pt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],p=u[l-1],f=c[l],m=u[l];if(d==null||p==null||f==null||m==null||!Le(d)||!Le(p)||!Le(f)||!Le(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=p&&f>m:a[l]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function we(e,t={}){let r=he(e);t&&Object.keys(t).length&&(r=$r(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(X0(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Qt(r);function u(f,m){let w={};for(let y of o){let b=f.get(y);w[y]=b[m]}let g=y=>y!=null&&w[y]===!0;return{values:w,signals:{entryLong:g(r.rules.entryLong),entryShort:g(r.rules.entryShort),exitLong:g(r.rules.exitLong),exitShort:g(r.rules.exitShort)}}}function l(f,m){Q0(f,m,r.market.interval);let w=new Map;for(let g of o)Pt(g,n,i,f,m,w);return w}function d(f,m){return u(l(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,w=l(f,m);return Object.freeze(f.map((g,y)=>Object.freeze(u(w,y))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:Pr,compilerHash:Nt,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var Pr,Nt,K0,Y0,Rt=S(()=>{Ct();Uu();ju();Pr=es,Nt=Mu,K0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),Y0=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 Z0}from"node:crypto";function tw(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ye(e){return typeof e=="number"&&Number.isFinite(e)}function ts(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ts(t);return Object.freeze(e)}for(let t of Object.keys(e))ts(e[t]);return Object.freeze(e)}function Ln(e){if(Array.isArray(e))return e.map(Ln);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ln(e[r]);return t}return e}function rs(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)=>rs(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))rs(n,`${t}.${r}`)}}function zu(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:o,o:i,h:s,l:a,c,v:u}=n;if(!Ye(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!Ye(d))throw new TypeError(`bars[${r}].${l} must be a finite number`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c]])if(!(d>0))throw new TypeError(`bars[${r}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in n&&n.fundingRate!=null&&!Ye(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Ye(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Ye(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function Nr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&zu(e),Z0("sha256").update(JSON.stringify(Ln(e)),"utf8").digest("hex")}function rw(e){if(e==null&&(e={}),!tw(e))throw new TypeError("options must be a plain object");let t={...ew},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(!Ye(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 o=e[n];if(!Ye(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}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(!Ye(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 $n(e){return e/1e4}function nw(e,t,r){let n=$n(r);return t==="long"?e*(1+n):e*(1-n)}function ow(e,t,r){let n=$n(r);return t==="long"?e*(1-n):e*(1+n)}function Hu(e,t,r){let n=Math.abs(e)*$n(t),o=Math.abs(e)*$n(r);return{taker:n,builder:o,total:n+o}}function iw(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function sw(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function aw(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function cw(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function uw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function lw(e,t,r){return t==="long"?e.h>=r:e.l<=r}function dw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function qr(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>Ye(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function pw(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function fw(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function pt(e,t,r={}){let n=rw(r);zu(t);let o=Nr(t);n.nowMs!==void 0&&he(e,{nowMs:n.nowMs});let i=we(e);if(qr(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,l=n.takerFeeBps,d=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,w=0,g=0,y=0,b=[],T=[],x=[],_=[],k=[],h=null,E=0,A=null,v=p,R=!1,I=0,P=0,D=[],V=new Array(t.length).fill(0);function Y(C){D.push(C)}function q(C){let U=t[C].v*(n.maxVolumeParticipationPct/100);return Math.max(0,U-V[C])}function j(C){if(!h)return p;let U=h.side==="long"?(C-h.entryPrice)*h.qty:(h.entryPrice-C)*h.qty;return p+U}function se(C,U,L){let te=L.o,H=iw(p,s);if(!(H>0)||!(te>0))return;let re=nw(te,U,u),Q=H/re,ae=q(C),vr=re*ae;if(Q>ae){x.push({kind:"entry",barIndex:C,time:L.t,side:U,requestedNotionalUsd:H,maxFillNotionalUsd:vr,reason:"volume_participation"});return}V[C]+=Q;let Ge=Math.abs(re-te)*Q,nt=Hu(H,l,d);p-=nt.total,f+=nt.taker,m+=nt.builder,g+=Ge,y+=H,h={lifecycleEpoch:++P,side:U,entryBarIndex:C,entryReferencePrice:te,entryPrice:re,qty:Q,notionalUsd:H,stop:sw(re,U,s.stopLossPct),take:aw(re,U,s.takeProfitPct),liq:cw(re,U,s.maxLeverage,l+d),entryFees:nt.taker,entryBuilderFees:nt.builder,entrySlippageUsd:Ge,fundingAccrued:0}}function K(C,U,L,te){if(!h)return!1;let H=h.side,re=U,Q=re;L!=="liquidation"&&te&&(Q=ow(re,H,u));let ae=h.qty,vr=ae*Q;if(L!=="liquidation"){let Bc=q(C),hg=Q*Bc;if(ae>Bc)return x.push({kind:"exit",barIndex:C,time:t[C].t,side:H,requestedNotionalUsd:vr,maxFillNotionalUsd:hg,reason:"volume_participation",triggerReason:L}),!1;V[C]+=ae}let Ge=Hu(vr,l,d),nt=L==="liquidation"?0:Math.abs(Q-re)*ae,kr,Si;H==="long"?(kr=(re-h.entryReferencePrice)*ae,Si=(Q-h.entryPrice)*ae):(kr=(h.entryReferencePrice-re)*ae,Si=(h.entryPrice-Q)*ae),p+=Si,p-=Ge.total,f+=Ge.taker,m+=Ge.builder,g+=nt,y+=vr;let mg={side:H,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,exitBarIndex:C,exitTime:t[C].t,exitPrice:Q,exitReason:L,qty:ae,notionalUsd:h.notionalUsd,grossPnlUsd:kr,feesUsd:h.entryFees+Ge.taker,builderFeesUsd:h.entryBuilderFees+Ge.builder,fundingUsd:h.fundingAccrued,slippageUsd:h.entrySlippageUsd+nt,netPnlUsd:kr-(h.entryFees+Ge.taker+h.entryBuilderFees+Ge.builder)-h.fundingAccrued-(h.entrySlippageUsd+nt)};return b.push(mg),L==="liquidation"&&T.push({barIndex:C,time:t[C].t,side:H,price:Q,tradeIndex:b.length-1}),h=null,P+=1,I=C+1+(s.cooldownBars||0),!0}function We(C,U,L,te){let H=C+1;if(H>=t.length)return;D.some(Q=>Q.kind==="exit"&&Q.side===U&&Q.fillBar===H&&Q.epoch===te)||Y({kind:"exit",side:U,signalBar:C,fillBar:H,reason:L,epoch:te})}function Sn(C){let U=D.filter(L=>L.fillBar===C);for(let L=D.length-1;L>=0;L--)D[L].fillBar===C&&D.splice(L,1);U.sort((L,te)=>{let H=re=>re.kind==="exit"?0:1;return H(L)-H(te)});for(let L of U)if(L.kind==="exit"){if(!h||h.side!==L.side||h.lifecycleEpoch!==L.epoch)continue;let te=L.reason||"rule";K(C,t[C].o,te,!0)||We(C,L.side,te,L.epoch)}else if(L.kind==="entry"){if(h||L.epoch!==P||C<I)continue;se(C,L.side,t[C])}}function En(C){if(!h)return;let U=t[C],L=U.fundingPaymentRate;if(L==null||!Ye(L)||L===0)return;let te=Math.abs(h.qty*U.c),H=L*te;h.side==="long"?(p-=H,h.fundingAccrued+=H,w+=H):(p+=H,h.fundingAccrued-=H,w-=H)}function An(C){if(!h)return;let U=t[C].o;(h.side==="long"?U<=h.liq:U>=h.liq)&&K(C,U,"liquidation",!1)}function Nc(C){if(!h)return;let U=t[C],L=h.side,te=dw(U,L,h.liq),H=uw(U,L,h.stop),re=lw(U,L,h.take),Q=ae=>L==="long"?Math.min(ae,U.o):Math.max(ae,U.o);if(te){K(C,Q(h.liq),"liquidation",!1);return}if(H&&re){K(C,Q(h.stop),"stop_loss",!0)||We(C,L,"stop_loss",h.lifecycleEpoch);return}if(H){K(C,Q(h.stop),"stop_loss",!0)||We(C,L,"stop_loss",h.lifecycleEpoch);return}re&&(K(C,h.take,"take_profit",!0)||We(C,L,"take_profit",h.lifecycleEpoch))}for(let C=0;C<t.length;C++){let U=Math.floor(t[C].t/864e5);U!==A&&(A=U,v=j(t[C].o),R=!1),An(C),Sn(C),Nc(C),En(C),!R&&j(t[C].c)<=v*(1-s.maxDailyLossPct/100)&&(R=!0,_.push({type:"daily_loss_limit",barIndex:C,time:t[C].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let L=a[C].signals,te=C+c;if(h)(h.side==="long"&&L.exitLong===!0||h.side==="short"&&L.exitShort===!0)&&te<t.length&&(D.some(ae=>ae.kind==="exit"&&ae.side===h.side&&ae.fillBar===te&&ae.epoch===h.lifecycleEpoch)||Y({kind:"exit",side:h.side,signalBar:C,fillBar:te,reason:"rule",epoch:h.lifecycleEpoch}));else{let re=L.entryLong===!0,Q=L.entryShort===!0;re&&Q?_.push({type:"conflicting_entry_signals",barIndex:C,time:t[C].t,message:"conflicting entry signals; no position opened"}):!R&&(re||Q)&&te<t.length&&C>=I&&Y({kind:"entry",side:re?"long":"short",signalBar:C,fillBar:te,epoch:P})}let H=p;h&&(E+=1,H=j(t[C].c)),k.push({barIndex:C,time:t[C].t,equity:H,positionSide:h?h.side:null})}let Rc=null;if(h){let C=t.length-1;if(K(C,t[C].c,"end_of_data",!0))k[C]={barIndex:C,time:t[C].t,equity:p,positionSide:null};else{let L=j(t[C].c);Rc={side:h.side,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,qty:h.qty,notionalUsd:h.notionalUsd,markPrice:t[C].c,markedEquityUsd:L},_.push({type:"open_position_at_end",barIndex:C,time:t[C].t,message:"end-of-data exit missed; position remains open and marked"})}}let Pc=(h?j(t[t.length-1].c):p)-n.initialEquityUsd,lg=Pc/n.initialEquityUsd*100,Lc=0,wi=0,yi=0;for(let C of b)C.netPnlUsd>0?(Lc+=1,wi+=C.netPnlUsd):C.netPnlUsd<0&&(yi+=-C.netPnlUsd);let bi=b.length,dg=bi===0?0:Lc/bi,xi=0;yi>0?xi=wi/yi:wi>0&&(xi=1e12);let pg={netPnlUsd:Pc,netPnlPct:lg,maxDrawdownPct:fw(k),winRate:dg,profitFactor:xi,tradeCount:bi,sharpe:pw(k),turnoverUsd:y,exposurePct:E/t.length*100},fg={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},$c={barsHash:o,strategyHash:i.strategyHash,compilerHash:Nt,compilerVersion:Pr,config:fg,trades:b,equityCurve:k,metrics:pg,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:w,slippageUsd:g},liquidations:T,missedFills:x,openPositionAtEnd:Rc,flags:_};return rs($c),ts(Ln($c))}var ew,Nn=S(()=>{Rt();Ct();ew=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as mw}from"node:crypto";function Ew(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ns(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ns(t);return Object.freeze(e)}for(let t of Object.keys(e))ns(e[t]);return Object.freeze(e)}function Aw(e){return String(e).trim().replace(/\s+/g," ")}function vw(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function kw(e){for(let r of gw)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 Iw(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 hw.has(r)?r:null}function _w(e){let t={...yw},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 o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function Tw(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 Ow(e){let t=mw("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function Cw(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(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function Nw(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 Rw(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 Pw(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,""):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 o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Vu(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 Lw({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{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:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let l=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:l,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Vu(a.fast),ema_right_period:Vu(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function $w({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bw({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Wu(e,t={}){if(typeof e!="string")throw new le("prompt must be a string");if(e.length>1e3)throw new le("prompt length must be <= 1000");if(!Ew(t))throw new le("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new le("options.nowMs is required integer epoch ms");let r=t.nowMs,n=Sw;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new le("expiresInMs must be an integer");if(n=t.expiresInMs,n<bw||n>xw)throw new le("expiresInMs must be between 1h and 30d")}if(ww.test(e))throw new le(`prompt appears to contain secrets and is rejected. ${nr}`);let o=Aw(e);if(!o)throw new le(`empty prompt. ${nr}`);if(Tw(o))throw new le(`duplicate interval or risk clause. ${nr}`);let i=vw(o),s=kw(o),a=Iw(o);if(!i||!s||!a)throw new le(`could not parse side/coin/interval. ${nr}`);let c=_w(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new le("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new le("position size out of range");let u=r+n,l=Ow(o),d=`Draft ${s} ${i}`.slice(0,100),p=Cw(o),f=Nw(o),m=Rw(o),w=[p,f,m].filter(Boolean);if(w.length!==1)throw new le(`unsupported or ambiguous prompt. ${nr}`);if(!Pw(o,w[0]))throw new le(`unsupported or ambiguous prompt. ${nr}`);let g,y=w[0],b={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:y};y.kind==="ema_cross"?g=Lw(b):y.kind==="rsi"?g=$w(b):g=Bw(b);let T=Zi(g,{nowMs:r});if(!T.ok)throw new le(`draft failed validation: ${T.errors.map(x=>x.message).join("; ")}`);return ns(he(g,{nowMs:r}))}var le,hw,gw,ww,nr,yw,bw,xw,Sw,Gu=S(()=>{Ct();le=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},hw=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),gw=new Set(["BTC","ETH","SOL","HYPE"]),ww=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,nr="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]. 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.",yw=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),bw=36e5,xw=30*864e5,Sw=864e5});import{createHash as qw}from"node:crypto";function Yu(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 Xu(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function is(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)is(t);return Object.freeze(e)}for(let t of Object.keys(e))is(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 Bn(e){return JSON.stringify(Fr(e))}function Fw(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function Dw(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=Bn(n),s=Bn(o);return i<s?-1:i>s?1:0}),r}function os(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=Bn(r),a=Bn(o);return s<a}function Qu(e,t,r={}){if(!Xu(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Yu(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Ju)throw new TypeError(`maxTrials must be an integer 1..${Ju}`);o=x}let i=r.objective??"netPnlUsd";if(!Ku.has(i))throw new TypeError(`objective must be one of ${[...Ku].join("|")}`);let s=r.backtestOptions??{};if(!Xu(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(Yu(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=he(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},l=1;for(let x of c){let _=Fw(a.parameters[x]);if(_.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=_,l*=_.length}let d=Dw(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,w=null;for(let x of p){let _=$r(a,x),k=pt(_,t,s);w==null&&(w=k.config);let h={netPnlUsd:k.metrics.netPnlUsd,netPnlPct:k.metrics.netPnlPct,maxDrawdownPct:k.metrics.maxDrawdownPct,winRate:k.metrics.winRate,profitFactor:k.metrics.profitFactor,tradeCount:k.metrics.tradeCount,sharpe:k.metrics.sharpe,turnoverUsd:k.metrics.turnoverUsd},E={parameters:{...x},metrics:h};f.push(E),(!m||os(i,h,x,m.metrics,m.parameters))&&(m=E)}f.sort((x,_)=>os(i,x.metrics,x.parameters,_.metrics,_.parameters)?-1:os(i,_.metrics,_.parameters,x.metrics,x.parameters)?1:0);let g={...m.parameters},y=$r(a,g),b={strategyHash:Qt(a),compilerHash:Nt,trainBarsHash:Nr(t),backtestConfig:w,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:g,bestStrategy:y},T={id:qw("sha256").update(JSON.stringify(Fr(b)),"utf8").digest("hex"),...b};return is(Fr(JSON.parse(JSON.stringify(T))))}var Ju,Ku,Zu=S(()=>{Rt();Ct();Nn();Ju=256,Ku=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import ot from"node:fs";import qn from"node:path";function Fn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Xe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Mw(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function or(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>or(r,`${t}[${n}]`));return}if(Fn(e))for(let[r,n]of Object.entries(e)){let o=Mw(r);if(Uw.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);or(n,`${t}.${r}`)}}function jw(e){if(typeof e!="string"||!e||!qn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function el(e){let t;try{t=ot.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 Hw(){return{version:as,runners:[]}}function tl(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Fn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==as)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 or(r,qn.basename(t)),{version:as,runners:r.runners.map(n=>Xe(n))}}function rl(e,t){or(t,"store");let r=qn.dirname(e);ot.mkdirSync(r,{recursive:!0,mode:448});let n=qn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
-
`;try{ot.writeFileSync(n,o,{mode:384,flag:"wx"}),ot.renameSync(n,e);try{ot.chmodSync(e,384)}catch{}}catch(i){try{ot.unlinkSync(n)}catch{}throw i}}function nl(e={}){let t=e.path;if(jw(t),el(t),ot.existsSync(t)?tl(ot.readFileSync(t,"utf8"),t):rl(t,Hw()),ss.has(t))return ss.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let w=m.fn();r=!1,m.resolve(w),o()}catch(w){r=!1,m.reject(w),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((w,g)=>{n.push({fn:m,resolve:w,reject:g}),queueMicrotask(o)})}function s(){return el(t),tl(ot.readFileSync(t,"utf8"),t)}function a(m){rl(t,m)}function c(m){if(!Fn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");or(m,"record");let w=s();if(w.runners.some(y=>y.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let g=Xe(m);return w.runners.push(g),a(w),Xe(g)}function u(m){let w=s().runners.find(g=>g.id===m);return w?Xe(w):null}function l(){return s().runners.map(m=>Xe(m))}function d(m,w){if(typeof w!="function")throw new Error("shadow-store: updater must be a function");let g=s(),y=g.runners.findIndex(x=>x.id===m);if(y<0)throw new Error(`shadow-store: runner not found: ${m}`);let b=Xe(g.runners[y]),T=w(b);if(!Fn(T)||T.id!==m)throw new Error("shadow-store: updater must return record with same id");return or(T,"record"),g.runners[y]=Xe(T),a(g),Xe(g.runners[y])}function p(m){let w=s(),g=w.runners.findIndex(b=>b.id===m);if(g<0)throw new Error(`shadow-store: runner not found: ${m}`);let y=Xe(w.runners[g]);return y.status!=="stopped"&&(y.status="stopped",w.runners[g]=y,a(w)),Xe(w.runners[g])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,w){return i(()=>d(m,w))},stop(m){return i(()=>p(m))}};return ss.set(t,f),f}var as,Uw,ss,ol=S(()=>{as=1,Uw=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];ss=new Map});import{createHash as ls}from"node:crypto";function cs(e){return e==null?e:JSON.parse(JSON.stringify(e))}function us(e){return Array.isArray(e)?e.map(us):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,us(e[t])])):e}function sl(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return ls("sha256").update(JSON.stringify(us(e))).digest("hex")}function zw(e,t,r,n,o){return ls("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Vw(e,t,r,n){return ls("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Ww(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function il(e){return e==="entryLong"||e==="entryShort"}function ds({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=nl({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=we(c),d=u==null?null:String(u),p=r.list().filter(y=>y.status==="running"&&y.strategyHash===l.strategyHash&&y.compilerHash===l.compilerHash&&y.evidenceId===d).sort((y,b)=>y.createdAt-b.createdAt||y.id.localeCompare(b.id))[0];if(p)return cs(p);let f=t(),m=Vw(f,l.strategyHash,l.compilerHash,d),w=r.get(m);if(w)return cs(w);let g={id:m,strategy:cs(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(g)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.stop(c)}function a(c,u,{markoutHorizons:l=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let f=we(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let w=d.cursor,g=[];for(let I=0;I<u.length;I++){let P=u[I].t;(w==null||P>w)&&g.push(I)}if(g.length===0)return d;let y=new Map(d.intendedOrders.map(I=>[I.id,I])),b=new Set(d.fills.map(I=>I.orderId)),T=new Map(d.missedFills.map(I=>[I.orderId,I])),x=(I,P)=>`${I}|${P}`,_=new Map(d.markouts.map(I=>[x(I.orderId,I.horizon),I])),k=d.position?{...d.position}:null,h=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,E=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function A({action:I,signalBarT:P,signalIndex:D}){let V=Ww(I),Y=zw(d.id,d.strategyHash,P,V,I);if(y.has(Y))return y.get(Y);let q=D+1,j=q<u.length,se={id:Y,action:I,type:I,side:V,signalBarT:P,fillBarT:j?u[q].t:null,status:j?"open":"missed"};return y.set(Y,se),d.intendedOrders.push(se),se}function v(I,P,D){if(b.has(I.id))return;let V={orderId:I.id,action:il(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:D};if(d.fills.push(V),b.add(I.id),I.status="filled",I.fillBarT=P.t,T.has(I.id)&&(T.delete(I.id),d.missedFills=d.missedFills.filter(Y=>Y.orderId!==I.id)),il(I.action)){k={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:D};for(let Y of l){let q=x(I.id,Y);if(_.has(q))continue;let j={orderId:I.id,horizon:Y,entryBarT:P.t,entryPrice:P.o,side:k.side,status:"pending",close:null,barT:null};_.set(q,j),d.markouts.push(j)}}else k=null,h=Number(d.strategy?.risk?.cooldownBars)||0,E=P.t}function R(I){if(b.has(I.id)||T.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};T.set(I.id,P),d.missedFills.push(P),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||b.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let D=P+1;D<u.length&&(w==null||u[D].t>w)&&v(I,u[D],D)}for(let I of g){let P=u[I],D=f[I].signals,V=k,Y=j=>{if(k||h>0&&(E==null||P.t>=E))return;let K=A({action:j,signalBarT:P.t,signalIndex:I}),We=I+1;We<u.length?v(K,u[We],We):R(K)},q=j=>{if(!k||k.side==="long"&&j!=="exitLong"||k.side==="short"&&j!=="exitShort")return;let se=A({action:j,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?v(se,u[K],K):R(se)};V?(D.exitLong&&q("exitLong"),D.exitShort&&q("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&Y("entryLong"),D.entryShort&&Y("entryShort")),h>0&&E!=null&&P.t>=E&&(h-=1,h===0&&(E=null)),d.cursor=P.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let P=d.fills.find(Y=>Y.orderId===I.orderId&&Y.action==="entry");if(!P)continue;let D=m.get(P.barT);if(D==null)continue;let V=D+I.horizon;if(V<u.length){I.close=u[V].c,I.barT=u[V].t,I.status="filled";let Y=I.entryPrice;I.markout=I.side==="long"?(I.close-Y)/Y:(Y-I.close)/Y}}return d.position=k,d.cooldownBarsRemaining=h,d.cooldownStartT=E,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var al=S(()=>{Rt();ol()});var ll={};M(ll,{runStrategyOperation:()=>ey});import Gw from"node:os";import Jw from"node:path";function Dr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yw(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function fs(e){if(Array.isArray(e)){for(let t of e)fs(t);return}if(Dr(e))for(let[t,r]of Object.entries(e)){if(Kw.some(n=>Yw(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);fs(r)}}function Xw(e){if(!Dr(e))throw new TypeError("strategy input must be a plain object");return fs(e),e}function Qw(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 ps(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=Vi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n}),a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function ms(e,t){let r=e.backtestOptions??{};if(!Dr(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function cl(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Dr(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:ms(e,n)}}function ul(){return Jw.join(Gw.homedir(),".oracle","strategy-shadow.json")}function Zw(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 ey(e,t={},r={}){let n=Xw(t),o=Qw(n,r);if(e==="draft")return{strategy:Wu(n.prompt,{nowMs:o})};if(e==="validate"){let i=we(n.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=we(n.strategy),s=await ps(i.strategy,n,r,o);qr(i,s);let a=Di(cl(n,i.strategy,s,o));return e==="evidence"?a:{backtest:pt(i.strategy,s,ms(n,o)),evidence:a}}if(e==="optimize"){let i=we(n.strategy),s=await ps(i.strategy,n,r,o);qr(i,s);let a=n.trainFraction,c=n.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let l=s.slice(0,Math.floor(s.length*u)),d=n.options??{};if(!Dr(d))throw new TypeError("options must be a plain object");let p=Qu(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:ms(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:Di(cl(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=ds({storePath:r.storePath??ul(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await ps(a.strategy,n,r,o);return qr(we(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=we(n.strategy),s=Vi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await ds({storePath:r.storePath??ul(),clock:()=>o}).get(n.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??Zw(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:sl(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Kw,dl=S(()=>{Nn();Rt();Ui();Gu();Zu();al();Wi();Kw=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var vl={};M(vl,{DEFAULT_CROSS_CHAIN_SOURCES:()=>yl,DEFAULT_SAME_CHAIN_SOURCES:()=>wl,NATIVE_TOKEN:()=>hs,canonicalJson:()=>xl,hashFirmQuote:()=>Al,hashRfqIntent:()=>El,normalizeFirmQuote:()=>ws,normalizeRfqIntent:()=>sy,sha256Hex:()=>Ur});import{createHash as ty}from"node:crypto";import{getAddress as gl,isAddress as gs}from"ethers";function ne(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function fl(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&ne(t,"must be a positive chainId"),r}function Dn(e,t){let r=String(e??"").trim();return(!ry.test(r)||BigInt(r)<=0n)&&ne(t,"must be a positive integer string"),r}function ny(e,t){return e==null||e===""?null:Dn(e,t)}function ml(e,t){let r=String(e??"").trim();return r.toLowerCase()===hs.toLowerCase()?hs:(gs(r)||ne(t,"must be an EVM address or native token sentinel"),gl(r))}function bl(e,t){let r=String(e??"").trim();return gs(r)||ne(t,"must be an EVM address"),gl(r)}function oy(e,t){return e==null||e===""?null:bl(e,t)}function hl(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||ne(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function iy(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||ne(n,"must be a finite millisecond timestamp"),o<=t&&ne(n,"expired"),o>t+r&&ne(n,"exceeds maxDeadlineMs"),Math.floor(o)}function ir(e){if(Array.isArray(e))return e.map(ir);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=ir(e[r]));return t}return e}function xl(e){return JSON.stringify(ir(e))}function Ur(e){return`0x${ty("sha256").update(xl(e)).digest("hex")}`}function Sl(e,t){let r={...e};for(let n of t)delete r[n];return r}function El(e){return Ur(Sl(e,["intentHash"]))}function Al(e){return Ur(Sl(e,["firmQuoteHash"]))}function sy(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&ne("time","is invalid");let o=fl(e.fromChainId??e.fromChain,"fromChainId"),i=fl(e.toChainId??e.toChain,"toChainId"),a=o===i?wl:yl,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:ml(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:ml(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Dn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:bl(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:iy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:ny(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:hl(e.allowedSources,"allowedSources",a),allowedRouters:hl(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?ir(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ne("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Ur({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=El(c),Object.freeze(c)}function ay(e){return(!e||typeof e!="object"||Array.isArray(e))&&ne("artifact","required"),e.typedDataHash!=null&&!pl.test(String(e.typedDataHash))&&ne("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!pl.test(String(e.calldataHash))&&ne("artifact.calldataHash","must be bytes32"),e.to!=null&&!gs(String(e.to))&&ne("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ne("artifact.data","must be hex"),ir(e)}function ws(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&ne("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ne("quote expiry","required"),o<=n&&ne("quote","expired"),o>e.deadlineMs&&ne("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ne("source","required"),e.allowedSources.includes(i)||ne("source","not allowed by intent");let s=Dn(t.amountOut??t.buyAmount,"amountOut"),a=Dn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&ne("minBuyAmount","exceeds amountOut");let c=ay(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||ne("quotedAtMs","must be finite");let l=oy(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:l,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(u),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?ir(t.metadata):{}};return d.quoteId||(d.quoteId=Ur({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Al(d),Object.freeze(d)}var hs,wl,yl,pl,ry,ys=S(()=>{hs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",wl=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),yl=Object.freeze(["lifi"]),pl=/^0x[0-9a-fA-F]{64}$/,ry=/^\d+$/});import{readFileSync as cy}from"node:fs";import{homedir as uy}from"node:os";import{join as Un}from"node:path";function ly(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=uy();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Un(t,".config","oracle")).trim();return[e,Un(r,"exec.env")].filter(Boolean)}return[e,Un(t,".config","oracle","exec.env"),Un(t,".config","mad-desk","exec.env")].filter(Boolean)}function Mr(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of ly())try{let i=cy(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var jr=S(()=>{});var sr=S(()=>{});import{createHash as dy,createHmac as Il,timingSafeEqual as py}from"node:crypto";function Mn(e){return Array.isArray(e)?`[${e.map(Mn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Mn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function _l(e,{required:t=!1}={}){try{return Mr(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function xs(e){let{signature:t,...r}=e;return r}function Tl(e,{secret:t}={}){let r=_l(t);return r?{...e,signature:Il("sha256",r).update(Mn(xs(e))).digest("hex")}:e}function fy(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return dy("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ve(e,{chainId:t,venue:r,data:n,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=_l(o);if(i){let f=Il("sha256",i).update(Mn(xs(e))).digest("hex");if(!my(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>it||!Number.isInteger(a)||a<0||a>it||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let l=c*BigInt(1e4-s),d=l/10000n;if(l%10000n!==0n&&(d+=1n),u<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=gy(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return Tl({...xs(e),calldataHash:fy(n)},{secret:o})}function my(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:py(r,n)}function bs(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function hy(e){let t=e==null?it:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,it)}function st({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=bs(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(bs(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,bs(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=hy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function Ss({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=kl,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=st({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||kl)),w=d*BigInt(1e4-p.selectedBps),g=w/10000n;if(w%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let y=Number((d-g)*10000n/(d===0n?1n:d));if(y>p.capBps)throw new Error(`auto-slippage: realised floor implies ${y} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Tl({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:l})}function gy(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ce(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=Ss({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var it,kl,ke=S(()=>{jr();sr();it=100,kl=2e4});function Es(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:ht}var ht,Hn=S(()=>{ht="0x000000000000000000000000000000000000dEaD"});import{Contract as wy,JsonRpcProvider as yy}from"ethers";function vy(e){return Ay.test(String(e||""))}async function Ol(e,{contract:t=by,rpc:r=Sy,chainId:n=xy,balanceOf:o}={}){if(!vy(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new yy(r,n,{staticNetwork:!0}),s=new wy(t,Ey,i);return BigInt(await s.balanceOf(e))}var by,xy,Sy,Ey,Ay,Cl=S(()=>{by="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",xy=999,Sy="https://rpc.hyperliquid.xyz/evm",Ey=["function balanceOf(address owner) view returns (uint256)"],Ay=/^0x[a-fA-F0-9]{40}$/});import{existsSync as ky,readFileSync as Iy,lstatSync as _y}from"node:fs";import{homedir as Nl}from"node:os";import{join as As}from"node:path";function Cy(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Rl,t)?Rl[t]:Oy}function $y(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Pl])return String(e[Pl]);let t=e.ORACLE_CONFIG_DIR||As(Nl(),".config","oracle");return As(t,"fee-recipient")}return As(Nl(),".config","oracle","fee-recipient")}function By(e=process.env){try{let t=$y(e);if(!ky(t)||_y(t).isSymbolicLink())return"";let r=Iy(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function qy(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),Ty)}function Fy({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ry]||"").trim(),o=String(e[Py]||Ly).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Cy(t),s=qy(e[Ny],{fallback:n?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=By(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function zn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Fy({env:t,action:r,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Ol(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Ll(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function $l(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Bl(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Ty,Oy,Rl,Ny,Ry,Py,Pl,Ly,Vn=S(()=>{Cl();Ty=100,Oy=5,Rl=Object.freeze({swap:5,bridge:5,perps:0,nft:0});Ny="ORACLE_INTEGRATOR_FEE_BPS",Ry="ORACLE_INTEGRATOR_FEE_RECIPIENT",Py="ORACLE_INTEGRATOR_ID",Pl="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Ly="oracle"});var Is={};M(Is,{LIFI_API:()=>Fl,lifiChains:()=>Hy,lifiHealth:()=>My,lifiPrepare:()=>jy,lifiQuote:()=>Lt});function ks(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Fl).replace(/\/$/,"")}function Uy(e){let t=String(e||vs).toLowerCase();return t===vs.toLowerCase()||t===Dy}function ql(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function My(e={}){let t=await N(`${ks(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function Lt(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=vs,toToken:i,fromAmount:s,fromAddress:a=ht}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let l=await zn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,y]of Object.entries($l(l)))c.set(g,y);let d=await N(`${ks(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:u,oracleFee:l};let f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ce(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),w=d?.estimate?.toAmountMin||d?.toAmountMin;if(w!=null&&BigInt(w)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function jy(e={},t={}){let r=await Lt(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Uy(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:ql(a,"approval token"),spender:ql(s,"approval spender"),amount:String(e.fromAmount)}}return Z({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:ve(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Hy(e={}){return N(`${ks(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Fl,vs,Dy,Hr=S(()=>{W();ke();Hn();ge();Vn();Fl="https://li.quest/v1";vs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Dy="0x0000000000000000000000000000000000000000"});var Ml={};M(Ml,{PARASWAP_API:()=>Dl,paraswapHealth:()=>Vy,paraswapPrepare:()=>zy,paraswapPrice:()=>cr,paraswapTokens:()=>Ul});function ar(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Ul(e={},t={}){let r=Number(e.chainId||1);return N(`${_s(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function cr(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:ar(e.srcToken,"srcToken"),destToken:ar(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await zn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Bl(o)))n.set(a,c);let i=await N(`${_s(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ce(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function zy(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=ar(e.userAddress,"userAddress"),o=await cr(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:ar(e.srcToken,"srcToken"),destToken:ar(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=ar(e.receiver,"receiver"));let c=await N(`${_s(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return Z({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:ve(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Vy(e={}){let t=await Ul({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Dl,_s,Wn=S(()=>{W();ke();ge();Vn();Dl="https://api.paraswap.io",_s=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Dl).replace(/\/$/,"")});function Gn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Hl(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Hl(t),...r]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[jl]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${jl}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Hl(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Jn(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var jl,Ts=S(()=>{jl="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Kl={};M(Kl,{ZEROX_API:()=>zl,zeroxHealth:()=>Wy,zeroxPrepare:()=>Gy,zeroxPrice:()=>Jl,zeroxQuote:()=>ur});function Vl(e={}){return Gn({provider:"zerox",defaultUrl:zl,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Wl(e={}){return Vl(e).baseUrl}function Kn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Gl(e={}){return Jn({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Kn(e)},Vl(e).trusted)}async function Wy(e={}){if(!Kn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Jl({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Jl(e={},t={}){if(!Kn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),N(`${Wl(t)}/swap/allowance-holder/price?${a}`,{headers:Gl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ur(e={},t={}){if(!Kn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await N(`${Wl(t)}/swap/allowance-holder/quote?${c}`,{headers:Gl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ce(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Gy(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await ur(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return Z({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:ve(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var zl,Yn=S(()=>{W();ke();Ts();ge();zl="https://api.0x.org"});var dT,Yl=S(()=>{dT=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var sd={};M(sd,{COW_CANCEL_TYPES:()=>td,COW_HOSTS:()=>Cs,COW_ORDER_TYPES:()=>Xn,COW_SETTLEMENT:()=>Ql,COW_VAULT_RELAYER:()=>Zl,cowCancelOrders:()=>ib,cowChains:()=>cb,cowHealth:()=>Qy,cowOrder:()=>id,cowOrderStatus:()=>od,cowOrderUid:()=>eb,cowPrepareCancel:()=>nb,cowPrepareOrder:()=>Zy,cowQuote:()=>$t,cowSignCancel:()=>ob,cowSignOrder:()=>tb,cowSubmitSignedOrder:()=>rb,cowVerifyOrderFill:()=>ab});import{TypedDataEncoder as Xl,getAddress as zr,isAddress as Jy}from"ethers";function Qn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Cs[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Ky(e,t="v1",r={}){let n=Qn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function gt(e,t){let r=String(e||"").trim();if(!Jy(r))throw new Error(`cowswap: ${t} must be an address`);return zr(r).toLowerCase()}function lr(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function rd(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function nd(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Yy({digest:e,owner:t,validTo:r}={}){let n=rd(e,"order digest").slice(2),o=gt(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Ns(e){let t=Ql[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:zr(t)}}function Xy(e={},t,r){let n=gt(e.sellToken,"sellToken"),o=gt(e.buyToken,"buyToken"),i=gt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=rd(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:lr(e.sellAmount,"sellAmount"),buyAmount:lr(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:lr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Qy(e={}){try{let t=await $t({chainId:1,sellToken:Os[1],buyToken:ed[1],sellAmountBeforeFee:"1000000000000000",from:ht},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function $t(e={},t={}){let r=Number(e.chainId??1),n=Es(e.from||e.owner),o=e.sellToken||Os[r],i=e.buyToken||ed[r],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Os[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await N(`${Qn(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ce(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Zy(e={},t={}){let r=Number(e.chainId??1),n=gt(Es(e.from||e.owner||e.signer),"owner"),o=await $t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Xy(o?.quote||o,r,n),s=Ns(r),a={domain:s,types:Xn,primaryType:"Order",message:i},c=Xl.hash(s,Xn,i),u=Zl[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return Z({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:zr(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:zr(u).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:zr(u).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function od(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${Qn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function id(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${Qn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function eb(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||Xl.hash(Ns(r),Xn,n),i=e.owner||e.from||e.signer||n.receiver;return Yy({digest:o,owner:i,validTo:n.validTo})}async function tb(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function rb(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function nb(e={}){let t=Number(e.chainId??1),r=gt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>nd(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Ns(t);return Z({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:td,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function ob(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function ib(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function sb(e={}){return lr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function ab(e={},t={}){let r=Number(e.chainId??1),n=nd(e.uid||e.orderUid),o=t.order||await id({chainId:r,uid:n},t),i=t.status||o.status||await od({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${Ky(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?gt(e.expectedOwner,"expectedOwner"):null;if(c&>(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(sb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(lr(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(lr(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function cb(){return Object.keys(Cs).map(Number)}var Cs,Ql,Zl,Os,ed,Xn,td,Zn=S(()=>{W();ke();Yl();Hn();ge();Cs={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Ql=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zl=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Os={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ed={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Xn=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),td=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var cd={};M(cd,{CHAINS:()=>eo,chainById:()=>Ps,isSupportedChain:()=>ad,registerChain:()=>ub,rpcUrlFor:()=>Ls});function Ps(e){return Rs.get(Number(e))||null}function ub({key:e,chainId:t,name:r,rpcEnv:n=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:r||e,rpcEnv:n,evm:!0};return eo[e]=o,Rs.set(o.chainId,o),o}function Ls(e,t=process.env){let r=Ps(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function ad(e){return Rs.has(Number(e))}var eo,Rs,$s=S(()=>{eo={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Rs=new Map(Object.values(eo).map(e=>[e.chainId,e]))});import{Interface as lb,getAddress as db}from"ethers";function Vr(e,t){try{return db(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function fb(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Ls(e,r);return n||pb[Number(e)]||null}function hb(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!mb.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function X(e,t,r=[],n={}){let o=String(t||"");hb(o);let i=fb(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function ro(e,t={}){let r=await X(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ud(e,t={}){let r=await X(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function ld(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await X(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function dd(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.owner,"owner"),i=Vr(e.spender,"spender"),s=to.encodeFunctionData("allowance",[o,i]),a=await X(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=to.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function pd(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.account||e.owner||e.address,"account"),i=to.encodeFunctionData("balanceOf",[o]),s=await X(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=to.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var to,pb,mb,at=S(()=>{W();$s();to=new lb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);pb={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};mb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function fd(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function no(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=fd(o,c),d=String(l.address||"").toLowerCase(),p=String(l.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,w=String(c.dex||c.dexId||"").toLowerCase(),g=0;return i.has(d)||gb.has(p)?g=300:s&&d===s&&(g=100),w.includes("v4")?g+=20:w.includes("v3")?g+=10:(w.includes("v2")||w.includes("raydium")||w.includes("orca")||w.includes("meteora"))&&(g+=8),{pool:c,score:g*1e12+m,index:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function md(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&fd(e,r[0]).address||null}var gb,Bs=S(()=>{gb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function xb(e,t,r){let n=$e(t),o=$e(r),i=$e(e?.baseToken?.address),s=$e(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function Sb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Eb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||wb).replace(/\/$/,"")}async function oo(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Eb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hd({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=$e(yb[Number(e)]||e),s=new Set(bb(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>oo(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${$e(f?.chainId)}:${$e(f?.dexId)}:${$e(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>$e(p?.chainId)===i).filter(p=>xb(p,t,r)).filter(p=>!s.size||s.has($e(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Sb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function gd(e,{chainSlug:t="solana",stables:r=Ab}={},n={}){let o=await oo(e,n),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=no(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var wb,yb,$e,bb,Ab,Gr=S(()=>{W();Bs();wb="https://api.dexscreener.com",yb=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),$e=e=>String(e??"").toLowerCase(),bb=e=>Array.isArray(e)?e:e==null?[]:[e];Ab=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var kd={};M(kd,{PANCAKE_FEE_TIERS:()=>io,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>xd,UNI_V3_VENUES:()=>Ad,uniV3Chains:()=>Cb,uniV3EthUsdc:()=>vd,uniV3Health:()=>Ob,uniV3PrepareExactIn:()=>Tb,uniV3QuoteExactIn:()=>Bt,uniV3QuoteExactInPath:()=>_b});import{Interface as yd,getAddress as Jr,isAddress as bd}from"ethers";function Fs(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=Ad[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function qs(e,t){let r=be[Number(t)];if(!e||e===Sd||e===Ed||/^eth$/i.test(String(e)))return Jr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Jr(r.weth);if(/^usdc$/i.test(n))return Jr(r.usdc);if(!bd(n))throw new Error(`invalid token address: ${e}`);return Jr(n)}function kb(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function Ib(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function Bt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=Fs(e.chainId??8453,e.venue),s=qs(e.tokenIn||"WETH",r),a=qs(e.tokenOut||be[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:xd,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],d=[],p=null;for(let k of l){let h=so.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let E=await X(r,"eth_call",[{to:n,data:h},"latest"],t);if(!E||E==="0x"){d.push({fee:k,ok:!1,error:"empty result"});continue}let A=so.decodeFunctionResult("quoteExactInputSingle",E),v={fee:k,ok:!0,amountOut:A[0].toString(),sqrtPriceX96After:A[1].toString(),initializedTicksCrossed:Number(A[2]),gasEstimate:A[3].toString()};d.push(v),(!p||BigInt(v.amountOut)>BigInt(p.amountOut))&&(p=v)}catch(E){d.push({fee:k,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let k=d.map(h=>`${h.fee}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${k}`)}let f=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:kb(e.venue)},t).catch(()=>[]):[],m={};for(let k of f.slice(0,8))if(!(!k.pairAddress||!bd(k.pairAddress)))try{let h=await X(r,"eth_call",[{to:k.pairAddress,data:vb},"latest"],t),E=h&&h!=="0x"&&h.length<=66?Number.parseInt(h,16):NaN;if(!Number.isFinite(E)||E<=0||E>1e6)continue;(m[E]==null||k.liquidityUsd>m[E].liquidityUsd)&&(m[E]=k)}catch{}let w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&w>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),E=d.filter(A=>A.ok&&Number((k-BigInt(A.amountOut))*10000n/k)<=w).filter(A=>m[A.fee]?.liquidityUsd!=null).sort((A,v)=>m[v.fee].liquidityUsd-m[A.fee].liquidityUsd)[0];E&&E.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:E.fee,chosenPoolUsd:m[E.fee].liquidityUsd,bandBps:w},p=E)}let y=m[p.fee]??null,b=f[0]??null,T=y??b,x=e.liquidityUsd??y?.liquidityUsd??b?.liquidityUsd??null,_=e.liquidityUsd!=null?"caller":y?"pool":b?"pair":null;return ce({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:T,liquidityAttribution:_,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _b(e={},t={}){let{chainId:r,quoter:n,router:o}=Fs(e.chainId??8453),i=(e.tokens||[]).map(p=>qs(p,r)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Ib(i,s),u=so.encodeFunctionData("quoteExactInput",[c,a]),l=await X(r,"eth_call",[{to:n,data:u},"latest"],t),d=so.decodeFunctionResult("quoteExactInput",l);return ce({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:r,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function vd(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Bt({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Tb(e={},t={}){let r=Number(e.chainId??8453),n=Fs(r,e.venue),o=Jr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Sd||i===Ed||/^eth$/i.test(i),a=await Bt(e,t),c=wd.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=wd.encodeFunctionData("multicall",[d,[c]]);return Z({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:ve(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Ob(e={}){let t=Number(e.chainId??8453);try{let r=await vd({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function Cb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,xd,vb,so,wd,Sd,Ed,io,Ad,ao=S(()=>{at();Gr();ke();ge();be={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},xd=[100,500,3e3,1e4],vb="0xddca3f43",so=new yd(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),wd=new yd(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),Sd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ed="0x0000000000000000000000000000000000000000",io=[100,500,2500,1e4],Ad={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Cd={};M(Cd,{executeRfqCandidates:()=>Td,rankRfqQuotes:()=>Od,requestRfqQuotes:()=>Pb,sourceCandidates:()=>_d});function Kr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Id(e,t){return String(e?.[t]??"").trim()}function Yr(e,t){return Object.freeze({source:e,run:t})}function _d(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Kr(e,"lifi")&&s.push(Yr("lifi",async()=>{let c=await(n.lifiQuote??Lt)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),u=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:u?.toAmount??c?.toAmount,minBuyAmount:u?.toAmountMin??c?.toAmountMin??u?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await Nb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Kr(e,"paraswap")&&s.push(Yr("paraswap",async()=>{let c=await(n.paraswapPrice??cr)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),Kr(e,"0x")&&(Id(r,"ZEROX_API_KEY")||Id(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Yr("0x",async()=>{let c=await(n.zeroxQuote??ur)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Kr(e,"cow")&&s.push(Yr("cow",async()=>{let c=await(n.cowQuote??$t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Kr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Yr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??Bt)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function Nb(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Rb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Td(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Rb(a,n))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(ws(e,{...u.value,source:c.source},r))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Od(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Pb(e,t={}){let r=_d(e,t),{quotes:n,failed:o}=await Td(e,r,t),i=Od(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Nd=S(()=>{Hr();Wn();Yn();Zn();ao();ys()});function Rd(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Lb.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||r.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))dr.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Pd(e){let{ok:t,errors:r,warnings:n}=Rd(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
2
|
+
var Mm=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var M=(e,t)=>{for(var r in t)Mm(e,r,{get:t[r],enumerable:!0})};import{homedir as Go}from"node:os";import{join as Ko}from"node:path";function Xo(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function nn(e,t,r=!1){return String(Xo(e,t,r?"1":"")).trim()==="1"}var qa,jm,YA,on=v(()=>{qa=process.env.ORACLE_PUBLIC_DESKTOP==="1",jm=qa?process.env.ORACLE_CONFIG_DIR||Ko(Go(),".config","oracle"):Ko(Go(),".config","oracle"),YA=qa?jm:Ko(Go(),".config","mad-desk")});function dh(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function ph(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function wt(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||th))return r;let n=t.fileRead?ph:dh;r=r.replace(oh,"[REDACTED_PRIVATE_KEY]"),r=r.replace(nh,"[REDACTED_EVM_KEY]"),r=r.replace(ih,o=>n(o));for(let o of rh)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(sh,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(ah,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(ch,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function Ma(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}(t.username||t.password)&&(t.username="",t.password="");let r=[...t.searchParams.keys()];for(let n of r){let o=String(n).replace(/[^a-z0-9]/gi,"").toLowerCase();lh.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var eh,th,rh,nh,oh,ih,sh,ah,ch,uh,lh,Qo=v(()=>{eh=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),th=["1","true","yes","on"].includes(eh),rh=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],nh=/\b0x[a-fA-F0-9]{64}\b/g,oh=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,ih=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,sh=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,ah=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,ch=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,uh=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),lh=new Set([...uh].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import xt from"node:net";import hh from"node:dns";function cn(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=d=>{if(!d)return[];let l=d.split(":"),p=l.at(-1);if(p?.includes(".")){let f=p.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;l.splice(l.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return l.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:l.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let u=[...i,...Array(Math.max(0,c)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(d=>[d>>8,d&255]))}function Jo(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Zo(e){if(xt.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(xt.isIPv6(e)){let t=cn(e);if(!t)return!1;let r=cn("::ffff:0:0");return Jo(t,r,96)?Zo([...t.slice(12)].join(".")):Jo(t,cn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Jo(t,cn(o),i)):!1}return!1}function gh(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(yh.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xt.isIP(r);return n!==0&&!Zo(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function ei(e,{lookupFn:t=hh.promises.lookup}={}){let r=gh(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:xt.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Zo(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function ti({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let l=await t();r=l.Agent,n=l.fetch}catch(l){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${l?.message||l}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=l=>String(l).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=l=>(Array.isArray(l)?l:[l]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(xt.isIPv6(p.address)?6:4)})),a=(l,p,f)=>{i.set(o(l),s(typeof p=="string"?[{address:p,family:f}]:p))},c=l=>{let p=o(l);if(xt.isIP(p))return[{address:p,family:xt.isIPv6(p)?6:4}];let f=i.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${l} during pinned fetch`);return f},u=new r({connect:{lookup(l,p,f){let m;try{m=c(l)}catch(g){return f(g)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),d=bh((l,p={})=>n(l,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:d,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function bh(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[ri]=Object.freeze({pin:t}),e}function ni(e){return typeof e=="function"&&typeof e[ri]?.pin=="function"}function Ha(e,t,r){if(!ni(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ri].pin(t,r)}var yh,ri,za=v(()=>{yh=new Set(["localhost","metadata.google.internal","metadata.goog"]);ri=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as wh}from"node:crypto";function Ah(e){let t=String(e||"").toLowerCase();return Ya.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function vh(e){let t={};for(let[r,n]of Object.entries(e||{}))Ah(r)||(t[r]=n);return t}function Ih(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 _h(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Oh(e,t,r,n={}){let o={};for(let[d,l]of Object.entries(r||{}))o[d.toLowerCase()]=l;let i=Object.keys(o).filter(d=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(d)),a=[...new Set([...Ya,...i])].sort().map(d=>`${d}=${o[d]??""}`).join(`
|
|
3
|
+
`),c=wh("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Ch(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Wa):Math.min(250*2**e,Wa)+Math.floor(Math.random()*100)}function mr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ii(e,t,r){return mr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function hr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Nh(e){return e?e.byteLength??e.length??0:0}async function Ka(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(hr(e),!n))throw ii(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let l=await e.text(),p=Buffer.byteLength(l,"utf8");if(p>t){if(!n)throw ii(r,`body ${p} bytes`,t);return Buffer.from(l,"utf8").subarray(0,t).toString("utf8")}return l}let a=[],c=0,u=!1;try{for(;;){let{value:l,done:p}=await s.read();if(p)break;if(l&&(a.push(Buffer.from(l)),c+=Nh(l),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw ii(r,`streamed ${c} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Xa(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Rh(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:d,validateResponse:l,signal:p}){let f=new AbortController,m=setTimeout(()=>f.abort(),i),g=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,h=null,w=t,E=s?{lookupFn:s}:{};if(c&&!a&&!ni(w))throw mr(`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 _=async(x,{status:O=null}={})=>{let A=await ei(x,E);if(!A.ok)throw mr(O==null?`HTTP refused ${x}: ${A.error}`:`HTTP redirect to ${x} ${A.error}`,O==null?{}:{status:O});let b=new URL(x).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await ti({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw mr(O==null?`HTTP refused ${x}: ${y?.message||y}`:`HTTP redirect to ${x} refused: ${y?.message||y}`,O==null?{}:{status:O})}h.pin(b,A.addresses),w=h.fetch}else Ha(w,b,A.addresses);return A};try{let x=String(e),O={...n||{}};c&&await _(x);for(let A=0;A<=Ga;A+=1){let b=await w(x,{method:r,headers:O,body:o,signal:g,redirect:"manual"});if(Sh.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let P=await Ka(b,u??kh,{url:x,truncate:!0}),q=new Error(`HTTP ${b.status} ${r} ${x} redirected non-idempotent request`);throw q.status=b.status,q.body=Xa(P)??P.slice(0,300),q}if(A===Ga)throw hr(b),new Error(`HTTP redirect loop for ${e}`);let S=b.headers?.get?.("location"),R;try{R=Ih(S,x)}catch(P){throw hr(b),P}let I=!_h(R,x);if(hr(b),I&&(O=vh(O)),c)await _(R,{status:b.status});else if(I){let P=await ei(R,E);if(!P.ok){let q=new Error(`HTTP redirect from ${x} ${P.error}`);throw q.status=b.status,q.retryable=!1,q}a&&P.addresses?.length&&(h||(h=await ti(d?{importUndici:d}:{})),h&&(h.pin(new URL(R).hostname,P.addresses),w=h.fetch))}x=R;continue}if(typeof l=="function")try{await l(b,{url:x})}catch(S){throw hr(b),mr(S?.message||String(S))}let y=await Ka(b,u,{url:x,onOversize:()=>f.abort()}),k=Xa(y);if(!b.ok){let S=new Error(`HTTP ${b.status} ${r} ${x}`);throw S.status=b.status,S.retryAfter=b.headers?.get?.("retry-after")??null,S.body=k??y.slice(0,300),S}return k??y}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function N(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):Eh,c=t.lookupFn,u=!t.fetchImpl,d=t.untrustedUrl===!0,l=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),g=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let O;for(let A=0;A<=a;A++){f?.throwIfAborted?.();try{return await Rh(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:d,maxResponseBytes:g,importUndici:l,validateResponse:p,signal:f})}catch(b){O=b;let y=b?.status,k=b?.name==="AbortError"||b?.name==="TimeoutError"||f?.aborted,S=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?S.has(y)||xh.has(y)&&Va.has(o):!k&&Va.has(o);if(A===a||!R)throw b;let I=Ch(A,b?.retryAfter);f?await new Promise((P,q)=>{let j=setTimeout(P,I);f.addEventListener("abort",()=>{clearTimeout(j),q(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Th(I)}}throw O};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let E=Oh(o,e,i,{untrustedUrl:d,maxResponseBytes:g}),_=oi.get(E);if(_)return _;let x=h().finally(()=>oi.delete(E));return oi.set(E,x),x}async function un(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var xh,Va,Eh,Wa,Ya,Sh,Ga,kh,oi,Th,W=v(()=>{za();xh=new Set([408,425,429,500,502,503,504]),Va=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Eh=2,Wa=4e3,Ya=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Sh=new Set([301,302,303,307,308]),Ga=3,kh=64*1024;oi=new Map;Th=e=>new Promise(t=>setTimeout(t,e))});function Lh({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"?$h:Ph}async function si(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Lh(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Qa(e={}){return si({type:"meta"},e)}async function Ja({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return si(i,o)}async function Za({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return si({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Ph,$h,ai=v(()=>{W();Ph="https://api.hyperliquid.xyz/info",$h="https://api.hyperliquid-testnet.xyz/info"});import{createHash as qh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){return typeof e=="number"&&Number.isFinite(e)}function li(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)li(t);return Object.freeze(e)}for(let t of Object.keys(e))li(e[t]);return Object.freeze(e)}function Et(e){if(Array.isArray(e))return e.map(Et);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Et(e[r]);return t}return e}function ci(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 ec(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Bh(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Fh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Dh(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 rc(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Uh.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(!Ve(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(!Ve(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ve(e.train)||!Ve(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Et({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Et(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 nc(e){return qh("sha256").update(JSON.stringify(rc(e)),"utf8").digest("hex")}function Te(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function ui(e,t){if(!Ve(e)||!Ve(e.metrics))throw new Error(`${t} metrics required`);let r=Te(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(!qt(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 Mh(e,{maxDailyLossPct:t}={}){let r=e.split,n=Te(r.trainStartIndex,"split.trainStartIndex"),o=Te(r.trainEndIndex,"split.trainEndIndex"),i=Te(r.trainBarCount,"split.trainBarCount",1),s=Te(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Te(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Te(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!qt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");ui(e.train,"train");let u=ui(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(qt(t)&&u.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 d=e.walkForward,l=d.windows;if(l.length<1||d.windowsRun!==l.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let g=0;g<l.length;g++){let h=l[g];if(!Ve(h)||h.index!==g||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Te(h.trainStartIndex,`walkForward.windows[${g}].trainStartIndex`),E=Te(h.trainEndIndex,`walkForward.windows[${g}].trainEndIndex`),_=Te(h.evalStartIndex,`walkForward.windows[${g}].evalStartIndex`),x=Te(h.evalEndIndex,`walkForward.windows[${g}].evalEndIndex`);if(w!==0||E>=_||_>x||_<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,h.passed){if(p+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let O=ui({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${g}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(qt(t)&&O.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(h.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/l.length;if(!qt(d.passRate)||Math.abs(d.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function oc(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=rc(e),n=Et({id:e.id,...r});if(JSON.stringify(Et(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=nc(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Mh(e,t),e}function di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ve(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ve(r))throw new TypeError("backtestOptions must be a plain object");if(!qt(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=me(e),c=Ut(a),u=yr(t),d=t.length,l=(B=[],H={})=>tc({status:"fail",strategy:a,sHash:c,barsHash:u,split:H.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:H.train||null,holdout:H.holdout||null,walkForward:H.walkForward||{windows:[],passRate:0},flags:[...s,...B]});if(d<10)return l([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(d*n),f=p,m=d-f;if(p<5||m<3)return l([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let g=t.slice(0,p),h=t.slice(f),w,E;try{w=ut(a,g,r),E=ut(a,h,r)}catch(B){return l([{type:"backtest_error",message:String(B.message||B)}])}let _={metrics:ci(w),costs:ec(w),tradeCount:w.metrics.tradeCount},x={metrics:ci(E),costs:ec(E),tradeCount:E.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:d-1,holdoutBarCount:m,trainFraction:n},A=[],b=Math.floor(d/(o+1));if(b<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:b});else for(let B=0;B<o;B++){let H=b*(B+1),ie=H,K=Math.min(d,ie+b);if(K-ie<3||H<3){A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let je=t.slice(ie,K),en;try{en=ut(a,je,r)}catch{A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let tn=ci(en),rn=Dh(tn,a.risk,i);A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:rn,reason:rn?"pass":"fail_metrics",metrics:tn})}let y=A.filter(B=>B.passed).length,k=A.length===0?0:y/A.length,S={windows:A,passRate:k,windowsRun:A.length};x.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=Bh(x.costs),I=Fh(E);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(B=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(B.type)),q=s.some(B=>B.type==="overfit"),j="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&k>=.6&&!(I>0&&R>I)&&!q&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?j="pass_live_eligible":!P&&x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(j="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&x.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?j="fail":x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!P?j="pass_paper_only":j="fail",x.metrics.netPnlUsd<0&&(j=j==="pass_live_eligible"?"fail":j==="pass_paper_only"?"pass_paper_only":"fail",j="fail"),tc({status:j,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:x,walkForward:S,flags:s})}function tc({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:kt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=nc(u),li(Et(JSON.parse(JSON.stringify(u))))}var Uh,pi=v(()=>{At();St();ln();Uh=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as jh,createHmac as Hh,timingSafeEqual as b1}from"node:crypto";function fi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${fi(e[r])}`).join(",")}}`}function ic(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function sc(e=process.env){return ic(process.env)||ic(e)}function Gh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Kh(e){let t=Gh(e);return jh("sha256").update(fi(t)).digest("hex")}function Xh(e,t=sc()){return t?Hh("sha256",t).update(String(e)).digest("hex"):""}function J(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+Vh:Number(i),d=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||d<=0||d>Wh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:zh},f=Kh(p),m=sc(n),g=m?Xh(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var zh,Vh,Wh,ge=v(()=>{zh=2,Vh=300*1e3,Wh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function gr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qh(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function hi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>hi(r,`${t}[${n}]`));return}if(gr(e))for(let[r,n]of Object.entries(e)){let o=Qh(r);if(Yh.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);hi(n,`${t}.${r}`)}}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function ac({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(hi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!gr(e))throw new Error("handoff: strategy required");if(!gr(t))throw new Error("handoff: evidence required");if(!gr(r))throw new Error("handoff: shadow required");if(!gr(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>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=me(e,{nowMs:o}),a=he(s);if(oc(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!mi(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!mi(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!mi(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)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(p=>p==="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]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.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 d={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},l={strategyHash:a.strategyHash,compilerHash:a.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:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:br,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:d},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(l,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Yh,cc=v(()=>{At();pi();St();ge();Yh=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Bt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Ft(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function wr(e){if(Array.isArray(e))for(let t of e)wr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))wr(t);return Object.freeze(e)}function Zh(e){let t=Jh[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function e0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Ft(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=Ft(Number(o.t),`candles[${n}].t`);if(Ft(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Bt(o.o,`candles[${n}].o`),h:Bt(o.h,`candles[${n}].h`),l:Bt(o.l,`candles[${n}].l`),c:Bt(o.c,`candles[${n}].c`),v:Bt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return wr([...r.values()].sort((n,o)=>n.t-o.t))}function t0(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 o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=Ft(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Bt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function r0({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await Za({coin:e,startTime:i,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let d of c){let l=Number(d?.time);Number.isSafeInteger(l)&&l>u&&(u=l)}if(c.length<500||u>=r){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return t0(o,r)}function n0(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function uc(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=Zh(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Ft(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):Ft(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Ja({coin:r,interval:n,startTime:a,endTime:i},t),r0({coin:r,startTime:a,endTime:i},t)]),d=e0(c,{endTime:i}),l=wr(n0(d,u,o));return wr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:l})}var Jh,lc=v(()=>{ai();Jh=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 s0(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))i0.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"||!o0.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 a0(e={}){let t=await Qa(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 o0,i0,dc,pc=v(()=>{ai();cc();lc();o0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),i0=new Set(["coin","interval"]);dc=Object.freeze({id:"hyperliquid",validateMarket:s0,fetchBars:uc,listMarkets:a0,prepareIntent(e){return ac(e)}})});function u0(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 c0.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 yi(e){return typeof e!="string"?null:l0.get(e)??null}function gi(e){let t=yi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var c0,fc,l0,R1,bi=v(()=>{pc();c0=Object.freeze(["id","validateMarket","prepareIntent"]);fc=[dc].map(u0),l0=new Map(fc.map(e=>[e.id,e])),R1=Object.freeze([...fc])});import{createHash as d0}from"node:crypto";function Ie(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function Ec(e){return Number.isInteger(e)&&e>0}function ki(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ki(t);return Object.freeze(e)}for(let t of Object.keys(e))ki(e[t]);return Object.freeze(e)}function Ai(e){if(Array.isArray(e))return e.map(Ai);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ai(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function lt(e,t,r,n){for(let o of Object.keys(e))t.has(o)||C(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function vc(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Si(e,t,r,n){if(Ie(e)){if(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return C(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return C(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Ie(o)||![o.value,o.min,o.max,o.step].every(Ec)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Ec(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function Sc(e,t,r,n){return Ie(e)?(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(C(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(C(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(C(n,t,"must be a finite number or {param}"),null)}function dn(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 x0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of dn(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function E0(e,t){if(!Ie(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>bc)return C(t,"parameters",`too many parameters (max ${bc})`),null;let n={};for(let o of r){if(!kc.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ie(i)){C(t,s,"must be a plain object");continue}lt(i,hc,s,t);for(let l of hc)l in i||C(t,`${s}.${l}`,"required field is missing");let{value:a,min:c,max:u,step:d}=i;ne(c)||C(t,`${s}.min`,"must be a finite number"),ne(u)||C(t,`${s}.max`,"must be a finite number"),(!ne(d)||d<=0)&&C(t,`${s}.step`,"must be a positive finite number"),ne(a)||C(t,`${s}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&C(t,`${s}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(d)&&d>0&&(vc(a,c,u,d)||C(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:d}}return n}function S0(e,t,r,n){let o=`nodes.${t}`;if(!Ie(e))return C(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!gc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),lt(e,w0,o,n),null;switch(lt(e,gc[e.type],o,n),(typeof e.id!="string"||!Ac.test(e.id))&&C(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!p0.has(e.field))&&C(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Sc(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!f0.has(e.indicator))&&C(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?C(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Si(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?C(n,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))C(n,`${o}.period`,"required field is missing");else{let a=Si(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))C(n,`${o}.${a}`,"required field is missing");else{let c=Si(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?g0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be line|signal|histogram"):C(n,`${o}.output`,"required field is missing"),"period"in e&&C(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(n,`${o}.stdDev`,"required field is missing");else{let a=Sc(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?C(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?b0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be upper|middle|lower"):C(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&C(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!m0.has(e.op))&&C(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.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"||!h0.has(e.op))&&C(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?C(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&C(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!y0.has(e.direction))&&C(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function k0(e,t,r){if(!Ie(e))return C(t,"risk","must be a plain object"),null;lt(e,yc,"risk",t);for(let p of yc)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let d=e.maxDailyLossPct;!ne(d)||d<=0||d>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=d;let l=e.expiresAt;return!Number.isInteger(l)||l<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?l<=r.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=l),n}function vi(e,t={}){let r=[];if(!Ie(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};lt(e,mc,"",r);for(let l of mc)(!(l in e)||e[l]==null)&&C(r,l,"required field is missing");e.version!==wi&&C(r,"version",`must be ${wi}`),(typeof e.id!="string"||!kc.test(e.id))&&C(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>xc)&&C(r,"name",`must be a non-empty string max ${xc}`);let n=yi(e.venue);n||C(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ie(e.market)||C(r,"market","must be a plain object");else{let l=n.validateMarket(e.market);if(!l||typeof l.ok!="boolean"||!Array.isArray(l.errors))C(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(l.ok)o=l.market;else for(let p of l.errors)C(r,p.path,p.message)}let i=E0(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))C(r,"nodes","must be an array");else if(e.nodes.length>wc)C(r,"nodes",`too many nodes (max ${wc})`);else{s=[];for(let l=0;l<e.nodes.length;l++){let p=S0(e.nodes[l],l,i||{},r);p&&(typeof p.id=="string"&&Ac.test(p.id)&&(a.has(p.id)?C(r,`nodes.${l}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let l=0;l<s.length;l++){let p=s[l],f=`nodes.${l}`;for(let m of dn(p))a.has(m)||C(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of dn(p)){let g=a.get(m);g&&xi.has(g.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of dn(p)){let g=a.get(m);g&&!xi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}x0(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!Ie(e.rules))C(r,"rules","must be a plain object");else{lt(e.rules,Ei,"rules",r);for(let l of Ei)l in e.rules||C(r,`rules.${l}`,"required field is missing");c={};for(let l of Ei){let p=e.rules[l];if(p===null){c[l]=null;continue}if(typeof p!="string"||!p){C(r,`rules.${l}`,"must be a node id or null"),c[l]=p;continue}if(!a.has(p)){C(r,`rules.${l}`,`unknown node ref "${p}"`),c[l]=p;continue}let f=a.get(p);xi.has(f.type)||C(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=p}}let u=k0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let d=ki({version:wi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:d}}function me(e,t={}){let r=vi(e,t);if(!r.ok)throw new Dt(r.errors);return r.strategy}function A0(e){let t=me(e);return JSON.stringify(Ai(t))}function Ut(e){let t=A0(e);return d0("sha256").update(t,"utf8").digest("hex")}function xr(e,t){if(!Ie(e))throw new Dt([{path:"",message:"strategy must be a plain object"}]);if(!Ie(t))throw new Dt([{path:"overrides",message:"must be a plain object"}]);let r=me(e),n={};for(let[i,s]of Object.entries(r.parameters))n[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,i)){C(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ne(s)){C(o,i,"override must be a finite number");continue}if(!vc(s,a.min,a.max,a.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Dt(o);return me({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(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var wi,kc,Ac,p0,f0,m0,h0,y0,g0,b0,xi,mc,hc,Ei,yc,w0,gc,bc,wc,xc,Dt,St=v(()=>{bi();wi=1,kc=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ac=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,p0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),f0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),m0=new Set(["gt","gte","lt","lte","eq"]),h0=new Set(["and","or","not"]),y0=new Set(["above","below"]),g0=new Set(["line","signal","histogram"]),b0=new Set(["upper","middle","lower"]),xi=new Set(["compare","logic","cross"]),mc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),hc=new Set(["value","min","max","step"]),Ei=new Set(["entryLong","entryShort","exitLong","exitShort"]),yc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),w0=new Set(["id","type"]),gc={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"])},bc=16,wc=128,xc=100,Dt=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 Er(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 dt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function v0(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 o=r[n];if(typeof o!="number"||!Number.isFinite(o))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 _c(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function pn(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Oc(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Ic(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,d=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+d)/t,r[a]=Ic(i,s)}return r}function Ic(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Cc(e,t={}){Er(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(dt(r),dt(n),dt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=pn(e,r),s=pn(e,n),a=new Array(e.length).fill(null);for(let l=0;l<e.length;l++)i[l]!=null&&s[l]!=null&&(a[l]=i[l]-s[l]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),d=[];for(let l=0;l<a.length;l++)a[l]!=null&&d.push(l);if(d.length>=o){let l=0;for(let g=0;g<o;g++)l+=a[d[g]];let p=l/o,f=d[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let g=o;g<d.length;g++){let h=d[g];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function Tc(e,t={}){Er(e);let r=t.period,n=t.stdDev;if(dt(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<r)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let d=e[u];if(a+=d,c+=d*d,u>=r){let l=e[u-r];a-=l,c-=l*l}if(u>=r-1){let l=a/r,p=c/r-l*l;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=l,i[u]=l+n*f,s[u]=l-n*f}}return{upper:i,middle:o,lower:s}}function Nc(e,t){v0(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Rc=v(()=>{});import{createHash as I0}from"node:crypto";var Ii,_0,O0,C0,Pc,$c=v(()=>{Ii=2,_0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",O0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",C0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",Pc=I0("sha256").update(JSON.stringify({version:Ii,compilerSourceHash:_0,indicatorsSourceHash:O0,schemaSourceHash:C0})).digest("hex")});function Ne(e){return typeof e=="number"&&Number.isFinite(e)}function R0(e){let t=new Map(e.map(a=>[a.id,a])),r=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Mt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function P0(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 o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l:u,c:d,v:l}=i;if(!Ne(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",d],["v",l]])if(!Ne(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",d]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(l<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,d,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,d,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==N0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!Ne(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ne(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function vt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=T0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let d=n[u][c];a[u]=d===void 0?null:d}break}case"constant":{let c=Mt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Mt(s.period,r):void 0;if(s.indicator==="atr"){let l=[];for(let p=0;p<=o;p++){let f=n[p];l.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Nc(l,c);break}let d=vt(s.input,t,r,n,o,i).map((l,p)=>{if(l==null||!Ne(l))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return l});if(s.indicator==="sma")a=_c(d,c);else if(s.indicator==="ema")a=pn(d,c);else if(s.indicator==="rsi")a=Oc(d,c);else if(s.indicator==="macd")a=Cc(d,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Tc(d,{period:c,stdDev:Mt(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1);for(let d=0;d<=o;d++){let l=c[d],p=u[d];if(l==null||p==null||!Ne(l)||!Ne(p)){a[d]=!1;continue}switch(s.op){case"gt":a[d]=l>p;break;case"gte":a[d]=l>=p;break;case"lt":a[d]=l<p;break;case"lte":a[d]=l<=p;break;case"eq":a[d]=l===p;break;default:a[d]=!1}}break}case"logic":{let c=s.inputs.map(u=>vt(u,t,r,n,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let d=c[0][u];a[u]=d===!0?!1:d===!1}else if(s.op==="and"){let d=!0;for(let l of c)if(l[u]!==!0){d=!1;break}a[u]=d}else if(s.op==="or"){let d=!1;for(let l of c)if(l[u]===!0){d=!0;break}a[u]=d}else a[u]=!1;break}case"cross":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let d=1;d<=o;d++){let l=c[d-1],p=u[d-1],f=c[d],m=u[d];if(l==null||p==null||f==null||m==null||!Ne(l)||!Ne(p)||!Ne(f)||!Ne(m)){a[d]=!1;continue}s.direction==="above"?a[d]=l<=p&&f>m:a[d]=l>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function he(e,t={}){let r=me(e);t&&Object.keys(t).length&&(r=xr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(R0(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Ut(r);function u(f,m){let g={};for(let w of o){let E=f.get(w);g[w]=E[m]}let h=w=>w!=null&&g[w]===!0;return{values:g,signals:{entryLong:h(r.rules.entryLong),entryShort:h(r.rules.entryShort),exitLong:h(r.rules.exitLong),exitShort:h(r.rules.exitShort)}}}function d(f,m){P0(f,m,r.market.interval);let g=new Map;for(let h of o)vt(h,n,i,f,m,g);return g}function l(f,m){return u(d(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,g=d(f,m);return Object.freeze(f.map((h,w)=>Object.freeze(u(g,w))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:br,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:p})}var br,kt,T0,N0,At=v(()=>{St();Rc();$c();br=Ii,kt=Pc,T0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),N0=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 $0}from"node:crypto";function q0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function _i(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)_i(t);return Object.freeze(e)}for(let t of Object.keys(e))_i(e[t]);return Object.freeze(e)}function fn(e){if(Array.isArray(e))return e.map(fn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=fn(e[r]);return t}return e}function Oi(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)=>Oi(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Oi(n,`${t}.${r}`)}}function qc(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:o,o:i,h:s,l:a,c,v:u}=n;if(!We(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!We(l))throw new TypeError(`bars[${r}].${d} must be a finite number`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c]])if(!(l>0))throw new TypeError(`bars[${r}].${d} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in n&&n.fundingRate!=null&&!We(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!We(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!We(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function yr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&qc(e),$0("sha256").update(JSON.stringify(fn(e)),"utf8").digest("hex")}function U0(e){if(e==null&&(e={}),!q0(e))throw new TypeError("options must be a plain object");let t={...L0},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(!We(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 o=e[n];if(!We(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}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(!We(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 mn(e){return e/1e4}function B0(e,t,r){let n=mn(r);return t==="long"?e*(1+n):e*(1-n)}function F0(e,t,r){let n=mn(r);return t==="long"?e*(1-n):e*(1+n)}function Lc(e,t,r){let n=Math.abs(e)*mn(t),o=Math.abs(e)*mn(r);return{taker:n,builder:o,total:n+o}}function D0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function M0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function j0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function H0(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function z0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function V0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function W0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Sr(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function G0(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function K0(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function ut(e,t,r={}){let n=U0(r);qc(t);let o=yr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(Sr(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,d=n.takerFeeBps,l=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,g=0,h=0,w=0,E=[],_=[],x=[],O=[],A=[],b=null,y=0,k=null,S=p,R=!1,I=0,P=0,q=[],j=new Array(t.length).fill(0);function X(T){q.push(T)}function B(T){let D=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,D-j[T])}function H(T){if(!b)return p;let D=b.side==="long"?(T-b.entryPrice)*b.qty:(b.entryPrice-T)*b.qty;return p+D}function ie(T,D,$){let ee=$.o,z=D0(p,s);if(!(z>0)||!(ee>0))return;let te=B0(ee,D,u),Q=z/te,se=B(T),ur=te*se;if(Q>se){x.push({kind:"entry",barIndex:T,time:$.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:ur,reason:"volume_participation"});return}j[T]+=Q;let He=Math.abs(te-ee)*Q,Ze=Lc(z,d,l);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,w+=z,b={lifecycleEpoch:++P,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:Q,notionalUsd:z,stop:M0(te,D,s.stopLossPct),take:j0(te,D,s.takeProfitPct),liq:H0(te,D,s.maxLeverage,d+l),entryFees:Ze.taker,entryBuilderFees:Ze.builder,entrySlippageUsd:He,fundingAccrued:0}}function K(T,D,$,ee){if(!b)return!1;let z=b.side,te=D,Q=te;$!=="liquidation"&&ee&&(Q=F0(te,z,u));let se=b.qty,ur=se*Q;if($!=="liquidation"){let La=B(T),Dm=Q*La;if(se>La)return x.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ur,maxFillNotionalUsd:Dm,reason:"volume_participation",triggerReason:$}),!1;j[T]+=se}let He=Lc(ur,d,l),Ze=$==="liquidation"?0:Math.abs(Q-te)*se,lr,Wo;z==="long"?(lr=(te-b.entryReferencePrice)*se,Wo=(Q-b.entryPrice)*se):(lr=(b.entryReferencePrice-te)*se,Wo=(b.entryPrice-Q)*se),p+=Wo,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,w+=ur;let Fm={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:Q,exitReason:$,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:lr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:lr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return E.push(Fm),$==="liquidation"&&_.push({barIndex:T,time:t[T].t,side:z,price:Q,tradeIndex:E.length-1}),b=null,P+=1,I=T+1+(s.cooldownBars||0),!0}function je(T,D,$,ee){let z=T+1;if(z>=t.length)return;q.some(Q=>Q.kind==="exit"&&Q.side===D&&Q.fillBar===z&&Q.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:$,epoch:ee})}function en(T){let D=q.filter($=>$.fillBar===T);for(let $=q.length-1;$>=0;$--)q[$].fillBar===T&&q.splice($,1);D.sort(($,ee)=>{let z=te=>te.kind==="exit"?0:1;return z($)-z(ee)});for(let $ of D)if($.kind==="exit"){if(!b||b.side!==$.side||b.lifecycleEpoch!==$.epoch)continue;let ee=$.reason||"rule";K(T,t[T].o,ee,!0)||je(T,$.side,ee,$.epoch)}else if($.kind==="entry"){if(b||$.epoch!==P||T<I)continue;ie(T,$.side,t[T])}}function tn(T){if(!b)return;let D=t[T],$=D.fundingPaymentRate;if($==null||!We($)||$===0)return;let ee=Math.abs(b.qty*D.c),z=$*ee;b.side==="long"?(p-=z,b.fundingAccrued+=z,g+=z):(p+=z,b.fundingAccrued-=z,g-=z)}function rn(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Ta(T){if(!b)return;let D=t[T],$=b.side,ee=W0(D,$,b.liq),z=z0(D,$,b.stop),te=V0(D,$,b.take),Q=se=>$==="long"?Math.min(se,D.o):Math.max(se,D.o);if(ee){K(T,Q(b.liq),"liquidation",!1);return}if(z&&te){K(T,Q(b.stop),"stop_loss",!0)||je(T,$,"stop_loss",b.lifecycleEpoch);return}if(z){K(T,Q(b.stop),"stop_loss",!0)||je(T,$,"stop_loss",b.lifecycleEpoch);return}te&&(K(T,b.take,"take_profit",!0)||je(T,$,"take_profit",b.lifecycleEpoch))}for(let T=0;T<t.length;T++){let D=Math.floor(t[T].t/864e5);D!==k&&(k=D,S=H(t[T].o),R=!1),rn(T),en(T),Ta(T),tn(T),!R&&H(t[T].c)<=S*(1-s.maxDailyLossPct/100)&&(R=!0,O.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=a[T].signals,ee=T+c;if(b)(b.side==="long"&&$.exitLong===!0||b.side==="short"&&$.exitShort===!0)&&ee<t.length&&(q.some(se=>se.kind==="exit"&&se.side===b.side&&se.fillBar===ee&&se.epoch===b.lifecycleEpoch)||X({kind:"exit",side:b.side,signalBar:T,fillBar:ee,reason:"rule",epoch:b.lifecycleEpoch}));else{let te=$.entryLong===!0,Q=$.entryShort===!0;te&&Q?O.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!R&&(te||Q)&&ee<t.length&&T>=I&&X({kind:"entry",side:te?"long":"short",signalBar:T,fillBar:ee,epoch:P})}let z=p;b&&(y+=1,z=H(t[T].c)),A.push({barIndex:T,time:t[T].t,equity:z,positionSide:b?b.side:null})}let Na=null;if(b){let T=t.length-1;if(K(T,t[T].c,"end_of_data",!0))A[T]={barIndex:T,time:t[T].t,equity:p,positionSide:null};else{let $=H(t[T].c);Na={side:b.side,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,qty:b.qty,notionalUsd:b.notionalUsd,markPrice:t[T].c,markedEquityUsd:$},O.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ra=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Lm=Ra/n.initialEquityUsd*100,Pa=0,jo=0,Ho=0;for(let T of E)T.netPnlUsd>0?(Pa+=1,jo+=T.netPnlUsd):T.netPnlUsd<0&&(Ho+=-T.netPnlUsd);let zo=E.length,qm=zo===0?0:Pa/zo,Vo=0;Ho>0?Vo=jo/Ho:jo>0&&(Vo=1e12);let Um={netPnlUsd:Ra,netPnlPct:Lm,maxDrawdownPct:K0(A),winRate:qm,profitFactor:Vo,tradeCount:zo,sharpe:G0(A),turnoverUsd:w,exposurePct:y/t.length*100},Bm={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},$a={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:br,config:Bm,trades:E,equityCurve:A,metrics:Um,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:_,missedFills:x,openPositionAtEnd:Na,flags:O};return Oi($a),_i(fn($a))}var L0,ln=v(()=>{At();St();L0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as X0}from"node:crypto";function ny(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ci(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ci(t);return Object.freeze(e)}for(let t of Object.keys(e))Ci(e[t]);return Object.freeze(e)}function oy(e){return String(e).trim().replace(/\s+/g," ")}function iy(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function sy(e){for(let r of Q0)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 ay(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 Y0.has(r)?r:null}function cy(e){let t={...Z0},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 o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function uy(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 ly(e){let t=X0("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function dy(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(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function py(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 fy(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 my(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,""):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 o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Uc(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 hy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{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:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let d=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:d,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Uc(a.fast),ema_right_period:Uc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function yy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function gy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bc(e,t={}){if(typeof e!="string")throw new ue("prompt must be a string");if(e.length>1e3)throw new ue("prompt length must be <= 1000");if(!ny(t))throw new ue("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new ue("options.nowMs is required integer epoch ms");let r=t.nowMs,n=ry;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<ey||n>ty)throw new ue("expiresInMs must be between 1h and 30d")}if(J0.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=oy(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(uy(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=iy(o),s=sy(o),a=ay(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=cy(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new ue("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new ue("position size out of range");let u=r+n,d=ly(o),l=`Draft ${s} ${i}`.slice(0,100),p=dy(o),f=py(o),m=fy(o),g=[p,f,m].filter(Boolean);if(g.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!my(o,g[0]))throw new ue(`unsupported or ambiguous prompt. ${jt}`);let h,w=g[0],E={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:d,name:l,spec:w};w.kind==="ema_cross"?h=hy(E):w.kind==="rsi"?h=yy(E):h=gy(E);let _=vi(h,{nowMs:r});if(!_.ok)throw new ue(`draft failed validation: ${_.errors.map(x=>x.message).join("; ")}`);return Ci(me(h,{nowMs:r}))}var ue,Y0,Q0,J0,jt,Z0,ey,ty,ry,Fc=v(()=>{St();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Y0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Q0=new Set(["BTC","ETH","SOL","HYPE"]),J0=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,jt="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]. 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.",Z0=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),ey=36e5,ty=30*864e5,ry=864e5});import{createHash as by}from"node:crypto";function jc(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 Hc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ni(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ni(t);return Object.freeze(e)}for(let t of Object.keys(e))Ni(e[t]);return Object.freeze(e)}function kr(e){if(Array.isArray(e))return e.map(kr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=kr(e[r]);return t}return e}function hn(e){return JSON.stringify(kr(e))}function wy(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function xy(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=hn(n),s=hn(o);return i<s?-1:i>s?1:0}),r}function Ti(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=hn(r),a=hn(o);return s<a}function zc(e,t,r={}){if(!Hc(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(jc(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Dc)throw new TypeError(`maxTrials must be an integer 1..${Dc}`);o=x}let i=r.objective??"netPnlUsd";if(!Mc.has(i))throw new TypeError(`objective must be one of ${[...Mc].join("|")}`);let s=r.backtestOptions??{};if(!Hc(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(jc(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=me(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},d=1;for(let x of c){let O=wy(a.parameters[x]);if(O.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=O,d*=O.length}let l=xy(c,u);if(l.length===0)throw new Error("parameter grid is empty");let p=l.slice(0,o),f=[],m=null,g=null;for(let x of p){let O=xr(a,x),A=ut(O,t,s);g==null&&(g=A.config);let b={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},y={parameters:{...x},metrics:b};f.push(y),(!m||Ti(i,b,x,m.metrics,m.parameters))&&(m=y)}f.sort((x,O)=>Ti(i,x.metrics,x.parameters,O.metrics,O.parameters)?-1:Ti(i,O.metrics,O.parameters,x.metrics,x.parameters)?1:0);let h={...m.parameters},w=xr(a,h),E={strategyHash:Ut(a),compilerHash:kt,trainBarsHash:yr(t),backtestConfig:g,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:w},_={id:by("sha256").update(JSON.stringify(kr(E)),"utf8").digest("hex"),...E};return Ni(kr(JSON.parse(JSON.stringify(_))))}var Dc,Mc,Vc=v(()=>{At();St();ln();Dc=256,Mc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import yn from"node:path";function gn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Sy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ht(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ht(r,`${t}[${n}]`));return}if(gn(e))for(let[r,n]of Object.entries(e)){let o=Sy(r);if(Ey.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function ky(e){if(typeof e!="string"||!e||!yn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Wc(e){let t;try{t=et.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 Ay(){return{version:Pi,runners:[]}}function Gc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!gn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Pi)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 Ht(r,yn.basename(t)),{version:Pi,runners:r.runners.map(n=>Ge(n))}}function Kc(e,t){Ht(t,"store");let r=yn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=yn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
+
`;try{et.writeFileSync(n,o,{mode:384,flag:"wx"}),et.renameSync(n,e);try{et.chmodSync(e,384)}catch{}}catch(i){try{et.unlinkSync(n)}catch{}throw i}}function Xc(e={}){let t=e.path;if(ky(t),Wc(t),et.existsSync(t)?Gc(et.readFileSync(t,"utf8"),t):Kc(t,Ay()),Ri.has(t))return Ri.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let g=m.fn();r=!1,m.resolve(g),o()}catch(g){r=!1,m.reject(g),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((g,h)=>{n.push({fn:m,resolve:g,reject:h}),queueMicrotask(o)})}function s(){return Wc(t),Gc(et.readFileSync(t,"utf8"),t)}function a(m){Kc(t,m)}function c(m){if(!gn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Ht(m,"record");let g=s();if(g.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=Ge(m);return g.runners.push(h),a(g),Ge(h)}function u(m){let g=s().runners.find(h=>h.id===m);return g?Ge(g):null}function d(){return s().runners.map(m=>Ge(m))}function l(m,g){if(typeof g!="function")throw new Error("shadow-store: updater must be a function");let h=s(),w=h.runners.findIndex(x=>x.id===m);if(w<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=Ge(h.runners[w]),_=g(E);if(!gn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Ht(_,"record"),h.runners[w]=Ge(_),a(h),Ge(h.runners[w])}function p(m){let g=s(),h=g.runners.findIndex(E=>E.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=Ge(g.runners[h]);return w.status!=="stopped"&&(w.status="stopped",g.runners[h]=w,a(g)),Ge(g.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return d()},update(m,g){return i(()=>l(m,g))},stop(m){return i(()=>p(m))}};return Ri.set(t,f),f}var Pi,Ey,Ri,Yc=v(()=>{Pi=1,Ey=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Ri=new Map});import{createHash as qi}from"node:crypto";function $i(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Li(e){return Array.isArray(e)?e.map(Li):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Li(e[t])])):e}function Jc(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return qi("sha256").update(JSON.stringify(Li(e))).digest("hex")}function vy(e,t,r,n,o){return qi("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Iy(e,t,r,n){return qi("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function _y(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Qc(e){return e==="entryLong"||e==="entryShort"}function Ui({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Xc({path:e});function n({strategy:c,evidenceId:u=null}={}){let d=he(c),l=u==null?null:String(u),p=r.list().filter(w=>w.status==="running"&&w.strategyHash===d.strategyHash&&w.compilerHash===d.compilerHash&&w.evidenceId===l).sort((w,E)=>w.createdAt-E.createdAt||w.id.localeCompare(E.id))[0];if(p)return $i(p);let f=t(),m=Iy(f,d.strategyHash,d.compilerHash,l),g=r.get(m);if(g)return $i(g);let h={id:m,strategy:$i(d.strategy),strategyHash:d.strategyHash,compilerHash:d.compilerHash,evidenceId:l,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(h)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.stop(c)}function a(c,u,{markoutHorizons:d=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,l=>{if(l.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return l;let f=he(l.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let g=l.cursor,h=[];for(let I=0;I<u.length;I++){let P=u[I].t;(g==null||P>g)&&h.push(I)}if(h.length===0)return l;let w=new Map(l.intendedOrders.map(I=>[I.id,I])),E=new Set(l.fills.map(I=>I.orderId)),_=new Map(l.missedFills.map(I=>[I.orderId,I])),x=(I,P)=>`${I}|${P}`,O=new Map(l.markouts.map(I=>[x(I.orderId,I.horizon),I])),A=l.position?{...l.position}:null,b=Number.isInteger(l.cooldownBarsRemaining)?Math.max(0,l.cooldownBarsRemaining):0,y=Number.isFinite(l.cooldownStartT)?l.cooldownStartT:null;function k({action:I,signalBarT:P,signalIndex:q}){let j=_y(I),X=vy(l.id,l.strategyHash,P,j,I);if(w.has(X))return w.get(X);let B=q+1,H=B<u.length,ie={id:X,action:I,type:I,side:j,signalBarT:P,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return w.set(X,ie),l.intendedOrders.push(ie),ie}function S(I,P,q){if(E.has(I.id))return;let j={orderId:I.id,action:Qc(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:q};if(l.fills.push(j),E.add(I.id),I.status="filled",I.fillBarT=P.t,_.has(I.id)&&(_.delete(I.id),l.missedFills=l.missedFills.filter(X=>X.orderId!==I.id)),Qc(I.action)){A={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:q};for(let X of d){let B=x(I.id,X);if(O.has(B))continue;let H={orderId:I.id,horizon:X,entryBarT:P.t,entryPrice:P.o,side:A.side,status:"pending",close:null,barT:null};O.set(B,H),l.markouts.push(H)}}else A=null,b=Number(l.strategy?.risk?.cooldownBars)||0,y=P.t}function R(I){if(E.has(I.id)||_.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,P),l.missedFills.push(P),I.status="missed"}for(let I of l.intendedOrders){if(I.status==="filled"||E.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let q=P+1;q<u.length&&(g==null||u[q].t>g)&&S(I,u[q],q)}for(let I of h){let P=u[I],q=f[I].signals,j=A,X=H=>{if(A||b>0&&(y==null||P.t>=y))return;let K=k({action:H,signalBarT:P.t,signalIndex:I}),je=I+1;je<u.length?S(K,u[je],je):R(K)},B=H=>{if(!A||A.side==="long"&&H!=="exitLong"||A.side==="short"&&H!=="exitShort")return;let ie=k({action:H,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?S(ie,u[K],K):R(ie)};j?(q.exitLong&&B("exitLong"),q.exitShort&&B("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&X("entryLong"),q.entryShort&&X("entryShort")),b>0&&y!=null&&P.t>=y&&(b-=1,b===0&&(y=null)),l.cursor=P.t,l.lastProcessedBarIndex=I}for(let I of l.markouts){if(I.status!=="pending")continue;let P=l.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!P)continue;let q=m.get(P.barT);if(q==null)continue;let j=q+I.horizon;if(j<u.length){I.close=u[j].c,I.barT=u[j].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return l.position=A,l.cooldownBarsRemaining=b,l.cooldownStartT=y,l.updatedAt=t(),l})}return{start:n,step:a,list:i,get:o,stop:s}}var Zc=v(()=>{At();Yc()});var ru={};M(ru,{runStrategyOperation:()=>Ly});import Oy from"node:os";import Cy from"node:path";function Ar(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ny(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Fi(e){if(Array.isArray(e)){for(let t of e)Fi(t);return}if(Ar(e))for(let[t,r]of Object.entries(e)){if(Ty.some(n=>Ny(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Fi(r)}}function Ry(e){if(!Ar(e))throw new TypeError("strategy input must be a plain object");return Fi(e),e}function Py(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 Bi(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=gi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);r.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Di(e,t){let r=e.backtestOptions??{};if(!Ar(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function eu(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Ar(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:Di(e,n)}}function tu(){return Cy.join(Oy.homedir(),".oracle","strategy-shadow.json")}function $y(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 Ly(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Ry(t),o=Py(n,r);if(e==="draft")return{strategy:Bc(n.prompt,{nowMs:o})};if(e==="validate"){let i=he(n.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Sr(i,s);let a=di(eu(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ut(i.strategy,s,Di(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Sr(i,s);let a=n.trainFraction,c=n.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let d=s.slice(0,Math.floor(s.length*u)),l=n.options??{};if(!Ar(l))throw new TypeError("options must be a plain object");let p=zc(i.strategy,d,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Di(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:di(eu(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ui({storePath:r.storePath??tu(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await Bi(a.strategy,n,r,o);return Sr(he(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=he(n.strategy),s=gi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ui({storePath:r.storePath??tu(),clock:()=>o}).get(n.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??$y(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Jc(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Ty,nu=v(()=>{ln();At();pi();Fc();Vc();Zc();bi();Ty=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var yu={};M(yu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>lu,DEFAULT_SAME_CHAIN_SOURCES:()=>uu,NATIVE_TOKEN:()=>Mi,canonicalJson:()=>pu,hashFirmQuote:()=>hu,hashRfqIntent:()=>mu,normalizeFirmQuote:()=>Hi,normalizeRfqIntent:()=>My,sha256Hex:()=>vr});import{createHash as qy}from"node:crypto";import{getAddress as cu,isAddress as ji}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function iu(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function bn(e,t){let r=String(e??"").trim();return(!Uy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function By(e,t){return e==null||e===""?null:bn(e,t)}function su(e,t){let r=String(e??"").trim();return r.toLowerCase()===Mi.toLowerCase()?Mi:(ji(r)||re(t,"must be an EVM address or native token sentinel"),cu(r))}function du(e,t){let r=String(e??"").trim();return ji(r)||re(t,"must be an EVM address"),cu(r)}function Fy(e,t){return e==null||e===""?null:du(e,t)}function au(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function Dy(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function zt(e){if(Array.isArray(e))return e.map(zt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=zt(e[r]));return t}return e}function pu(e){return JSON.stringify(zt(e))}function vr(e){return`0x${qy("sha256").update(pu(e)).digest("hex")}`}function fu(e,t){let r={...e};for(let n of t)delete r[n];return r}function mu(e){return vr(fu(e,["intentHash"]))}function hu(e){return vr(fu(e,["firmQuoteHash"]))}function My(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=iu(e.fromChainId??e.fromChain,"fromChainId"),i=iu(e.toChainId??e.toChain,"toChainId"),a=o===i?uu:lu,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:su(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:su(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:bn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:du(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Dy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:By(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:au(e.allowedSources,"allowedSources",a),allowedRouters:au(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?zt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):vr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=mu(c),Object.freeze(c)}function jy(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!ou.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ou.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!ji(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),zt(e)}function Hi(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=bn(t.amountOut??t.buyAmount,"amountOut"),a=bn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=jy(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let d=Fy(t.router??t.settlementRouter??c.to,"router"),l={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:d,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(u),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?zt(t.metadata):{}};return l.quoteId||(l.quoteId=vr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=hu(l),Object.freeze(l)}var Mi,uu,lu,ou,Uy,zi=v(()=>{Mi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",uu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),lu=Object.freeze(["lifi"]),ou=/^0x[0-9a-fA-F]{64}$/,Uy=/^\d+$/});import{readFileSync as Hy}from"node:fs";import{homedir as zy}from"node:os";import{join as wn}from"node:path";function Vy(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=zy();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||wn(t,".config","oracle")).trim();return[e,wn(r,"exec.env")].filter(Boolean)}return[e,wn(t,".config","oracle","exec.env"),wn(t,".config","mad-desk","exec.env")].filter(Boolean)}function gu(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Vy())try{let i=Hy(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var bu=v(()=>{});var wu=v(()=>{});import{createHash as Wy,createHmac as Eu,timingSafeEqual as Gy}from"node:crypto";function xn(e){return Array.isArray(e)?`[${e.map(xn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Su(e,{required:t=!1}={}){try{return gu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Wi(e){let{signature:t,...r}=e;return r}function ku(e,{secret:t}={}){let r=Su(t);return r?{...e,signature:Eu("sha256",r).update(xn(Wi(e))).digest("hex")}:e}function Ky(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return Wy("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ke(e,{chainId:t,venue:r,data:n,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Su(o);if(i){let f=Eu("sha256",i).update(xn(Wi(e))).digest("hex");if(!Xy(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>tt||!Number.isInteger(a)||a<0||a>tt||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let d=c*BigInt(1e4-s),l=d/10000n;if(d%10000n!==0n&&(l+=1n),u<l)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=Qy(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return ku({...Wi(e),calldataHash:Ky(n)},{secret:o})}function Xy(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:Gy(r,n)}function Vi(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Yy(e){let t=e==null?tt:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,tt)}function rt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=Vi(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(Vi(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Vi(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),d=Yy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,d),capBps:d,executable:u<=d}}function Gi({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=xu,secret:d}={}){let l=BigInt(r??0);if(l<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=rt({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||xu)),g=l*BigInt(1e4-p.selectedBps),h=g/10000n;if(g%10000n!==0n&&(h+=1n),h>l&&(h=l),l>0n&&h<=0n)throw new Error(`auto-slippage: quote ${l} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let w=Number((l-h)*10000n/(l===0n?1n:l));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ku({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:l.toString(),minAmountOut:h.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:d})}function Qy(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let d=Gi({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:d,amountOutMinimum:d.minAmountOut}}var tt,xu,Re=v(()=>{bu();wu();tt=100,xu=2e4});function Ki(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:pt}var pt,En=v(()=>{pt="0x000000000000000000000000000000000000dEaD"});import{Contract as Jy,JsonRpcProvider as Zy}from"ethers";function ig(e){return og.test(String(e||""))}async function Au(e,{contract:t=eg,rpc:r=rg,chainId:n=tg,balanceOf:o}={}){if(!ig(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Zy(r,n,{staticNetwork:!0}),s=new Jy(t,ng,i);return BigInt(await s.balanceOf(e))}var eg,tg,rg,ng,og,vu=v(()=>{eg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",tg=999,rg="https://rpc.hyperliquid.xyz/evm",ng=["function balanceOf(address owner) view returns (uint256)"],og=/^0x[a-fA-F0-9]{40}$/});import{existsSync as sg,readFileSync as ag,lstatSync as cg}from"node:fs";import{homedir as Iu}from"node:os";import{join as Xi}from"node:path";function dg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(_u,t)?_u[t]:lg}function yg(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Ou])return String(e[Ou]);let t=e.ORACLE_CONFIG_DIR||Xi(Iu(),".config","oracle");return Xi(t,"fee-recipient")}return Xi(Iu(),".config","oracle","fee-recipient")}function gg(e=process.env){try{let t=yg(e);if(!sg(t)||cg(t).isSymbolicLink())return"";let r=ag(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function bg(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),ug)}function wg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[fg]||"").trim(),o=String(e[mg]||hg).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=dg(t),s=bg(e[pg],{fallback:n?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=gg(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function Sn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=wg({env:t,action:r,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Au(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Cu(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function Tu(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Nu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var ug,lg,_u,pg,fg,mg,Ou,hg,kn=v(()=>{vu();ug=100,lg=5,_u=Object.freeze({swap:5,bridge:5,perps:0,nft:0});pg="ORACLE_INTEGRATOR_FEE_BPS",fg="ORACLE_INTEGRATOR_FEE_RECIPIENT",mg="ORACLE_INTEGRATOR_ID",Ou="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",hg="oracle"});var Ji={};M(Ji,{LIFI_API:()=>Pu,lifiChains:()=>Ag,lifiHealth:()=>Sg,lifiPrepare:()=>kg,lifiQuote:()=>It});function Qi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Pu).replace(/\/$/,"")}function Eg(e){let t=String(e||Yi).toLowerCase();return t===Yi.toLowerCase()||t===xg}function Ru(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function Sg(e={}){let t=await N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function It(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=Yi,toToken:i,fromAmount:s,fromAddress:a=pt}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let d=await Sn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Tu(d)))c.set(h,w);let l=await N(`${Qi(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=l?.estimate?.toAmount||l?.toAmount;if(!p)return{...l,autoSlippagePolicy:u,oracleFee:d};let f=l?.transactionRequest?.to||l?.estimate?.approvalAddress||"lifi",m=ae(l,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),g=l?.estimate?.toAmountMin||l?.toAmountMin;if(g!=null&&BigInt(g)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:d}}async function kg(e={},t={}){let r=await It(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Eg(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:Ru(a,"approval token"),spender:Ru(s,"approval spender"),amount:String(e.fromAmount)}}return J({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Ag(e={}){return N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Pu,Yi,xg,Ir=v(()=>{W();Re();En();ge();kn();Pu="https://li.quest/v1";Yi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",xg="0x0000000000000000000000000000000000000000"});var qu={};M(qu,{PARASWAP_API:()=>$u,paraswapHealth:()=>Ig,paraswapPrepare:()=>vg,paraswapPrice:()=>Wt,paraswapTokens:()=>Lu});function Vt(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Lu(e={},t={}){let r=Number(e.chainId||1);return N(`${Zi(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await Sn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Nu(o)))n.set(a,c);let i=await N(`${Zi(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function vg(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=Vt(e.userAddress,"userAddress"),o=await Wt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Vt(e.receiver,"receiver"));let c=await N(`${Zi(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return J({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:ke(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Ig(e={}){let t=await Lu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var $u,Zi,An=v(()=>{W();Re();ge();kn();$u="https://api.paraswap.io",Zi=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||$u).replace(/\/$/,"")});function vn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Bu(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Bu(t),...r]).has(c)){let d=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!d?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Uu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Uu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Bu(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function In(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var Uu,es=v(()=>{Uu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var zu={};M(zu,{ZEROX_API:()=>Fu,zeroxHealth:()=>_g,zeroxPrepare:()=>Og,zeroxPrice:()=>Hu,zeroxQuote:()=>Gt});function Du(e={}){return vn({provider:"zerox",defaultUrl:Fu,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Mu(e={}){return Du(e).baseUrl}function _n(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function ju(e={}){return In({"0x-version":"v2",accept:"application/json"},{"0x-api-key":_n(e)},Du(e).trusted)}async function _g(e={}){if(!_n(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Hu({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Hu(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),N(`${Mu(t)}/swap/allowance-holder/price?${a}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await N(`${Mu(t)}/swap/allowance-holder/quote?${c}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.buyAmount||u?.grossBuyAmount;return d?ae(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Og(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await Gt(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return J({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Fu,On=v(()=>{W();Re();es();ge();Fu="https://api.0x.org"});var Zv,Vu=v(()=>{Zv=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Cn from"node:fs";import Cg from"node:os";import Xt from"node:path";import{fileURLToPath as Tg}from"node:url";function Wu(){return process.env.ORACLE_FAKE_HOME||Cg.homedir()}function Rg(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Tn(){return Rg()?process.env.ORACLE_CONFIG_DIR||Xt.join(Wu(),".config","oracle"):Xt.join(Wu(),".config","oracle")}function Pg(){return Xt.join(Tn(),"desk.json")}function $g(){return Xt.join(Tn(),"env")}function Kt({force:e=!1}={}){if(Kt._done&&!e)return Kt._result||null;Kt._done=!0;let t={},r=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=$g();if(Cn.existsSync(o))for(let i of Cn.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let o=Pg();if(Cn.existsSync(o)){let i=JSON.parse(Cn.readFileSync(o,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),Kt._result=Object.keys(t).length?t:null,Kt._result}var Ng,iI,Gu=v(()=>{Ng=Xt.dirname(Tg(import.meta.url)),iI=Xt.resolve(Ng,"../..");try{Kt()}catch{}});var Yu={};M(Yu,{armPreparedAction:()=>jg,callSigner:()=>Ku,queueOwnerAction:()=>Xu});import{existsSync as Lg,readFileSync as qg}from"node:fs";import{request as Ug}from"node:http";import Bg from"node:path";function Dg(e=process.env){let t=String(e.ORACLE_SIGNER_URL||Fg).replace(/\/$/,""),r;try{r=new URL(t)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function Mg(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Bg.join(Tn(),"signer","signer-token");return Lg(t)?qg(t,"utf8").trim():null}function Ku(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=Dg(n),s=Mg(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=r?Buffer.from(JSON.stringify(r)):null,d=Ug({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...u?{"content-type":"application/json","content-length":u.length}:{}}},l=>{let p=[];l.on("data",f=>p.push(f)),l.on("end",()=>{let f=Buffer.concat(p).toString("utf8"),m={};try{m=f?JSON.parse(f):{}}catch{m={error:"signer refused"}}a({httpStatus:l.statusCode,...m})})});d.on("timeout",()=>{d.destroy(),a({ok:!1,error:"local signer timed out"})}),d.on("error",()=>a({ok:!1,error:"local signer is not running"})),u&&d.write(u),d.end()})}async function Xu(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Ku("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function jg(e,t=process.env){let r=e?.localSignerEnvelope||e?.envelope;if(!r||r.version!==1||!r.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Xu(r,t)}var Fg,Qu=v(()=>{Gu();Fg="http://127.0.0.1:9462"});var sl={};M(sl,{COW_CANCEL_TYPES:()=>tl,COW_HOSTS:()=>Rn,COW_ORDER_TYPES:()=>Nn,COW_SETTLEMENT:()=>Ju,COW_VAULT_RELAYER:()=>Zu,armCowOrder:()=>Xg,buildArmedCowOrder:()=>os,cowCancelOrders:()=>tb,cowChains:()=>ob,cowHealth:()=>Gg,cowOrder:()=>il,cowOrderStatus:()=>ol,cowOrderUid:()=>Yg,cowPrepareCancel:()=>Zg,cowPrepareOrder:()=>Kg,cowQuote:()=>_t,cowSignCancel:()=>eb,cowSignOrder:()=>Qg,cowSubmitSignedOrder:()=>Jg,cowVerifyOrderFill:()=>nb});import{TypedDataEncoder as rs,getAddress as _r,isAddress as Hg}from"ethers";function Pn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Rn[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function zg(e,t="v1",r={}){let n=Pn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function nt(e,t){let r=String(e||"").trim();if(!Hg(r))throw new Error(`cowswap: ${t} must be an address`);return _r(r).toLowerCase()}function Yt(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function rl(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function nl(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Vg({digest:e,owner:t,validTo:r}={}){let n=rl(e,"order digest").slice(2),o=nt(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function ns(e){let t=Ju[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:_r(t)}}function Wg(e={},t,r){let n=nt(e.sellToken,"sellToken"),o=nt(e.buyToken,"buyToken"),i=nt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=rl(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Yt(e.sellAmount,"sellAmount"),buyAmount:Yt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Yt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Gg(e={}){try{let t=await _t({chainId:1,sellToken:ts[1],buyToken:el[1],sellAmountBeforeFee:"1000000000000000",from:pt},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function _t(e={},t={}){let r=Number(e.chainId??1),n=Ki(e.from||e.owner),o=e.sellToken||ts[r],i=e.buyToken||el[r],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ts[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await N(`${Pn(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Kg(e={},t={}){let r=Number(e.chainId??1),n=nt(Ki(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Wg(o?.quote||o,r,n),s=ns(r),a={domain:s,types:Nn,primaryType:"Order",message:i},c=rs.hash(s,Nn,i),u=Zu[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return J({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:_r(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:os({chainId:r,owner:n,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function os(e={},t={}){let r=e.typedData;if(!r?.domain||!r?.types||!r?.message)throw new Error("cowswap: typedData required to arm");let n=Number(e.chainId??r.domain.chainId),o=Rn[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=nt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=rs.hash(r.domain,r.types,r.message);return Object.freeze({tradeId:`cow:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:n,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:n,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:r.domain,types:r.types,message:r.message,typedData:r})})}async function Xg(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Qu(),Yu)),n=e.localSignerEnvelope||os(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function ol(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${Pn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function il(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${Pn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Yg(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||rs.hash(ns(r),Nn,n),i=e.owner||e.from||e.signer||n.receiver;return Vg({digest:o,owner:i,validTo:n.validTo})}async function Qg(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function Jg(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function Zg(e={}){let t=Number(e.chainId??1),r=nt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>nl(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=ns(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:tl,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function eb(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function tb(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function rb(e={}){return Yt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function nb(e={},t={}){let r=Number(e.chainId??1),n=nl(e.uid||e.orderUid),o=t.order||await il({chainId:r,uid:n},t),i=t.status||o.status||await ol({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${zg(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?nt(e.expectedOwner,"expectedOwner"):null;if(c&&nt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(rb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Yt(o.executedBuyAmount,"executedBuyAmount")));let d=e.minBuyAmount!=null?BigInt(Yt(e.minBuyAmount,"minBuyAmount")):0n,l=u>=d&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:l,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:l?null:"insufficient fill or expired order"}}function ob(){return Object.keys(Rn).map(Number)}var Rn,Ju,Zu,ts,el,Nn,tl,$n=v(()=>{W();Re();Vu();En();ge();Rn={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Ju=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zu=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ts={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},el={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Nn=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),tl=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var cl={};M(cl,{CHAINS:()=>Ln,chainById:()=>ss,isSupportedChain:()=>al,registerChain:()=>ib,rpcUrlFor:()=>as});function ss(e){return is.get(Number(e))||null}function ib({key:e,chainId:t,name:r,rpcEnv:n=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:r||e,rpcEnv:n,evm:!0};return Ln[e]=o,is.set(o.chainId,o),o}function as(e,t=process.env){let r=ss(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function al(e){return is.has(Number(e))}var Ln,is,cs=v(()=>{Ln={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},is=new Map(Object.values(Ln).map(e=>[e.chainId,e]))});import{Interface as sb,getAddress as ab}from"ethers";function Or(e,t){try{return ab(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ub(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=as(e,r);return n||cb[Number(e)]||null}function db(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!lb.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function Y(e,t,r=[],n={}){let o=String(t||"");db(o);let i=ub(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function Un(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ul(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function ll(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function dl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.owner,"owner"),i=Or(e.spender,"spender"),s=qn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=qn.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function pl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.account||e.owner||e.address,"account"),i=qn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=qn.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var qn,cb,lb,ot=v(()=>{W();cs();qn=new sb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);cb={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};lb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function fl(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Bn(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let d=fl(o,c),l=String(d.address||"").toLowerCase(),p=String(d.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,g=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(l)||pb.has(p)?h=300:s&&l===s&&(h=100),g.includes("v4")?h+=20:g.includes("v3")?h+=10:(g.includes("v2")||g.includes("raydium")||g.includes("orca")||g.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:l,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function ml(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&fl(e,r[0]).address||null}var pb,us=v(()=>{pb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function yb(e,t,r){let n=Pe(t),o=Pe(r),i=Pe(e?.baseToken?.address),s=Pe(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function gb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function bb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||fb).replace(/\/$/,"")}async function Fn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${bb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hl({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=Pe(mb[Number(e)]||e),s=new Set(hb(n).filter(Boolean).map(Pe)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Fn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,d=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${Pe(f?.chainId)}:${Pe(f?.dexId)}:${Pe(f?.pairAddress)}`;u.has(m)||(u.add(m),d.push(f))}return d.filter(p=>Pe(p?.chainId)===i).filter(p=>yb(p,t,r)).filter(p=>!s.size||s.has(Pe(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:gb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function yl(e,{chainSlug:t="solana",stables:r=wb}={},n={}){let o=await Fn(e,n),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Bn(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var fb,mb,Pe,hb,wb,Tr=v(()=>{W();us();fb="https://api.dexscreener.com",mb=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Pe=e=>String(e??"").toLowerCase(),hb=e=>Array.isArray(e)?e:e==null?[]:[e];wb=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var vl={};M(vl,{PANCAKE_FEE_TIERS:()=>Dn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>xl,UNI_V3_VENUES:()=>kl,uniV3Chains:()=>Ib,uniV3EthUsdc:()=>Al,uniV3Health:()=>vb,uniV3PrepareExactIn:()=>Ab,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>kb});import{Interface as bl,getAddress as Nr,isAddress as wl}from"ethers";function ds(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=kl[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ls(e,t){let r=be[Number(t)];if(!e||e===El||e===Sl||/^eth$/i.test(String(e)))return Nr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Nr(r.weth);if(/^usdc$/i.test(n))return Nr(r.usdc);if(!wl(n))throw new Error(`invalid token address: ${e}`);return Nr(n)}function Eb(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function Sb(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function Ot(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=ds(e.chainId??8453,e.venue),s=ls(e.tokenIn||"WETH",r),a=ls(e.tokenOut||be[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:xl,d=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],l=[],p=null;for(let A of d){let b=Mn.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let y=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!y||y==="0x"){l.push({fee:A,ok:!1,error:"empty result"});continue}let k=Mn.decodeFunctionResult("quoteExactInputSingle",y),S={fee:A,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};l.push(S),(!p||BigInt(S.amountOut)>BigInt(p.amountOut))&&(p=S)}catch(y){l.push({fee:A,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let A=l.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${A}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:Eb(e.venue)},t).catch(()=>[]):[],m={};for(let A of f.slice(0,8))if(!(!A.pairAddress||!wl(A.pairAddress)))try{let b=await Y(r,"eth_call",[{to:A.pairAddress,data:xb},"latest"],t),y=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(y)||y<=0||y>1e6)continue;(m[y]==null||A.liquidityUsd>m[y].liquidityUsd)&&(m[y]=A)}catch{}let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),h=null;if(e.fee==null&&g>0&&BigInt(p.amountOut)>0n){let A=BigInt(p.amountOut),y=l.filter(k=>k.ok&&Number((A-BigInt(k.amountOut))*10000n/A)<=g).filter(k=>m[k.fee]?.liquidityUsd!=null).sort((k,S)=>m[S.fee].liquidityUsd-m[k.fee].liquidityUsd)[0];y&&y.fee!==p.fee&&(h={priceBestFee:p.fee,chosenFee:y.fee,chosenPoolUsd:m[y.fee].liquidityUsd,bandBps:g},p=y)}let w=m[p.fee]??null,E=f[0]??null,_=w??E,x=e.liquidityUsd??w?.liquidityUsd??E?.liquidityUsd??null,O=e.liquidityUsd!=null?"caller":w?"pool":E?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:_,liquidityAttribution:O,liquidityPick:h,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:l,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function kb(e={},t={}){let{chainId:r,quoter:n,router:o}=ds(e.chainId??8453),i=(e.tokens||[]).map(p=>ls(p,r)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Sb(i,s),u=Mn.encodeFunctionData("quoteExactInput",[c,a]),d=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),l=Mn.decodeFunctionResult("quoteExactInput",d);return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:l[0].toString(),gasEstimate:l[3].toString()},{chainId:r,venue:o,amountOut:l[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Al(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Ot({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Ab(e={},t={}){let r=Number(e.chainId??8453),n=ds(r,e.venue),o=Nr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===El||i===Sl||/^eth$/i.test(i),a=await Ot(e,t),c=gl.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),l=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=gl.encodeFunctionData("multicall",[l,[c]]);return J({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:l,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:ke(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function vb(e={}){let t=Number(e.chainId??8453);try{let r=await Al({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function Ib(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,xl,xb,Mn,gl,El,Sl,Dn,kl,jn=v(()=>{ot();Tr();Re();ge();be={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},xl=[100,500,3e3,1e4],xb="0xddca3f43",Mn=new bl(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),gl=new bl(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),El="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Sl="0x0000000000000000000000000000000000000000",Dn=[100,500,2500,1e4],kl={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Tl={};M(Tl,{executeRfqCandidates:()=>Ol,rankRfqQuotes:()=>Cl,requestRfqQuotes:()=>Cb,sourceCandidates:()=>_l});function Rr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Il(e,t){return String(e?.[t]??"").trim()}function Pr(e,t){return Object.freeze({source:e,run:t})}function _l(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Rr(e,"lifi")&&s.push(Pr("lifi",async()=>{let c=await(n.lifiQuote??It)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),u=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:u?.toAmount??c?.toAmount,minBuyAmount:u?.toAmountMin??c?.toAmountMin??u?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await _b(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Rr(e,"paraswap")&&s.push(Pr("paraswap",async()=>{let c=await(n.paraswapPrice??Wt)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),Rr(e,"0x")&&(Il(r,"ZEROX_API_KEY")||Il(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Pr("0x",async()=>{let c=await(n.zeroxQuote??Gt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Rr(e,"cow")&&s.push(Pr("cow",async()=>{let c=await(n.cowQuote??_t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Rr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Pr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??Ot)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function _b(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Ob(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Ol(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Ob(a,n))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(Hi(e,{...u.value,source:c.source},r))}catch(d){s.push({source:c.source,error:String(d?.message||d)})}}return{quotes:i,failed:s}}function Cl(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Cb(e,t={}){let r=_l(e,t),{quotes:n,failed:o}=await Ol(e,r,t),i=Cl(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Nl=v(()=>{Ir();An();On();$n();jn();zi()});function Rl(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Tb.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||r.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))Qt.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Pl(e){let{ok:t,errors:r,warnings:n}=Rl(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
5
|
- ${r.join(`
|
|
6
|
-
- `)}`);let o=e.capabilities||{},i=dr.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:dr.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of dr)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function co(e){let t=Pd(e);return pr.set(t.chainId,t),t}function Ds(e){return pr.get(Number(e))||null}function Ld(){return[...pr.values()]}function $b(){pr.clear()}function Bb(){let e={};for(let t of pr.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:pr.size,capabilities:[...dr],chains:e}}var dr,B,$,Lb,pr,wt=S(()=>{dr=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),B=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),$=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Lb=/^0x[0-9a-fA-F]{40}$/;pr=new Map});function $d(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:l=!1,meta:d={}}=e||{};if(u||r==null)return{source:t,quality:Be.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Xr(r);if(p==null||p<=0n)return{source:t,quality:Be.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Be.NO_GAS:Be.FULL,amountOut:p.toString(),minOut:Xr(n)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:l,meta:d}}async function qd(e,t,{divisor:r=1000n}={}){let n=Xr(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=Xr(i),c=Xr(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),l=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(l)||u<=0?null:{impactPct:(1-l/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function Fd(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:n,impactUnmeasured:o,warnings:s}}function Us(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(E=>E.quality!==Be.FAILED),c=e.filter(E=>E.quality===Be.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,l=Number(i),d=Number(s),p=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,f=a.map(E=>{let A=BigInt(E.amountOut),v=0n,R=!1,I=!1,P=BigInt(E.oracleFeeBps??0),D=P>0n?A*P/10000n:0n;if(u){let q=E.gasUsd,j=Number(E.meta?.gasUnits??E.estimatedGas);if(q==null&&p&&Number.isFinite(j)&&j>0){let K=j*l/1e18*d;Number.isFinite(K)&&K>=0&&(q=K,I=!0)}let se=(q??0)+(E.feeUsd??0);if(se>0){let K=se/t*10**r;Number.isFinite(K)&&K>=0&&(v=BigInt(Math.floor(K)),R=!0)}else q===0&&(R=!0)}let V=v+D,Y=A>V?A-V:0n;return{...E,grossOut:A.toString(),netOut:Y.toString(),costInDest:v.toString(),oracleFeeInDest:D.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,w=f.reduce((E,A)=>BigInt(A.netOut)>E?BigInt(A.netOut):E,0n),g=E=>w>0n?Number((w-BigInt(E))*10000n/w):0,y=[],b=f.slice().sort((E,A)=>BigInt(A.netOut)>BigInt(E.netOut)?1:-1)[0]??null;f.sort((E,A)=>{let v=g(E.netOut)<=m?0:1,R=g(A.netOut)<=m?0:1;if(n&&m>0&&v!==R)return v-R;if(n&&m>0){let I=E.liquidityUsd??-1,P=A.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(A.netOut)>BigInt(E.netOut)?1:-1}),n&&m>0&&b&&f[0]&&f[0].source!==b.source&&y.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${b.source} within ${m} bps`);let T=f.filter(E=>!E.costAccounted).map(E=>E.source);u?T.length&&y.push(`gas not reported by: ${T.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):y.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let E=f.find(A=>A.costAccounted&&g(A.netOut)<=m);E&&y.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${E.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let _=f.filter(E=>E.gasEstimated).map(E=>E.source);_.length&&y.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${_.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let k=null,h=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let E=BigInt(f[0].netOut),A=BigInt(f[1].netOut);A>0n&&(k=Number((E-A)*10000n/A),h=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:k,spreadBasis:h,rankedOn:u?"net-of-cost":"gross",warnings:y}}async function uo(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?$d({source:s,error:String(o.reason?.message||o.reason)}):$d({source:s,...o.value})})}var Be,Bd,Xr,Ms=S(()=>{wt();Be=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Bd={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Xr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Dd(e={}){return Gn({provider:"oneinch",defaultUrl:qb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Fb(e={}){return Dd(e).baseUrl}function Ud(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Db(e={}){let t=Ud(e);return Jn({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Dd(e).trusted)}async function Md(e={},t={}){if(!Ud(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await N(`${Fb(t)}/${r}/quote?${s}`,{headers:Db(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ce(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var qb,jd=S(()=>{W();ke();Ts();ge();qb="https://api.1inch.dev/swap/v6.0"});var Vd={};M(Vd,{UNI_V4_CHAINS:()=>qe,UNI_V4_FEE_TIERS:()=>zs,computeV4PoolId:()=>fo,decodeV4HookPermissions:()=>Ws,uniV4Chains:()=>Qb,uniV4Health:()=>Zb,uniV4InspectHook:()=>Kb,uniV4PrepareExactIn:()=>Xb,uniV4QuoteExactIn:()=>mo,uniV4QuoteExactOut:()=>Yb});import{AbiCoder as Ub,Interface as js,getAddress as Qe,isAddress as Hs,keccak256 as Mb}from"ethers";function Ws(e){let t=tn(e),r=Number(BigInt(t)&Hb),n=Object.fromEntries(Hd.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Hd.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function en(e){let t=Number(e),r=qe[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(qe).join(", ")})`);return{chainId:t,...r}}function tn(e){if(e==null||e==="")return ye;let t=String(e);if(!Hs(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Qe(t)}function fr(e,t){let r=qe[Number(t)];if(Zr(e))return Qe(r.weth);let n=String(e);if(/^weth$/i.test(n))return Qe(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Qe(r.usdc);if(!Hs(n))throw new Error(`invalid token address: ${e}`);return Qe(n)}function Zr(e){let t=String(e||"").trim().toLowerCase();return!t||t===Gb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function fo({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Qe(e),s=Qe(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=tn(o);return Mb(Qr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function Gs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Qe(e),s=Qe(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:tn(o)},zeroForOne:u}}function Jb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=Ws(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==ye&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),n&&e===ye&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==ye&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==ye&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==ye,returnsDelta:i,reasons:Object.freeze(a)})}async function Kb(e={},t={}){let r=en(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=fr(e.tokenIn||"WETH",r.chainId),o=fr(e.tokenOut||r.usdc,r.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=tn(e.hooks),{poolKey:c}=Gs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=fo(c),l=t.rpcCall||X,d=lo.encodeFunctionData("getSlot0",[u]),p=lo.encodeFunctionData("getLiquidity",[u]),[f,m,w]=await Promise.all([l(r.chainId,"eth_call",[{to:r.stateView,data:d},"latest"],t),l(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===ye?Promise.resolve(null):l(r.chainId,"eth_getCode",[a,"latest"],t)]),g=lo.decodeFunctionResult("getSlot0",f),y=lo.decodeFunctionResult("getLiquidity",m)[0],b=g[0],T=b>0n,x=a===ye?null:typeof w=="string"&&w!=="0x"&&w.length>4,_=!!(i&Vs),k=Jb({hook:a,codePresent:x,initialized:T,dynamicFee:_});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:T,sqrtPriceX96:b.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:y.toString(),dynamicFee:_}),hook:Object.freeze({address:a,codePresent:x,codeBytes:x?(w.length-2)/2:0,permissions:Ws(a)}),risk:k})}async function mo(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=fr(e.tokenIn||"WETH",r),a=fr(e.tokenOut||qe[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...zs],l=e.hooks||ye,d=[],p=null;for(let h of u){let{poolKey:E,zeroForOne:A}=Gs({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:l}),v=po.encodeFunctionData("quoteExactInputSingle",[{poolKey:E,zeroForOne:A,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||X)(r,"eth_call",[{to:n,data:v},"latest"],t);if(!R||R==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let I=po.decodeFunctionResult("quoteExactInputSingle",R),P={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:E,zeroForOne:A,poolId:fo({...E})};d.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(R){d.push({...h,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let h=d.map(E=>`${E.fee}/${E.tickSpacing}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${h}`)}let f=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:zd},t).catch(()=>[]):[],m=new Map;for(let h of f){let E=String(h.pairAddress||"").toLowerCase();E&&m.set(E,h)}let w=h=>m.get(String(h.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),y=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let h=BigInt(p.amountOut),A=d.filter(v=>v.ok&&Number((h-BigInt(v.amountOut))*10000n/h)<=g).filter(v=>w(v)?.liquidityUsd!=null).sort((v,R)=>w(R).liquidityUsd-w(v).liquidityUsd)[0];A&&A.poolId!==p.poolId&&(y={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:w(A).liquidityUsd,bandBps:g},p=A)}let b=w(p),T=f[0]??null,x=b??T,_=e.liquidityUsd??b?.liquidityUsd??T?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":T?"pair":null;return ce({venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:_,liquiditySource:x,liquidityAttribution:k,liquidityPick:y,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Hs(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!Zr(e.tokenIn)&&!Zr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&Vs)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:_,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=fr(e.tokenIn||"WETH",r),a=fr(e.tokenOut||qe[r].usdc,r),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...zs],l=e.hooks||ye,d=[],p=null;for(let m of u){let{poolKey:w,zeroForOne:g}=Gs({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:l}),y=po.encodeFunctionData("quoteExactOutputSingle",[{poolKey:w,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let b=await(t.rpcCall||X)(r,"eth_call",[{to:n,data:y},"latest"],t);if(!b||b==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let T=po.decodeFunctionResult("quoteExactOutputSingle",b),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:T[0].toString(),gasEstimate:T[1].toString(),poolKey:w,zeroForOne:g,poolId:fo({...w})};d.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(b){d.push({...m,ok:!1,error:String(b.message||b).slice(0,160)})}}if(!p){let m=d.map(w=>`${w.fee}/${w.tickSpacing}:${w.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await hd({chainId:r,tokenA:s,tokenB:a,dexIds:zd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Xb(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=en(n);if(tn(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Vs)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let s=Qe(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Zr(e.tokenIn)||Zr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await mo(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let l=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,d={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Qr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,u.zeroForOne,BigInt(u.amountIn),l,0n,"0x"]]),m=Qr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),w=Qr.encode(["address","uint256"],[u.tokenOut,l]),g=Qr.encode(["bytes","bytes[]"],[Vb,[f,m,w]]),b=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,T=jb.encodeFunctionData("execute",[zb,[g],b]);return Z({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:b,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:Wb,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:T,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Qb(){return Object.entries(qe).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Zb(e={}){let t=en(e.chainId??8453),r=await X(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Qr,ye,qe,zs,po,jb,lo,Hd,Hb,Vs,zb,Vb,Wb,Gb,zd,Js=S(()=>{at();Gr();ke();ge();Qr=Ub.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",qe={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},zs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],po=new js(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),jb=new js(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),lo=new js(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Hd=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Hb=(1n<<14n)-1n,Vs=8388608;zb="0x10",Vb="0x060c0f",Wb="0x000000000022D473030F116dDEE9F6B43aC78BA3",Gb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";zd=["uniswap-v4","uniswapv4"]});function rx(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||ex).replace(/\/$/,"")}function nx(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||tx).replace(/\/$/,"")}async function ho(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${rx(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wd(e={}){return N(`${nx(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var ex,tx,Ks=S(()=>{W();ex="https://coins.llama.fi",tx="https://api.llama.fi"});var go={};M(go,{ACROSS_API:()=>Gd,HOP_API:()=>Jd,RELAY_API:()=>Kd,acrossHealth:()=>ix,acrossSuggestedFees:()=>Yd,hopHealth:()=>sx,hopQuote:()=>Xd,relayHealth:()=>ax,relayPrepare:()=>cx,relayQuote:()=>Ys});async function ix(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Yd({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Yd(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Gd).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sx(e={}){try{let t=await Xd({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Xd(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Jd).replace(/\/$/,""),l=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ce(l,{chainId:Number(e.originChainId||e.chainId||ox[o]||0),venue:l?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...l,autoSlippagePolicy:a}}async function ax(e={}){try{let t=await Ys({user:ht,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ys(e={},t={}){let{user:r=ht,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let l=(t.baseUrl||process.env.RELAY_API_URL||Kd).replace(/\/$/,""),d=await N(`${l}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:u}:ce(d,{chainId:Number(n),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function cx(e={},t={}){let r=await Ys(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:n,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:ve(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return Z({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Gd,Jd,Kd,ox,wo=S(()=>{W();ke();Hn();ge();Gd="https://across.to/api",Jd="https://api.hop.exchange/v1",Kd="https://api.relay.link",ox={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function yo(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Ze(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Zd(e,t={}){let r=Bd[Number(e)];if(!r)return null;try{let n=await ho([r],t);return Ze(n?.coins?.[r]?.price)}catch{return null}}async function ux(e={}){try{let t=await Wd({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function lx(e,t={}){let r=yt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Qd[r]||[r]),n.push(...Qd[yt(e)]||[e]),n}function dx(e,t,r={}){let n=Array.isArray(e)?e:[],o=lx(t,r).map(yt).filter(Boolean);for(let i of o){let s=n.find(c=>yt(c?.slug)===i||yt(c?.name)===i),a=Ze(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=yt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:yt(c?.slug).includes(i)||yt(c?.name).includes(i)}),a=Ze(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Xs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:l={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await Lt({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},l),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:yo(f?.gasCosts),feeUsd:yo(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await cr({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:Ze(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await ur({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,w=await Promise.resolve(c);return m!=null&&w&&(f=Number(m)/1e18*w),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Md({chainId:e,src:t,dst:r,amount:n},l),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await $t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},l),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),be[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await Bt({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),qe[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await mo({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function ep({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=ux(s),dx(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await Lt({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,p={tool:l?.tool??l?.toolDetails?.name,durationSeconds:Ze(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:yo(d?.gasCosts),feeUsd:yo(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(wo(),go)),p=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:Ze(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Ze(p?.totalImpact?.usd)!=null?Math.abs(Ze(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(wo(),go)),d=await l({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,f=null;if(p!=null)try{let w=BigInt(String(o))-BigInt(String(p));w>0n&&(f=w.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Ze(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Ze,yt,Qd,tp=S(()=>{Hr();Wn();Yn();jd();Zn();ao();Js();Ks();Ms();Ze=e=>{let t=Number(e);return Number.isFinite(t)?t:null};yt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Qd=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var np={};M(np,{QUALITY:()=>Be,bestBridgeRoute:()=>rn,bestSwapRoute:()=>mr,formatComparisonNote:()=>bo});async function rp(e,t,r){let n=px[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await ho([o],r))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function mr(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Zd(r,t),a=rp(r,o,t),c=ud(r,t).catch(()=>null),u=Xs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([uo(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(g=>g,()=>null),m=Us(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),w=t.maxImpactPct===void 0?25:t.maxImpactPct;if(w!=null&&m.best){let g=m.best.source,b=await qd(async T=>{let x=Xs({...e,amountIn:T.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(k=>k.source===g);return x.length?(await uo(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(b){let T=Fd(m,{[g]:b},{maxImpactPct:w});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...T,sourcesTried:u.length,sourcesAnswered:l.filter(x=>x.quality!==Be.FAILED).length,note:bo(T,u.length),priceImpact:{[g]:Number(b.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(g=>g.quality!==Be.FAILED).length,note:bo(m,u.length)}}async function rn(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=rp(n,i,t),c=ep({...e,opts:t}),[u,l]=await Promise.all([uo(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Us(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.seconds!=null);return{kind:"bridge",fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==Be.FAILED).length,note:bo(d,c.length)}}function fx(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Ll(t)}`:""}function bo(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=fx(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var px,hr=S(()=>{Ms();tp();Vn();Ks();at();px={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var op={};M(op,{ARTIFACT:()=>ct,prepareBestRoute:()=>bx,supportedPreparers:()=>hx});function hx(){return Object.keys(xo)}async function bx(e,t={}){if(yx.some(g=>Object.hasOwn(e,g)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:r}=e;if(!r)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!wx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(gx.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let n=await mr(e,t);if(!n.best){let g=n.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=xo[o];if(!s){let g=n.routes.find(y=>xo[y.source]&&y.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await s(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),T=/allowance/i.test(b),x=!T&&/not enough|insufficient|balance/i.test(b),_,k;T?(k="approval-required-first",_=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${b}`):x?(k="taker-not-funded",_=`${o} refused to build the transaction: ${b}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(k="provider-error",_=`${o} prepare failed: ${b}`);let h=n.routes.find(E=>xo[E.source]&&E.source!==o);return{ok:!1,reason:_,failureKind:k,...h?{alternative:h.source}:{},comparison:n}}let c=e.driftToleranceBps??mx,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),y=BigInt(a.amountOut);g>0n&&(u=Number((y-g)*10000n/g),u<-c&&(l=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=n.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),f=n.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,y)=>Math.max(g,y.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,w=m!=null&&f>0?Math.round(m/f*100):null;return Z({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:w},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===ct.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===ct.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var ct,mx,xo,gx,wx,yx,ip=S(()=>{hr();ge();ct=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),mx=100,xo={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(ao(),kd)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Js(),Vd)),p=await d({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:ct.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Hr(),Is)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Wn(),Ml)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:ct.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(Yn(),Kl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(Zn(),sd)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:ct.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};gx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),wx=/^0x[0-9a-fA-F]{40}$/,yx=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var sp={};M(sp,{prepareBestBridgeRoute:()=>vx,supportedBridgePreparers:()=>Ax});function Ax(){return Object.keys(So)}async function vx(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!xx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Sx.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await rn(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(g=>g.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=So[s];if(!c){let g=i.routes.find(y=>So[y.source]&&y.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...g?{alternative:g.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),T=/allowance/i.test(b),x=!T&&/not enough|insufficient|balance/i.test(b),_=i.routes.find(k=>So[k.source]&&k.source!==s);return{ok:!1,reason:T?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${b}`:x?`${s} refused to build: ${b}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${b}`,failureKind:T?"approval-required-first":x?"taker-not-funded":"provider-error",..._?{alternative:_.source}:{},comparison:i}}let l=u.transactions||[];if(!l.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let d=l.filter(g=>g.chainId!=null&&Number(g.chainId)!==Number(n));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??Ex,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let g=BigInt(a.grossOut),y=BigInt(u.amountOut);g>0n&&(f=Number((y-g)*10000n/g),f<-p&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(p/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let w=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&w.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),Z({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:l.length,transactions:l,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:l[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:w,runnersUp:i.routes.filter(g=>g.source!==s).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var xx,Sx,Ex,So,ap=S(()=>{hr();ge();xx=/^0x[0-9a-fA-F]{40}$/,Sx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Ex=100,So={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(wo(),go)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Hr(),Is)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var lp={};M(lp,{buildTwapSchedule:()=>up,normalizeTwapParams:()=>cp,prepareTwapChunk:()=>Cx,simulateTwap:()=>Nx});function cp(e={}){let t=Math.max(kx,Math.min(Ix,Number(e.splits)||Tx)),r=Math.max(.1,Number(e.windowHours)||Ox),n=Math.max(_x,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function up(e){let t=cp(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function Cx(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await mr({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=Z(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function Nx(e,{quoteFn:t=mr}={}){let r=up(e),n=[],o=0n,i="unknown";for(let a=0;a<r.params.splits;a++)try{let c=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker}),u=BigInt(c.amountOut??c.quote?.amountOut??"0");o+=u,i=c.source??c.venue??i,n.push({splitIndex:a+1,amountOut:String(u),source:c.source??c.venue})}catch(c){n.push({splitIndex:a+1,error:String(c.message||c).slice(0,200)})}let s=o>0n?(Number(o)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(o),averagePrice:s,bestSource:i,chunks:n,simulatedAt:new Date().toISOString()}}var kx,Ix,_x,Tx,Ox,dp=S(()=>{hr();ge();kx=2,Ix=100,_x=60,Tx=10,Ox=6});async function mp({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!pp.has(Number(e))||!pp.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let a={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},c=await N(`${fp}/dln/order/quote`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return c.error?{error:String(c.error)}:{estimation:c.estimation??{},order:c.order??{},fixFee:c.fixFee??"0"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}async function hp(){try{return{ok:!0,chainCount:(await N(`${fp}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var fp,pp,gp=S(()=>{W();ge();fp="https://dln.debridge.finance/v1.0",pp=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function yp({active:e=!0}={}){let t=Date.now();if(gr.size&&t-wp<Rx)return[...gr.values()];try{let r=await N(`${Qs}/exchange/currencies?active=${e?"true":"false"}`);gr.clear();for(let n of r??[])gr.set(String(n.ticker).toLowerCase(),n);return wp=t,r??[]}catch(r){return gr.size?[...gr.values()]:{error:String(r.message||r).slice(0,200)}}}async function Px(e,t){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${Qs}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Lx(e,t,r,{flow:n="standard"}={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let o=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),i=await N(`${Qs}/exchange/estimated-amount?${o}`);return{fromAmount:i?.fromAmount,toAmount:i?.toAmount,rate:i?.rate,flow:i?.flow??n}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function bp({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let o=await Px(e,t);if(o.error)return o;let i=r??o.minAmount,s=await Lx(e,t,i,{flow:n});if(s.error)return s;let a=await yp(),c=a.find(l=>String(l?.ticker).toLowerCase()===String(e).toLowerCase()),u=a.find(l=>String(l?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:i,toAmount:s.toAmount,estimatedRate:s.rate,minAmount:o.minAmount,flow:s.flow,networkFee:c?.networkFee??null,kycRequired:c?.kycRequired??u?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function xp(){try{let e=await yp();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Qs,gr,wp,Rx,Sp=S(()=>{W();Qs="https://api.changenow.io/v2",gr=new Map,wp=0,Rx=6e5});async function Ep({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let a={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},c=await N(`${$x}/route`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return{route:c?.route??{},toAmount:c?.route?.estimate?.toAmount,fee:c?.route?.estimate?.feeCosts}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var $x,Ap=S(()=>{W();$x="https://api.squidrouter.com/v1"});async function vp({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let s=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),a=await N(`${Bx}/quote?${s}`);return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Bx,kp=S(()=>{W();Bx="https://api.stargate.finance"});async function Ip({fromAsset:e,toAsset:t,amount:r,destination:n}={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let o=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),i=await N(`${qx}/quote/swap?${o}`);return{expectedAmountOut:i?.expected_amount_out,fees:i?.fees,slippageBps:i?.slippage_bps,inboundAddress:i?.inbound_address,memo:i?.memo,estimatedTime:i?.total_swap_seconds?`${Math.round(i.total_swap_seconds/60)} min`:"unknown"}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var qx,_p=S(()=>{W();qx="https://midgard.ninerealms.com/v2"});async function Tp({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={}){if(!e||!t||!r||!n||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let s=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),a=await N(`${Fx}/quote?${s}`);return{amountOut:a?.result?.toAmount,feeUsd:a?.result?.totalGasFeesInUsd,route:a?.result?.route,estimatedTime:a?.result?.serviceTime?`${a.result.serviceTime}s`:"unknown"}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Fx,Op=S(()=>{W();Fx="https://api.socket.tech/v2"});async function Cp({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let i={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},s=await N(`${Dx}/estimate`,{method:"POST",body:JSON.stringify(i),headers:{"content-type":"application/json"}});return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTransferTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Dx,Np=S(()=>{W();Dx="https://api.connext.network"});async function Rp({fromChain:e,toChain:t,token:r,amount:n}={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let o=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),i=await N(`${Ux}/quote?${o}`);return{amountOut:i?.amountOut,fee:i?.fee,estimatedTime:i?.estimatedTime}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var Ux,Pp=S(()=>{W();Ux="https://api.portalbridge.com/v1"});function Mx(e,t){return`0x${ea.getAmountsOut}`+Oe(e)+Oe(64)+Oe(t.length)+t.map(nn).join("")}function jx(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Zs(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Hx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>ta)throw new Error(`slippageBps ${r} exceeds the ${ta} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Lp(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await X(t,"eth_call",[{to:o,data:Mx(i,s)},"latest"],a);return jx(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Zs(c.scanner);if(!u)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let l=a||[o,i];if(l.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await n(u,s,l,c);return d?{chainId:t,router:u,path:l,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:l.length-1,evidence:B.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:B.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Zs(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let l=await n(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=l[l.length-1];if(d===0n)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,d,[o,u],a);if(!p)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p[p.length-1],m=Number(f*10000n/BigInt(i)),w=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(w=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(w=$.CAUTION,g=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:w,reason:g,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:l},d={}){let p=d.scanner,f=Zs(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=l||[o,i],w=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(w.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${w.evidence}: ${w.reason??"no reason given"})`);let g=Hx(w.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=BigInt(Math.floor(Date.now()/1e3)+Number(u)),b=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,T=b?`0x${ea.swapExactETHForTokens}`+Oe(g)+Oe(128)+nn(a)+Oe(y)+Oe(m.length)+m.map(nn).join(""):`0x${ea.swapExactTokensForTokens}`+Oe(s)+Oe(g)+Oe(160)+nn(a)+Oe(y)+Oe(m.length)+m.map(nn).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:T,value:b?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:w.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:ta,deadline:y.toString()},requires:b?[]:[{step:"approve",token:m[0],spender:f,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var ea,Oe,nn,ta,$p=S(()=>{at();wt();ea={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Oe=e=>BigInt(e).toString(16).padStart(64,"0"),nn=e=>e.slice(2).toLowerCase().padStart(64,"0");ta=100});function Vx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>na)throw new Error(`slippageBps ${r} exceeds the ${na} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function ra(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Fp(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Bp.quoteExactInputSingle}`+on(s)+on(a)+qt(c)+qt(u)+qt(0),p=await X(t,"eth_call",[{to:i,data:d},"latest"],l).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let l=[],d=null;for(let p of zx){let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);l.push({fee:p,amountOut:f?f.toString():null}),f&&(!d||f>d.amountOut)&&(d={fee:p,amountOut:f})}return{best:d,tried:l}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=ra(c.scanner,"quoter");if(!u)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!qp.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:l,tried:d}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return l?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:l.amountOut.toString(),fee:l.fee,useNative:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:d,evidence:B.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:B.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=ra(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(_=>String(_).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||d||(l[0]&&p!==l[0]?l[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let w=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!w.best){let _=l.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(_){let k=await o({quoter:u,tokenIn:_,tokenOut:i,amountIn:s},c);if(k.best){let h=await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c);if(h.best){let E=h.best.amountOut,A=Number(E*10000n/BigInt(s)),v=$.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return A<5e3?(v=$.FAIL,R=`round trip vs dollar book returns only ${(A/100).toFixed(2)}% -- punitive tax or no real liquidity`):A<9e3&&(v=$.CAUTION,R=`round trip vs dollar book returns ${(A/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:v,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:h.best.fee,evidence:B.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:w.best.amountOut},c);if(!g.best){let _=l.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(_){let k=await o({quoter:u,tokenIn:_,tokenOut:i,amountIn:s},c),h=k.best?await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c):{best:null};if(k.best&&h.best){let E=h.best.amountOut,A=Number(E*10000n/BigInt(s)),v=$.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return A<5e3?(v=$.FAIL,R=`dollar-book round trip returns only ${(A/100).toFixed(2)}%`):A<9e3&&(v=$.CAUTION,R=`dollar-book round trip returns ${(A/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:v,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:h.best.fee,evidence:B.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:$.FAIL,evidence:B.LIVE,leg:"sell",bought:w.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let y=g.best.amountOut,b=Number(y*10000n/BigInt(s)),T=$.PASS,x="round trip completes with expected fee/impact loss";return b<5e3?(T=$.FAIL,x=`round trip returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(T=$.CAUTION,x=`round trip returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:T,reason:x,amountIn:String(s),bought:w.best.amountOut.toString(),returned:y.toString(),retentionBps:b,buyFee:w.best.fee,sellFee:g.best.fee,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:l},d={}){let p=ra(d.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!qp.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(f.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,w=Vx(f.amountOut,u);if(w<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),y=`0x${Bp.exactInputSingle}`+on(i)+on(s)+qt(m)+on(c)+qt(a)+qt(w)+qt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:y,value:g?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:w.toString(),slippageBps:u,maxSlippageBps:na,fee:m},requires:g?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var zx,Bp,qt,on,qp,na,Dp=S(()=>{at();wt();zx=[100,500,3e3,1e4],Bp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},qt=e=>BigInt(e).toString(16).padStart(64,"0"),on=e=>e.slice(2).toLowerCase().padStart(64,"0"),qp=/^0x[0-9a-fA-F]{40}$/,na=100});function Up(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Mp(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function Wx(e){let{chainId:t}=e;async function r(n,o,i){return X(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await ro(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:B.LIVE}},async nativeBalance(n,o={}){let i=await ld(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:B.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await pd({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:B.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:B.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,Eo.decimals,o).catch(()=>null),r(n,Eo.symbol,o).catch(()=>null),r(n,Eo.name,o).catch(()=>null),r(n,Eo.totalSupply,o).catch(()=>null)]),u=Up(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Mp(s?.result??s),name:Mp(a?.result??a),totalSupply:(Up(c?.result??c)??null)?.toString()??null,evidence:l?B.LIVE:B.UNKNOWN,warning:l?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:B.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await oo(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,d)=>(d.liquidityUsd??0)-(l.liquidityUsd??0)),u=no(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:md(n,u),evidence:u.length?B.LIVE:B.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],l=[];for(let d=n;d<=o;d+=a){let p=Math.min(d+a-1,o);l.push([d,p])}for(let[d,p]of l){let f={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let m=await X(t,"eth_getLogs",[f],c).catch(w=>({error:String(w?.message||w)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[d,p],error:m.error,evidence:B.UNKNOWN};for(let w of m?.result??m??[])u.push(w)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:B.LIVE}},async scoreRisk(n,o={}){let i=[],s=$.PASS,a=l=>{let d={[$.PASS]:0,[$.CAUTION]:1,[$.UNKNOWN]:2,[$.FAIL]:3};d[l]>d[s]&&(s=l)},c=await this.resolveToken(n,o);c.evidence!==B.LIVE?(i.push({check:"erc20-metadata",result:$.UNKNOWN,detail:c.warning}),a($.UNKNOWN)):i.push({check:"erc20-metadata",result:$.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===B.UNAVAILABLE)i.push({check:"liquidity",result:$.UNKNOWN,detail:u.reason}),a($.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:$.FAIL,detail:"no pool with liquidity found"}),a($.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:$.CAUTION,detail:`top pool only $${d}`}),a($.CAUTION)):i.push({check:"liquidity",result:$.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:$.CAUTION,detail:"pool under 24h old"}),a($.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:$.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:l.verdict,detail:l.retentionBps!=null?`round trip returns ${(l.retentionBps/100).toFixed(2)}% -- ${l.reason}`:l.reason}),a(l.verdict)}else i.push({check:"sellability",result:$.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a($.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function oa(e){let r={...Wx(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Fp({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,Lp({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var Eo,jp=S(()=>{at();Gr();wt();$p();Dp();Bs();Eo={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Ao(){return sn.map(e=>co(oa(e)))}function Hp(e){return co(oa(e))}var sn,vo=S(()=>{jp();wt();sn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Kp,getAddress as Gx,id as Yp}from"ethers";function wr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function aa(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function ko(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function lS(e,t){try{return Gx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function dS(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Jp(e){return`0x${String(e).slice(-40).toLowerCase()}`}function pS({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>oS)return"stale"}return"scoped"}function fS(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function mS(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(wr(r)){let a=aa(Wp,o,iS);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=zp.encodeFunctionData(d,[]),f=await X(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:zp.decodeFunctionResult(d,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),l={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return wr(r)&&ko(Wp,o,l,cS),l})();return n?.set(o,s),s}async function hS(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Kx,1),Yx),o=await ro(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await X(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[Jx,dS(t)]}],r);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),l=c?.topics?.[2];!u||!l||a.set(`${u}:${Jp(l)}`,{token:u,spender:Jp(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function gS(e){return(tS[e]||[]).flatMap(r=>Qx.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function wS(e,t,r={}){let n=[],o="direct-probe",i=null,s=gS(e),a=sa(e),c=wr(r)&&aa(ia,e,sS)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let u=await hS(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},wr(r)&&ko(ia,e,!0,64)}catch{if(wr(r)&&ko(ia,e,!1,64),n=s,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,d=(await Tn(n,r.concurrency||4,async f=>{try{let m=await dd({chainId:e,token:f.token,owner:t,spender:f.spender},r),w=BigInt(m.allowance);if(w<=0n)return null;let g=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await mS(e,f.token,r,u),y=w>=nS,b=Xx[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:g.symbol,decimals:g.decimals,spender:f.spender,spenderLabel:b,allowance:w.toString(),allowanceDisplay:fS(w,g.decimals,y),unlimited:y,lastActivityAt:null,risk:pS({unlimited:y,spenderLabel:b,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await bS(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:sa(e).length,...i||{}},approvals:[...d,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function yS(e,t,r,n,o){try{let i=Vp.encodeFunctionData("isApprovedForAll",[r,n]),s=await X(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Vp.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function sa(e){return(eS[e]||[]).flatMap(r=>Zx.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function bS(e,t,r){let n=sa(e);return n.length===0?[]:(await Tn(n,r.concurrency||4,async i=>await yS(e,i.collection,t,i.operator,r)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Xp(e={},t={}){let r=lS(e.owner||e.address,"owner"),n=new Map(sn.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=wr(t)&&!e.refresh;if(s){let f=aa(Gp,i,aS);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await Tn(o,e.concurrency||3,f=>wS(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),l=u.find(f=>f.method==="log-scan"&&f.toBlock),d=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:l?`last ${l.toBlock-l.fromBlock} blocks`:d?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&ko(Gp,i,p,uS),{...p,cached:!1,cachedAgeMs:0}}var zp,Vp,Jx,dC,Kx,Yx,Xx,Qx,Zx,eS,tS,rS,nS,oS,iS,sS,aS,cS,uS,Wp,ia,Gp,Qp=S(()=>{vo();W();at();zp=new Kp(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Vp=new Kp(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Jx=Yp("Approval(address,address,uint256)"),dC=Yp("ApprovalForAll(address,address,bool)"),Kx=1e4,Yx=2e5,Xx=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),Qx=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),Zx=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),eS=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),tS=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),rS=(1n<<256n)-1n,nS=rS/2n,oS=4320*60*60*1e3,iS=360*60*1e3,sS=600*1e3,aS=45*1e3,cS=512,uS=128,Wp=new Map,ia=new Map,Gp=new Map});var tf={};M(tf,{aggregateBridgeQuotes:()=>Zp,bridgeAggregatorHealth:()=>SS,checkRevokeNeeded:()=>ef,scanBridgeRoutes:()=>xS});async function Zp(e={}){let{fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amount:i,taker:s,fromSymbol:a="?",toSymbol:c="?",fromDecimals:u=18,toDecimals:l=18}=e,d=[],p=[],f=mp({srcChainId:t,srcChainTokenIn:n,srcChainTokenInAmount:i,dstChainId:r,dstChainTokenOut:o}).then(h=>h.error?(p.push(`debridge: ${h.error}`),null):{provider:"debridge",amountOut:h.estimation?.dstChainTokenOut?.amount??h.estimation?.toAmount,feeUsd:h.estimation?.fixFee??h.fixFee,estimatedTime:h.estimation?.execution?.estimatedTransferTime?`${h.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:h}).catch(h=>(p.push(`debridge: ${h.message}`),null)),m=rn({fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}).then(h=>!h||h.error?(p.push(`lifi: ${h?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:h.amountOut??h.quote?.amountOut,feeUsd:h.feeUsd??h.totalFee,estimatedTime:h.estimatedTime??h.duration??"unknown",preparable:!!h.transaction,raw:h}).catch(h=>(p.push(`lifi: ${h.message}`),null)),w=Ep({fromChain:t,toChain:r,fromToken:n,toToken:o,fromAmount:i,fromAddress:s}).then(h=>h.error?(p.push(`squid: ${h.error}`),null):{provider:"squid",amountOut:h.toAmount,feeUsd:Array.isArray(h.fee)?h.fee.reduce((E,A)=>E+(Number(A.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:h}).catch(h=>(p.push(`squid: ${h.message}`),null)),g=vp({srcChainId:t,dstChainId:r,token:n,amount:i}).then(h=>h.error?(p.push(`stargate: ${h.error}`),null):{provider:"stargate",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"1-5 min",preparable:!1,raw:h}).catch(h=>(p.push(`stargate: ${h.message}`),null)),y=Ip({fromAsset:a,toAsset:c,amount:i,destination:s}).then(h=>h.error?(p.push(`thorchain: ${h.error}`),null):{provider:"thorchain",amountOut:h.expectedAmountOut,feeUsd:h.fees?.total,estimatedTime:h.estimatedTime||"10-30 min",preparable:!1,raw:h}).catch(h=>(p.push(`thorchain: ${h.message}`),null)),b=(async()=>{if(!a||!c||a==="?"||c==="?")return p.push("changenow: ticker symbols required, skipping"),null;try{let h=await bp({fromTicker:a,toTicker:c,fromAmount:i});return h.error?(p.push(`changenow: ${h.error}`),null):{provider:"changenow",amountOut:h.toAmount,feeUsd:h.networkFee,estimatedTime:h.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:h.kycRequired,raw:h}}catch(h){return p.push(`changenow: ${h.message}`),null}})(),T=Tp({fromChainId:t,toChainId:r,fromToken:n,toToken:o,fromAmount:i,userAddress:s}).then(h=>h.error?(p.push(`bungee: ${h.error}`),null):{provider:"bungee",amountOut:h.amountOut,feeUsd:h.feeUsd,estimatedTime:h.estimatedTime,preparable:!1,raw:h}).catch(h=>(p.push(`bungee: ${h.message}`),null)),x=Cp({originDomain:t,destinationDomain:r,originToken:n,destinationToken:o,amount:i}).then(h=>h.error?(p.push(`connext: ${h.error}`),null):{provider:"connext",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-20 min",preparable:!1,raw:h}).catch(h=>(p.push(`connext: ${h.message}`),null)),_=Rp({fromChain:t,toChain:r,token:n,amount:i}).then(h=>h.error?(p.push(`wormhole: ${h.error}`),null):{provider:"wormhole",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-15 min",preparable:!1,raw:h}).catch(h=>(p.push(`wormhole: ${h.message}`),null)),k=await Promise.allSettled([f,m,w,g,y,T,x,_,b]);for(let h of k)h.status==="fulfilled"&&h.value&&d.push(h.value);return d.sort((h,E)=>{let A=Number(h.amountOut??0),v=Number(E.amountOut??0);return A!==v?v-A:h.preparable&&!E.preparable?-1:!h.preparable&&E.preparable?1:0}),{providers:d.map(h=>h.provider),bestRoute:d[0]?.provider??"none",winner:d[0]??null,runnersUp:d.slice(1),errors:p.length?p:null}}async function ef({chainId:e,taker:t,tokenIn:r}={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let o=(await Xp({chainIds:[e],address:t})).approvals;if(!o?.length)return{needsRevoke:!1,note:"no active approvals found"};let i=r?o.find(s=>String(s.token).toLowerCase()===String(r).toLowerCase()):null;return i&&BigInt(i.allowance??"0")>0n?{needsRevoke:!0,spender:i.spender,amount:i.allowance,symbol:i.symbol??"?",decimals:i.decimals??18,note:`approval found for ${i.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${o.length} total approvals on chain)`}}catch(n){return{needsRevoke:!1,note:`revoke check unavailable: ${String(n.message||n).slice(0,100)}`}}}async function xS(e={}){let[t,r]=await Promise.all([Zp(e),ef({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn})]),n=t.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:n.provider??"none",amountOut:n.amountOut,feeUsd:n.feeUsd,estimatedTime:n.estimatedTime,preparable:n.preparable?"yes":"no (manual send)",providers:t.providers,runnersUp:t.runnersUp,revokeCheck:r,errors:t.errors,confidence:t.providers.length>=2?.85:t.providers.length===1?.6:.1}}async function SS(){let[e,t]=await Promise.all([hp().catch(r=>({ok:!1,error:r.message})),xp().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var qC,rf=S(()=>{hr();gp();Sp();Ap();kp();_p();Op();Np();Pp();Qp();qC=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var nf={};M(nf,{DYDX_API:()=>Io,dydxHealth:()=>vS,dydxMarkets:()=>ES,dydxOrderbook:()=>AS});async function ES(e=50){try{return((await N(`${Io}/v4/perpetualMarkets?limit=${e}`))?.markets||[]).map(r=>({ticker:r?.ticker,oraclePrice:r?.oraclePrice,indexPrice:r?.indexPrice,nextFundingRate:r?.nextFundingRate?`${(Number(r.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:r?.openInterest,volume24h:r?.volume24H}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function AS(e){try{let t=await N(`${Io}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function vS(){try{return{ok:!0,serverTime:(await N(`${Io}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Io,of=S(()=>{W();Io="https://api.dydx.exchange"});var af={};M(af,{DRIFT_API:()=>sf,driftHealth:()=>IS,driftMarkets:()=>kS});async function kS(){try{return((await N(`${sf}/v2/markets`))?.markets||[]).map(t=>({symbol:t?.symbol||t?.marketIndex,oraclePrice:t?.amm?.oraclePrice,markPrice:t?.amm?.markPrice,fundingRate:t?.amm?.lastFundingRate?`${(Number(t.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:t?.amm?.longFunding,short:t?.amm?.shortFunding},volume24h:t?.amm?.quoteAssetVolume}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function IS(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var sf,cf=S(()=>{W();sf="https://dlob.drift.trade"});var uf={};M(uf,{VERTEX_API:()=>_o,vertexHealth:()=>OS,vertexMarkets:()=>_S,vertexOrderbook:()=>TS});async function _S(){try{return((await N(`${_o}/query`,{method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json"}}))?.data?.all_markets||[]).map(t=>({market:t?.market,type:t?.type,oraclePrice:t?.oracle_price_x18?(Number(BigInt(t.oracle_price_x18))/1e18).toFixed(4):null,minSize:t?.min_size,productId:t?.product_id}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function TS(e){try{let r=(await N(`${_o}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function OS(){try{return{ok:!0,status:(await N(`${_o}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var _o,lf=S(()=>{W();_o="https://gateway.prod.vertexprotocol.com/v2"});var df={};M(df,{pancakeHealth:()=>RS,pancakeQuote:()=>NS});async function NS({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let i={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},s=await N(`${CS}/quote`,{method:"POST",body:JSON.stringify(i),headers:{"content-type":"application/json"}});return{amountOut:s?.amountOut,route:s?.route}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function RS(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var CS,pf=S(()=>{W();CS="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var mf={};M(mf,{sushiHealth:()=>$S,sushiQuote:()=>LS});async function LS({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let i=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,s=await N(`${PS(e)}/quote?query=${encodeURIComponent(i)}`);return{amountOut:s?.data?.quote?.amountOut,route:s?.data?.quote?.route}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function $S(){try{return{ok:!0,chains:Object.keys(ff).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var PS,ff,hf=S(()=>{W();PS=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${ff[e]||"ethereum"}`,ff={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var gf={};M(gf,{raydiumHealth:()=>FS,raydiumQuote:()=>qS});async function qS({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let o=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),i=await N(`${BS}/quote?${o}`),s=(i?.routePlan||[]).filter(a=>a?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:i?.outAmount,priceImpactPct:i?.priceImpactPct,raydiumRoutes:s.length,allRoutes:i?.routePlan?.length||0}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function FS(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var BS,wf=S(()=>{W();BS="https://quote-api.jup.ag/v6"});var yf={};M(yf,{AEVO_API:()=>ca,aevoHealth:()=>US,aevoMarkets:()=>DS});async function DS(){try{return(await N(`${ca}/markets`)||[]).map(t=>({instrument:t?.instrument_name,type:t?.instrument_type,markPrice:t?.mark_price,indexPrice:t?.index_price,fundingRate:t?.funding_rate?`${(Number(t.funding_rate)*100).toFixed(4)}%`:null,openInterest:t?.open_interest,volume24h:t?.volume_24h}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function US(){try{return{ok:(await N(`${ca}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ca,bf=S(()=>{W();ca="https://api.aevo.xyz"});var xf={};M(xf,{compoundHealth:()=>HS,compoundMarkets:()=>jS});async function jS(){try{return((await N(`${MS}/ctoken`))?.cToken||[]).map(t=>({symbol:t?.symbol,underlying:t?.underlying_symbol,supplyApy:t?.supply_rate?.value?`${(Number(t.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:t?.borrow_rate?.value?`${(Number(t.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:t?.total_supply?.value,totalBorrow:t?.total_borrows?.value,collateralFactor:t?.collateral_factor?.value?`${(Number(t.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function HS(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var MS,Sf=S(()=>{W();MS="https://api.compound.finance/api/v2"});var Ef={};M(Ef,{yearnHealth:()=>WS,yearnVaults:()=>VS});async function VS(){try{return(await N(`${zS}/vaults/all`)||[]).map(t=>({name:t?.name,symbol:t?.symbol,apy:t?.apy?.net_apy?`${(Number(t.apy.net_apy)*100).toFixed(2)}%`:null,tvl:t?.tvl?.tvl_deposited,chain:t?.chainId,type:t?.type||"v2"}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function WS(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var zS,Af=S(()=>{W();zS="https://api.yearn.fi/v1"});var vf={};M(vf,{convexHealth:()=>KS,convexPools:()=>JS});async function JS(){try{return(await N(`${GS}/pools`)||[]).map(t=>({name:t?.curvePool?.name||t?.name,curveApy:t?.curvePool?.apy?`${(Number(t.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:t?.apy?`${(Number(t.apy)*100).toFixed(2)}%`:null,tvl:t?.tvl,boosted:t?.boosted||!1}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function KS(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var GS,kf=S(()=>{W();GS="https://api.convexfinance.com/api"});function Ft(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function et(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Ft(t),Object.freeze({mantissa:e,scale:t})}function bt(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Ft(e.scale)}function To(e){return Ft(e),10n**BigInt(e)}function F(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return et(s,o.length)}function xe(e,t){if(Ft(t),typeof e=="bigint")return et(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return et(BigInt(e),t)}function Fe(e){bt(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function an(e,t){return bt(e),Ft(t),t===e.scale?et(e.mantissa,e.scale):t>e.scale?et(e.mantissa*To(t-e.scale),t):et(e.mantissa/To(e.scale-t),t)}function ua(e,t){bt(e,"left"),bt(t,"right");let r=Math.max(e.scale,t.scale);return[an(e,r),an(t,r),r]}function xt(e,t){let[r,n,o]=ua(e,t);return et(r.mantissa+n.mantissa,o)}function cn(e,t){let[r,n,o]=ua(e,t);return et(r.mantissa-n.mantissa,o)}function Ie(e,t){bt(e,"left"),bt(t,"right");let r=e.scale+t.scale;return Ft(r),et(e.mantissa*t.mantissa,r)}function De(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(bt(e,"left"),bt(t,"right"),Ft(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*To(t.scale+r),o=t.mantissa*To(e.scale);return et(n/o,r)}function St(e,t){let[r,n]=ua(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var JC,Ce=S(()=>{JC=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as _f,readFileSync as YS}from"node:fs";import{dirname as If,join as la}from"node:path";import{fileURLToPath as XS}from"node:url";function QS(e){let t=If(XS(e));for(let r=0;r<8;r+=1){let n=la(t,"package.json");if(_f(n))try{let i=JSON.parse(YS(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=If(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Oo(e,t){let r=QS(t),n=la(r,e);return _f(n)?n:la(r,"dist","assets",e)}var da=S(()=>{});import{readFileSync as ZS,existsSync as eE}from"node:fs";import{fileURLToPath as tE}from"node:url";import{dirname as rE,join as Of}from"node:path";function oE(){try{let e=Oo("equities-fixtures",import.meta.url);if(e&&eE(e))return e}catch{}return nE}function sE(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function z(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function ie(e,t,r){sE(e)||z(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&z(t,`${r} must be a nonempty string`)}function tt(e,t,r){Number.isSafeInteger(e)||z(t,`${r} must be a safe integer`)}function Et(e,t,r){ie(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),ie(o,t,`${r}.${n}`)}function aE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),ie(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];ie(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),Et(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))Et(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function cE(e,t){Et(e,t,"root"),Object.keys(e).length===0&&z(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||z(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function uE(e,t){ie(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])tt(e[r],t,r);G(e.usdg,t,"usdg"),Et(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&z(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&z(t,`assets.${r}.usd must be a nonnegative finite source number`)}function lE(e,t){ie(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||z(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&z(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>tt(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&z(t,`dates[${o}] must use YYYY-MM-DD`)})}function dE(e,t){ie(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&z(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{ie(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])tt(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&z(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&z(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function pE(e,t){Et(e,t,"root"),Object.keys(e).length===0&&z(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&z(t,`${r}.liq must be a nonnegative finite source number`)}}function fE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),tt(e.block,t,"block"),tt(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),Et(e.pools,t,"pools"),Object.keys(e.pools).length===0&&z(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&z(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&z(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&z(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function mE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),ie(e.books,t,"books"),Object.keys(e.books).length===0&&z(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){ie(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&z(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())ie(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())ie(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function hE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),Et(e.tokens,t,"tokens"),ie(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&z(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||z(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&z(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())ie(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&z(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&z(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function gE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&z(t,'chain must be "ton"'),Et(e.tokens,t,"tokens"),ie(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&z(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||z(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&z(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())ie(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&z(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&z(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function yE(e,t){let r=Cf[t],n=Of(e,r),o;try{o=ZS(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return wE[t](i,r),i}function Nf(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Nf(t)}return e}function pa({fixtureDir:e=iE}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Cf))t[r]=yE(e,r);return Nf(t)}function ut(){return Tf??=pa(),Tf}function _e(){return ut().venues}function Rf(){return ut().universe}function Pf(){return ut().oracles}function Lf(){return ut().nyseHolidays}function $f(){return ut().dstTransitions}function Co(){return ut().rhPoolState}function Bf(){return ut().solanaXstocks}function qf(){return ut().tonXstocks}function Ff(){return ut().hip3L2Books}var nE,iE,Cf,wE,Tf,Ue=S(()=>{da();nE=Of(rE(tE(import.meta.url)),"fixtures");iE=oE(),Cf=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});wE=Object.freeze({venues:aE,universe:cE,oracles:uE,nyseHolidays:lE,dstTransitions:dE,equityDexPools:pE,rhPoolState:fE,solanaXstocks:hE,tonXstocks:gE,hip3L2Books:mE})});function SE(){let e=$f().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*ma,endMs:n.endUtc*ma}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function Wf(){return Uf??=SE(),Uf}function EE(){return fa===void 0&&(fa=new Set(Lf().holidayDayIndex)),fa}function Gf(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function AE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Wf();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function vE(e){for(let t of Wf().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function kE(e){return vE(e)?xE:bE}function IE(e){let t=e+kE(e),r=Math.floor(t/Df),n=t-r*Df,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Mf),msIntoDay:n,weekday:o.getUTCDay()}}function _E({dayIndex:e,weekday:t}){return t===0||t===6?!1:!EE().has(e)}function TE(e){return e<jf?"dark":e<Hf?"extended":e<zf?"core":e<Vf?"extended":"dark"}function un(e){Gf(e,"sessionState"),AE(e,"sessionState");let t=IE(e);return _E(t)?TE(t.minuteOfDay):"dark"}function ga(e){return Gf(e,"isDark"),un(e)==="dark"}var ma,Mf,ha,Df,bE,xE,jf,Hf,zf,Vf,sN,aN,Uf,fa,No=S(()=>{Ue();ma=1e3,Mf=60*ma,ha=60*Mf,Df=24*ha,bE=-5*ha,xE=-4*ha,jf=240,Hf=570,zf=960,Vf=1200,sN=Object.freeze([jf,Hf,zf,Vf]),aN=Object.freeze(["core","extended","dark"])});function Po(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function NE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function RE(e){return!e.bid||!e.ask?!1:St(e.bid,e.ask)>0}function Jf(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function Lo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??OE,o=t.oracleFreshnessMs??CE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(NE(c)){i?s.push(Object.freeze({...c,staleData:!0})):Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(RE(c)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Jf(c,r,n)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=un(r),l=u==="core"?o:o*2;if(Jf(c,r,l)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Ro,OE,CE,wa=S(()=>{Ce();No();Ro=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),OE=12e4,CE=6e5});function PE(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[a,c=""]=s.split("."),u=`${a}${c}`,l=a.length+o,d;return l<=0?d=`0.${"0".repeat(-l)}${u}`:l>=u.length?d=`${u}${"0".repeat(l-u.length)}`:d=`${u.slice(0,l)}.${u.slice(l)}`,`${i?"-":""}${d}`}function de(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(PE(e))}function Me(e,t){let r=de(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Dt=S(()=>{Ce()});function ee(e,t){throw new TypeError(`${e} ${t}`)}function Xf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e,t){Xf(e)||ee(t,"must be an object")}function Qf(e,t,r){Object.hasOwn(e,t)||ee(`${r}.${t}`,"is required")}function yr(e,t){(typeof e!="string"||e.length===0)&&ee(t,"must be a nonempty string")}function ln(e,t,r){t.has(e)||ee(r,`must be one of ${[...t].join(", ")}`)}function ba(e,t){(!Number.isSafeInteger(e)||e<0)&&ee(t,"must be a nonnegative safe integer")}function ya(e,t,r=!1){e===null&&r||(Xf(e)||ee(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&ee(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&ee(`${t}.scale`,"must be a nonnegative safe integer"))}function $o(e,t,r=!1){e===null&&r||Ut(e,t)}function Yf(e,t){Ut(e,t),yr(e.venue,`${t}.venue`),yr(e.reason,`${t}.reason`),UE.test(e.reason)||ee(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&yr(e.symbol,`${t}.symbol`)}function Se(e){Ut(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Kf,"costAccounted","capturedAt","blockOrSeq","raw"])Qf(e,r,"quote");yr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&ee("quote.chain","must be a nonempty string or nonnegative chain id"),ln(e.instrument,LE,"quote.instrument"),ln(e.tier,$E,"quote.tier"),yr(e.symbolRaw,"quote.symbolRaw"),yr(e.symbol,"quote.symbol"),ln(e.side,BE,"quote.side"),ya(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&ee("quote.requestedSize","must not be negative");let t=0;for(let r of DE)Object.hasOwn(e,r)&&(ya(e[r],`quote.${r}`),t+=1);t===0&&ee("quote","must contain at least one of bid, ask, mid, mark");for(let r of Kf)ya(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&ee("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&ee(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&ee("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&ee("quote.fundingHourly","must be null for a spot quote"),ba(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&ee("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Ut(e.raw,"quote.raw"),e}function Bo(e){Ut(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Qf(e,t,"rankResult");return ln(e.rankedOn,qE,"rankResult.rankedOn"),Array.isArray(e.ranked)||ee("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>$o(t,`rankResult.ranked[${r}]`)),$o(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&ee("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&ee("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||ee("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>$o(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&ee("rankResult.improvementBps","must be a finite number or null"),ba(e.sourcesAnswered,"rankResult.sourcesAnswered"),ba(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&ee("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||ee("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Yf(t,`failed[${r}]`)),Array.isArray(e.excluded)||ee("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Yf(t,`excluded[${r}]`)),e.darkWindow!==null&&Ut(e.darkWindow,"rankResult.darkWindow"),ln(e.instrumentMix,FE,"rankResult.instrumentMix"),$o(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Ut(e.carry,"rankResult.carry"),e}var LE,$E,BE,qE,FE,DE,Kf,UE,lt=S(()=>{LE=new Set(["spot","perp"]),$E=new Set(["read-only","quote-only","prepare","intent"]),BE=new Set(["buy","sell"]),qE=new Set(["net-of-cost","gross"]),FE=new Set(["homogeneous","heterogeneous"]),DE=["bid","ask","mid","mark"],Kf=["fees","gasEstimate","priceImpact","fundingHourly"],UE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Zf(){return _e().venues.arcus}function zE(){return Object.keys(Zf().markets).sort()}function VE({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=Zf().markets[n];if(!o)return null;let i=Me(o.mark,`${n}.mark`),s=de(o.oracle),a=de(o.fundingHourly),c=r===null?F("0"):r,u={venue:ME,chain:jE,instrument:"perp",tier:HE,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:qo,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),Se(u)}function Fo({side:e="buy",sizeUsd:t=null}={}){return zE().map(r=>VE({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ME,jE,HE,qo,xa=S(()=>{Ue();Dt();Ce();lt();ME="arcus_perp",jE="robinhood-4663",HE="quote-only",qo="0.00000480324074074"});function Sa(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return F("0");let n=F(String(t)),o=xe(10000n,0);return Ie(Ie(e,n),o)}function tm(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=WE(n,t),c=t-a,u=F(qo),l=Sa(i,c),d=Sa(u,a),p=Math.max(l.scale,d.scale),f={mantissa:l.mantissa*10n**BigInt(p-l.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Fe(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:qo,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Sa(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Fe(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function WE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)ga(e+o*em)&&(r+=1);return t>n&&ga(e+n*em)&&(r+=t-n),r}var em,vN,rm=S(()=>{Ce();xa();No();em=36e5,vN=24*365});function GE(e){return e.mid??e.mark??e.ask??e.bid??null}function JE(e){let t=GE(e);if(t===null)return null;let r=e.costAccounted===!0,n=F("0");e.fees!==null?n=xt(n,e.fees):r=!1,e.priceImpact!==null?n=xt(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=xt(n,e.gasEstimate);let o;if(e.fees!==null&&St(e.fees,F("1"))<0&&St(e.fees,F("0"))>=0){let i=xt(F("1"),e.fees);o=Ie(t,i),e.priceImpact!==null&&(o=xt(o,Ie(t,e.priceImpact)))}else o=xt(t,n);return{net:o,costAccounted:r,px:t}}function KE(e,t,r=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:r,quote:e}}function YE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=cn(t.net,e.net);return De(Ie(r,xe(10000n,0)),t.net,4)}function Do(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let h=Lo(e,{nowMs:r});o=h.survivors,i=h.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let h of o){let E=JE(h);if(E===null)continue;let A=null;if(u&&h.instrument==="perp"&&(A=tm(h,c,{nowMs:r}),A.carryBps!==null)){let v=xt(F("1"),De(A.carryBps,xe(10000n,0),12));E.net=Ie(E.net,v),E.costAccounted=!1}l.push(KE(h,E,A))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let h=l.filter(A=>A.instrument==="spot"),E=l.filter(A=>A.instrument==="perp");h.length>0&&E.length>0?(d=h.length>=E.length?h:E,p="homogeneous"):(d=l,p="homogeneous")}d.sort((h,E)=>{let A=St(h.net,E.net);return A!==0?A:h.venue<E.venue?-1:h.venue>E.venue?1:0});let f=d[0]??null,m=d.slice(1),w=d,g="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(g="net-of-cost");let y=m.length===0?null:YE(f,m[0]),b=l.find(h=>h.tier==="prepare")??null,T=un(r),x=T==="core"?null:{session:T,warning:T==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},_=null;u&&(_=XE(l));let k={rankedOn:g,ranked:w,winner:f,runnersUp:m,improvementBps:y===null?null:Number(Fe(y)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:b,carry:f?.carry??null,breakEvenHorizonHours:_};return Bo(k)}function XE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>St(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>St(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=cn(t.net,r.net);if(n.mantissa===0n)return 0;let o=Ie(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=De(n,o,4),s=Number(Fe(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Ea=S(()=>{wa();rm();No();Ce();lt()});function Aa(){return Co()}function nA(e){return{mantissa:e*e*10n**BigInt(br)/tA,scale:br}}function oA(e){let t=nA(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=De(Ie(t,xe(10n**BigInt(r),0)),xe(10n**BigInt(n),0),br);return o.mantissa===0n?null:De(F("1"),o,br)}return De(Ie(t,xe(10n**BigInt(n),0)),xe(10n**BigInt(r),0),br)}function iA(e){let t=Pf(),r=t.assets[e];return r?xe(r.rawPrice,t.oracleScaleExp):null}function sA(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return De(t,aA(r,t),br)}function aA(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:an(e,r).mantissa+an(t,r).mantissa,scale:r}}function cA(e){let t=Aa(),r=rA[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function va(){return Object.keys(Aa().pools).sort()}function xr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Aa(),o=n.pools[e];if(!o)return null;let i=oA(o);if(i===null)return null;let s=de(o.liqUsd),a=r===null?F("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:De(xe(BigInt(o.feePpm),0),xe(1000000n,0),8),u=a.mantissa===0n?F("0"):sA(s,a),l=cA(o.version),f={venue:QE,chain:ZE,instrument:"spot",tier:eA,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:l===null?null:l.wei.toString(),gasUnits:l===null?null:l.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},m=iA(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Fe(De(Ie(cn(i,m),xe(10000n,0)),m,4))),Se(f)}function nm({side:e="buy",sizeUsd:t=null}={}){return va().map(r=>xr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var QE,ZE,eA,tA,br,rA,ka=S(()=>{Ue();Dt();Ce();lt();QE="rh_uniswap",ZE=4663,eA="prepare",tA=1n<<192n,br=18,rA=Object.freeze({v3:180000n,v4:240000n})});function Uo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=xr({symbol:t,side:r,sizeUsd:n});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>om)throw new Error(`quote is stale (${a}ms old, bound ${om}ms); re-quote before preparing`);let u=Co().pools[t],l=u.version==="v4"?lA:uA,d=l,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var om,uA,lA,Ia=S(()=>{ka();Ue();om=12e4,uA="0x0000000000000000000000000000000000000000",lA="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function dn(){return _e().venues.hyperliquid_hip3}function im(){return Object.keys(dn().dexs).sort()}function mA(){let e=[];for(let[t,r]of Object.entries(dn().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function hA(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=dn().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(dn().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function gA(e,t){try{return Ff().books[`${e}:${t}`]??null}catch{return null}}function wA(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(Fe(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,p=Math.min(o,d),f=p/u;if(i+=p,s+=f,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function yA(e,t,r,n){let o=wA(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Fe(n));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:de(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function sm({dex:e,ticker:t,market:r,side:n,size:o}){let i=Me(r.mark,`${e}:${t}.mark`),s=de(r.fundingHourly),a=de(r.vol24h),c=de(r.oi),u=o===null?F("0"):o,l=gA(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let g=yA(l,n,u,i);d=g.impact,p=g.depth,p?.fullyFilled?f="impact measured from l2Book; fees and gas still not captured":f="book walked but size exceeds visible depth; fees and gas not captured"}else f="no order book depth wired for this coin; fees and gas not captured";else l?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let w={venue:dA,chain:pA,instrument:"perp",tier:fA,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(w.raw.vol24hFixed=a),c!==null&&(w.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(w.bid=F(String(l.bids[0].px)),w.ask=F(String(l.asks[0].px))),Se(w)}function am({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=hA(e);return n.length===0||n.length>1?null:sm({...n[0],side:t,size:r})}function Mo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of mA()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=dn().dexs[i][s];n.push(sm({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var dA,pA,fA,cm=S(()=>{Ue();Dt();Ce();lt();dA="hyperliquid_hip3",pA="hyperliquid",fA="quote-only"});function um(){return _e().venues.arcus_spot}function EA(){return Object.keys(um().pairs).sort()}function AA({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=um().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Me(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Me(n.ask,`${e}.ask`),s=de(n.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),f=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+f,scale:d+1},a={mantissa:(p+f)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=r===null?F("0"):r,u=F("0"),l={venue:bA,chain:xA,instrument:"spot",tier:SA,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(l.bid=o),i!==null&&(l.ask=i),a!==null&&(l.mid=a),Se(l)}function jo({side:e="buy",sizeUsd:t=null}={}){return EA().map(r=>AA({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var bA,xA,SA,lm=S(()=>{Ue();Dt();Ce();lt();bA="arcus_spot",xA="robinhood-4663",SA="quote-only"});function Ho(){return Bf()}function _a(){return Object.keys(Ho().tokens).sort()}function _A(e){let t=Ho().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function TA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Ta({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Ho().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=_A(n);if(!s||!a)return null;let c=Me(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):TA(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=dm&&(p=!1);let f={venue:vA,chain:kA,instrument:"spot",tier:IA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ho().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<dm}};return Se(f)}function pm({side:e="buy",sizeUsd:t=null}={}){return _a().map(r=>Ta({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var vA,kA,IA,dm,fm=S(()=>{Ue();Dt();Ce();lt();vA="solana_xstocks",kA="solana",IA="quote-only",dm=25e3});function zo(){return qf()}function Oa(){return Object.keys(zo().tokens).sort()}function LA(e){let t=zo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function $A(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Ca({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=zo().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=LA(n);if(!s||!a)return null;let c=Me(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):$A(u,l),f={venue:OA,chain:CA,instrument:"spot",tier:NA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:zo().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<RA,impactSizeFractionHint:PA}};return Se(f)}function mm({side:e="buy",sizeUsd:t=null}={}){return Oa().map(r=>Ca({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var OA,CA,NA,RA,PA,hm=S(()=>{Ue();Dt();Ce();lt();OA="ton_stonfi",CA="ton",NA="quote-only",RA=25e3,PA=.01});var Vo={};M(Vo,{bestEquityRoute:()=>BA,collectEquityQuotes:()=>wm,equityVenues:()=>qA,getUniverse:()=>Rf,getVenues:()=>_e,loadFixtures:()=>pa,prepareEquity:()=>Uo,prepareEquityRoute:()=>FA,rankEquityQuotes:()=>Do,toJsonSafe:()=>DA,validateQuote:()=>Se,validateRankResult:()=>Bo});function Na(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function wm(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Na(t),o=[],i=am({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Mo({ticker:r,sizeUsd:n}))o.push(u);for(let u of Fo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of jo({sizeUsd:n}))u.symbol===r&&o.push(u);let s=xr({symbol:r,sizeUsd:n});s&&o.push(s);let a=Ta({symbol:r,sizeUsd:n});a&&o.push(a);let c=Ca({symbol:r,sizeUsd:n});return c&&o.push(c),o}function BA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Na(e.sizeUsd??e.size??null),n=wm(t,{sizeUsd:r});if(n.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=n[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=Do(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>gm}}function qA(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Mo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Fo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:jo().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:va().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:_a().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Oa().length}],t=[...Mo(),...Fo(),...jo(),...nm(),...pm(),...mm()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=Lo(t,{nowMs:r});return{inventory:e,hip3Dexs:im(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:_e().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function FA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=Na(e.sizeUsd??e.size??null),o=xr({symbol:t,sizeUsd:n});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=Uo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>gm}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function DA(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var gm,Wo=S(()=>{Ce();Ea();Ia();wa();cm();lm();xa();ka();fm();hm();Ue();Ea();Ia();lt();Ue();gm=3600*1e3});var Go={};M(Go,{CHAIN_CONFIGS:()=>sn,EVIDENCE:()=>B,RISK:()=>$,SCANNER_CAPABILITIES:()=>dr,__clearScanners:()=>$b,createScanner:()=>Pd,getScanner:()=>Ds,listScanners:()=>Ld,registerBuiltinScanners:()=>Ao,registerCustomChain:()=>Hp,registerScanner:()=>co,scannerCoverage:()=>Bb,validateScanner:()=>Rd});var Jo=S(()=>{wt();vo()});var ym={};M(ym,{classifyReceipt:()=>Ra});function Ra(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var Pa=S(()=>{});var Fa={};M(Fa,{createWatch:()=>qa,listWatches:()=>Ba,removeWatch:()=>HA});import pn from"node:fs";import La from"node:path";import{randomUUID as UA}from"node:crypto";import{homedir as MA}from"node:os";function jA(e=process.env){return e.ORACLE_CONFIG_DIR||La.join(MA(),".config","oracle")}function bm(e=process.env){return La.join(jA(e),"watches.json")}function $a(e=process.env){let t=bm(e);if(!pn.existsSync(t))return{watches:[]};try{let r=JSON.parse(pn.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function xm(e,t=process.env){let r=bm(t);pn.mkdirSync(La.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;pn.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
-
`,{mode:384}),pn.renameSync(n,r)}function Ba(e=process.env){return $a(e).watches}function qa({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:UA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=$a(o);return s.watches.push(i),xm(s,o),i}function HA(e,t=process.env){let r=$a(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(xm({watches:n},t),!0)}var Ko=S(()=>{});function Da(e){let t=VA[Number(e)]||[];return new Set([...t,...zA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var zA,VA,Ua=S(()=>{zA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],VA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});import{isAddress as L2}from"ethers";var Ma=S(()=>{ke();jr();sr()});import{Interface as JA,isAddress as U2}from"ethers";var z2,Sm=S(()=>{Ma();jr();sr();z2=new JA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as KA,isAddress as G2}from"ethers";var X2,Q2,Em=S(()=>{Ma();jr();sr();X2=new KA(["function approve(address spender,uint256 amount) returns (bool)"]),Q2=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var Mt=S(()=>{});import{Interface as YA,MaxUint256 as oR,isAddress as iR,keccak256 as sR,toUtf8Bytes as aR}from"ethers";var fR,fn=S(()=>{Ua();Sm();Em();Mt();sr();fR=new YA(["function approve(address spender,uint256 amount) returns (bool)"])});var Yo=S(()=>{fn()});import{Address as yR,NETWORK as bR,OutScript as xR,RawTx as SR,SigHash as ER,TEST_NETWORK as AR,Transaction as vR}from"@scure/btc-signer";var za=S(()=>{});import{createHash as QA}from"node:crypto";import{base58 as TR}from"@scure/base";import{getCompiledTransactionMessageDecoder as CR}from"@solana/transaction-messages";var Am,NR,Va=S(()=>{Am=e=>QA("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),NR=new Map([[Am("route"),{name:"route",prefixBytes:0}],[Am("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var vm=S(()=>{Cn()});var DR,UR,Ga=S(()=>{Mt();vm();DR=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),UR=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var HR,Ja=S(()=>{Mt();HR="0x"+"00".repeat(32)});var ZA,JR,Ka=S(()=>{Ja();Mt();ZA=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),JR=Object.freeze(ZA.map(e=>e[0]))});var Xo=S(()=>{Mt()});import{Interface as Om}from"ethers";var ov,pP,iv,fP,mP,hP,gP,sv,wP,Qo=S(()=>{fn();ke();ge();Yo();za();Va();Ga();Ka();Xo();ov=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]),pP=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0}),iv=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),fP=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),mP=new Om(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),hP=new Om(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),gP=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),sv=Object.freeze([...ov]),wP=Object.freeze({...iv})});import{encode as xP}from"@msgpack/msgpack";import{keccak256 as EP,verifyTypedData as AP}from"ethers";var vP,kP,Ya=S(()=>{vP=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),kP=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Xa=S(()=>{Xo()});import{ed25519 as PP}from"@noble/curves/ed25519.js";import{base58 as $P}from"@scure/base";import{RawTx as qP,SigHash as FP,Transaction as DP}from"@scure/btc-signer";import{Transaction as MP,keccak256 as jP,verifyTypedData as HP}from"ethers";var Qa=S(()=>{Ya();Xa()});import{base58 as YP}from"@scure/base";var Zo=S(()=>{Qo();Yo();fn();Qa()});var Nm=S(()=>{Zo();Qo()});import jt from"node:fs";function uv(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function ei(e){let t;try{t=jt.openSync(e,jt.constants.O_RDONLY|jt.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=jt.fstatSync(t);if(uv(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=jt.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return jt.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{jt.closeSync(t)}}var uL,lL,dL,ti=S(()=>{uL=Object.freeze({N:1<<17,r:8,p:1}),lL=256*1024*1024,dL=16*1024});var fL,Rm=S(()=>{fL=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});var wL,yL,bL,Pm=S(()=>{Kt();wL="0".repeat(64),yL=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),bL=Promise.resolve()});var Lm=S(()=>{Pm();Mt();ti();Zo()});var $m=S(()=>{});import{Wallet as OL}from"ethers";import{base58 as NL}from"@scure/base";import{ed25519 as PL}from"@noble/curves/ed25519.js";import{NETWORK as $L,TEST_NETWORK as BL,WIF as qL,p2wpkh as FL}from"@scure/btc-signer";import{pubECDSA as UL}from"@scure/btc-signer/utils.js";var Bm=S(()=>{});import je from"node:path";import dv from"node:os";import{createHash as pv,randomBytes as y$}from"node:crypto";import{Interface as Za,keccak256 as x$}from"ethers";import{Transaction as E$}from"@scure/btc-signer";import{ed25519 as v$}from"@noble/curves/ed25519.js";function ec(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||je.join(process.env.XDG_STATE_HOME||je.join(dv.homedir(),".local","state"),"oracle"),r=pv("sha256").update(je.resolve(e)).digest("hex").slice(0,16);return{vault:je.join(e,"vault.json"),policy:je.join(e,"signer-policy.json"),policyKey:je.join(e,"policy-integrity-key"),policyAnchor:je.join(t,`signer-policy-${r}.high-water`),ledger:je.join(e,"signer-ledger.json"),ledgerAnchor:je.join(t,`signer-ledger-${r}.high-water`),token:je.join(e,"signer-token"),lock:je.join(t,`signer-${r}.lock`)}}var W$,G$,J$,qm=S(()=>{Nm();Zo();ti();Rm();Lm();$m();fn();Qo();Yo();Qa();Ga();Ka();Xo();Xa();Ja();Ya();za();Va();Bm();W$=new Za(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),G$=new Za(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),J$=new Za(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var Ht={};M(Ht,{CRYPTO_DESK_TOOLS:()=>yv,runCryptoDeskTool:()=>wv,signerAck:()=>Hm,signerDeny:()=>zm,signerPending:()=>Mm,signerQueue:()=>jm,signerStatus:()=>Um,vaultStatus:()=>Dm});import tc from"node:fs";import rc from"node:path";import{homedir as fv}from"node:os";function Fm(){return process.env.ORACLE_CONFIG_DIR||rc.join(fv(),".config","oracle")}function Dm(){let e=ec(rc.join(Fm(),"signer")),t=tc.existsSync(e.vault),r=tc.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:tc.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function hv(){let e=process.env.ORACLE_SIGNER_HOST||"127.0.0.1";if(!mv.has(e))throw new Error("signer: loopback host required");let t=Number(process.env.ORACLE_SIGNER_PORT||9462);if(!Number.isInteger(t)||t<1||t>65535)throw new Error("signer: invalid port");return{host:e,port:t,origin:`http://${e}`}}function gv(){let e=ec(rc.join(Fm(),"signer"));return ei(e.token)}async function At(e,t,r){let{host:n,port:o,origin:i}=hv(),s;try{s=gv()}catch{throw new Error("local signer is not running")}if(!s)throw new Error("local signer is not running");let a;try{a=await fetch(`http://${n}:${o}${t}`,{method:e,headers:{authorization:`Bearer ${s}`,origin:i,host:`${n}:${o}`,...r?{"content-type":"application/json"}:{}},body:r?JSON.stringify(r):void 0})}catch{throw new Error("local signer is not running")}let c=await a.json().catch(()=>({}));if(!a.ok)throw new Error(c?.error||`signer ${a.status}`);return c}async function Um(){try{return{ok:!0,running:!0,...await At("GET","/status")}}catch{try{return{ok:!0,running:!0,...await At("GET","/health")}}catch{return{ok:!1,running:!1,error:"local signer is not running"}}}}function nc(e={}){let{confirmationNonce:t,token:r,authorization:n,...o}=e&&typeof e=="object"?e:{};return o}async function Mm(){try{let e=await At("GET","/pending");return{ok:!0,running:!0,items:Array.isArray(e.items)?e.items:[],armed:e.armed===!0,execution:!1,note:"Queue with signer_queue, fill with signer_ack when the loopback signer is armed."}}catch{return{ok:!1,running:!1,items:[],error:"local signer is not running"}}}async function jm(e){if(!e||typeof e!="object")return{ok:!1,error:"artifact required"};try{let t=await At("POST","/pending",{artifact:e});return{ok:!0,queued:!0,execution:!1,...nc(t)}}catch(t){return{ok:!1,queued:!1,error:String(t?.message||t)}}}async function Hm(e){let t=String(e||"").trim();if(!t)return{ok:!1,executed:!1,error:"id required"};try{let r=await At("POST","/ack",{id:t});return{ok:!0,executed:r.executed===!0,...nc(r)}}catch(r){return{ok:!1,executed:!1,error:String(r?.message||r)}}}async function zm(e){let t=String(e||"").trim();if(!t)return{ok:!1,denied:!1,error:"id required"};try{let r=await At("POST","/deny",{id:t});return{ok:!0,denied:r.denied===!0,...nc(r)}}catch(r){return{ok:!1,denied:!1,error:String(r?.message||r)}}}async function wv(e,t={}){if(e==="vault_status")return{ok:!0,...Dm()};if(e==="signer_status")return Um();if(e==="signer_pending")return Mm();if(e==="signer_queue")return jm(t?.artifact);if(e==="signer_ack")return Hm(t?.id||t?.digest);if(e==="signer_deny")return zm(t?.id||t?.digest);if(e==="signer_execute"){if(!t?.artifact||!t?.confirmationNonce)throw new Error("signer_execute requires artifact and confirmationNonce from a local human confirm");return{ok:!0,...await At("POST","/execute",{artifact:t.artifact,confirmationNonce:t.confirmationNonce})}}if(e==="signer_disarm")return{ok:!0,...await At("POST","/disarm")};if(e==="receipt_report")return{ok:!0,...Ra(t?.receipt||t)};if(e==="watch_create")return{ok:!0,watch:qa(t)};if(e==="watch_list")return{ok:!0,watches:Ba()};if(e==="portfolio_snapshot")return{ok:!0,note:"use oracle_cli data call portfolio snapshot \u2014 knownUsd is incomplete if a provider is missing",hint:["data","call","portfolio","snapshot"]};throw new Error(`unknown crypto desk tool: ${e}`)}var mv,yv,zt=S(()=>{Pa();Ko();qm();ti();mv=new Set(["127.0.0.1","::1","localhost"]);yv=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function Av(e){return!(Ev.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Vm(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
8
|
-
`),n=[...new Set((r.match(
|
|
9
|
-
`)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var bv,xv,Sv,Ev,Gm=S(()=>{bv=/\b0x[a-fA-F0-9]{40}\b/g,xv=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,Sv=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),Ev=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});function Lv(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function $v(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function ri(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||kv))return r;let n=t.fileRead?$v:Lv;r=r.replace(Tv,"[REDACTED_PRIVATE_KEY]"),r=r.replace(_v,"[REDACTED_EVM_KEY]"),r=r.replace(Ov,o=>n(o));for(let o of Iv)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(Cv,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(Nv,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(Rv,(o,i,s,a)=>`${i}${n(s)}${a}`),r}var vv,kv,Iv,_v,Tv,Ov,Cv,Nv,Rv,Pv,o6,Jm=S(()=>{vv=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),kv=["1","true","yes","on"].includes(vv),Iv=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],_v=/\b0x[a-fA-F0-9]{64}\b/g,Tv=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Ov=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Cv=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,Nv=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,Rv=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Pv=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),o6=new Set([...Pv].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import{spawnSync as Bv}from"node:child_process";import Km from"node:fs";import oc from"node:path";function Uv(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Qm(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Mv(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return oc.isAbsolute(t)?Km.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(oc.delimiter)){if(!n)continue;let o=oc.join(n,"xurl");try{if(Km.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function jv(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function Hv(e){for(let t of e){let r=String(t);if(Xm.includes(r))return r;if(Xm.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function zv(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(l=>String(l)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=Hv(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!Qm(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(l=>l==="-X"||l==="--request"),u=String(r[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!Fv.includes(o))if(Dv.includes(o)){if(!Qm(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...r],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function Zm(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!Uv(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=zv(t,n);if(!o.ok)return o;let i=Mv(n);if(!i.ok)return i;let a=(r.spawnFn||Bv)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Ym,maxBuffer:1024*1024,env:jv(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Ym}ms`:String(a.error.message||a.error);return{ok:!1,error:ri(d,{force:!0})}}let c=ri(String(a.stdout||"").slice(0,qv),{force:!0}),u=ri(String(a.stderr||"").slice(0,2e3),{force:!0}),l=typeof a.status=="number"?a.status:1;return{ok:l===0,status:l,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:c,stderr:u||void 0}}var Ym,qv,Fv,Dv,Xm,l6,eh=S(()=>{Jm();Ym=45e3,qv=4e4,Fv=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),Dv=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Xm=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);l6=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function Jv(e){return!e||e==="0x"||e===Gv}async function th(e={},t={}){let r=t.rpcCall||X,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await r(o,"eth_getCode",[n,"latest"],t)}catch(m){return{address:n,chainId:o,status:"unavailable",error:m?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:n,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[m,w]of Object.entries(Vv))c.includes(m)&&a.push({selector:`0x${m}`,...w});let u=!1,l=null,d=null;for(let{label:m,slot:w}of Wv)try{let g=await r(o,"eth_getStorageAt",[n,w,"latest"],t);if(!Jv(g)){u=!0,l=m,d=`0x${String(g).slice(-40)}`;break}}catch{s.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}u&&(a.push({selector:l,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${l}), not the implementation ${d} it delegates to`));let f=a.filter(m=>m.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:f,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var Vv,Wv,Gv,rh=S(()=>{at();Vv=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),Wv=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),Gv=`0x${"0".repeat(64)}`});function ni(e,t){let r=String(e||"").trim();if(!Kv.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function ic(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function mn(e,t){return e==null||e===""?null:ic(e,t)}function Xv({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let l=a?.tx;if(!l||typeof l!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=ni(l.to,"prepared destination"),p=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=ic(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=mn(l.gasLimit??c.gasLimit,"gasLimit"),w=mn(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!w)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let g=Number(u.nowMs??Date.now()),y=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),b=Ss({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:y,secret:u.routeAttestationSecret}),T=ve(b,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:w,slippageBps:T.selectedBps,expiresAtMs:g+y},_=mn(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return _&&(x.maxPriorityFeePerGas=_),c.nonce!==void 0&&(x.nonce=Number(c.nonce)),(c.txType!==void 0||_)&&(x.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(x.l1FeeWei=mn(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=mn(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:T.selectedBps,expiresAtMs:g+y,fee:{oracleFeeBps:5},autoSlippage:T,artifact:{chainId:e,owner:o,transactions:[x]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function Qv(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}Ao();let r=Ds(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function Zv({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==B.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==$.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==$.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==B.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function nh(e={},t={}){let r=Number(e.chainId??Yv);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=ni(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ni(e.tokenIn,"tokenIn"):null,i=e.recipient?ni(e.recipient,"recipient"):null,s=e.amountIn==null?null:ic(e.amountIn,"amountIn"),a=Qv(r,t.scanner),c=t.scanContractRisk||th,[u,l,d]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let w={...e,tokenIn:o,amountIn:s,recipient:i},g=Zv({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:w,scanner:a}),y=null,b=null,T=null;if(e.prepare===!0&&g.length===0){y=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{b=Xv({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:y,args:e,opts:t})}catch(x){T=String(x?.message||x).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!b,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:g,prepared:!!y,unsignedTx:y,localSignerEnvelope:b,localSignerBlockedReason:T,signed:b?"pending-local-signer":!1,broadcast:b?"pending-local-signer":!1}}var Kv,Yv,oh=S(()=>{vo();wt();ke();rh();Kv=/^0x[0-9a-fA-F]{40}$/,Yv=4663});var uh={};M(uh,{evaluateContracts:()=>ch,fetchAccountTweets:()=>ah,snipeExecuteEnabled:()=>ih,tickTwitterCaWatch:()=>ik,twitterSnipeEmitsCard:()=>sk});function ih(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function sh(e){return String(e||"").trim().replace(/^@/,"")}async function ah({handle:e,limit:t=5,xurlFn:r=Zm}={},n={}){let o=sh(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:Wm(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function nk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await nh({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function ok(e,t){let r=await gd(e,{chainSlug:"solana",stables:[tk,rk]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function ch(e,t={},r={}){let n=Number(t.chainId??ek),o=[];for(let i of e.evm||[])o.push(await nk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await ok(i,r));return o}async function ik(e={},t={}){let r=sh(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await ah({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Vm(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||ch)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:ih(t.env||process.env),hits:i,seen:[...n]}}function sk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var ek,tk,rk,lh=S(()=>{Gm();eh();oh();Gr();Kt();ek=4663,tk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",rk="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import He from"node:fs";import vt from"node:path";function hn(e){try{let t=He.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function ck(){return He.constants.O_NOFOLLOW||0}function ac(e){try{let t=He.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function dh(e){if(!ac(e))return null;let t=He.openSync(e,He.constants.O_RDONLY|ck());try{return He.readFileSync(t,"utf8")}finally{He.closeSync(t)}}function uk(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==sc&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${sc})`):t.push("$schema is required \u2014 must be "+sc)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):ak.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let n=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))n.has(o)||r.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function lk(e){let t=vt.join(e,"skills"),r=[];if(!hn(t))return r;function n(o,i=""){for(let s of He.readdirSync(o,{withFileTypes:!0})){let a=vt.join(o,s.name);if(s.isDirectory()){if(!hn(a))continue;n(a,i?`${i}/${s.name}`:s.name)}else if(s.name.endsWith(".md")){if(!ac(a))continue;let c=i?`${i}/${s.name.replace(/\.md$/,"")}`:s.name.replace(/\.md$/,"");r.push({name:c,path:a,relativePath:vt.relative(t,a)})}}}return n(t),r}function dk(e){let t=vt.join(e,"mcp"),r=[];if(!hn(t))return r;for(let n of He.readdirSync(t,{withFileTypes:!0})){if(!n.isFile()||!n.name.endsWith(".json"))continue;let o=vt.join(t,n.name);if(ac(o))try{let i=dh(o);if(i===null)continue;let s=JSON.parse(i);r.push({name:n.name.replace(/\.json$/,""),path:o,config:s})}catch(i){r.push({name:n.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return r}function pk(e){let t=vt.resolve(e);if(!hn(t))return{ok:!1,error:`plugin directory not found: ${t}`};let r=vt.join(t,"plugin.json");if(!He.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let n;try{let a=dh(r);if(a===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};n=JSON.parse(a)}catch(a){return{ok:!1,error:`invalid plugin.json: ${a.message}`}}let o=uk(n);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=lk(t),s=dk(t);return{ok:!0,plugin:{name:n.name,version:n.version||"0.0.0",description:n.description||"",author:n.author||{},license:n.license||"UNLICENSED",root:t,manifest:n,skills:i,mcpServers:s,warnings:[...o.warnings]}}}function ph(e){let t=[];if(!hn(e))return t;for(let r of He.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let n=vt.join(e,r.name),o=pk(n);o.ok&&t.push(o.plugin)}return t}var sc,ak,fh=S(()=>{sc="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",ak=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/});import Sr from"node:fs";import mh from"node:path";import{homedir as fk}from"node:os";function bk(e=process.env){return e&&e.ORACLE_CONFIG_DIR||mh.join(fk(),".config","oracle")}function xk(e=process.env){return mh.join(bk(e),"plugins")}function Sk(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),n=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,64);return mk.test(o)?o:null}function Ek(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24),n=String(t||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,16);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,40);return hk.test(o)?o:null}function Ak(e,t){let r=String(t||"").match(/^description:\s*(.+)$/m);return r?r[1].trim().slice(0,200):(String(t||"").split(`
|
|
10
|
-
`)[0].replace(/^#+\s*/,"").trim()||e).slice(0,200)}function vk(e){try{let t=Sr.lstatSync(e);if(t.isSymbolicLink()||!t.isFile()||t.size>yk)return null;let r=Sr.openSync(e,Sr.constants.O_RDONLY|(Sr.constants.O_NOFOLLOW||0));try{return Sr.readFileSync(r,"utf8")}finally{Sr.closeSync(r)}}catch{return null}}function kk(e,t,r){if(!r||typeof r!="object"||Array.isArray(r)||r.error)return null;let n=Ek(e,t);if(!n)return null;let o=typeof r.command=="string"?r.command.trim():"";if(!o)return null;let i=Array.isArray(r.args)?r.args.filter(a=>typeof a=="string"):[],s=r.env&&typeof r.env=="object"&&!Array.isArray(r.env)?Object.fromEntries(Object.entries(r.env).filter(([a,c])=>typeof a=="string"&&typeof c=="string")):{};return{name:n,command:o,args:i,env:s,enabled:r.enabled!==!1,source:`plugin:${e}`}}function hh(e={}){let t=e.env||process.env,r=e.pluginsDir||xk(t),n=e.scan||ph,o=[];try{o=n(r)||[]}catch{return{pluginsDir:r,plugins:[],skills:[],mcpServers:[]}}let i=[],s=[],a=new Set,c=new Set,u=[];for(let l of o){if(!l||typeof l!="object")continue;let d=typeof l.name=="string"?l.name:"";if(!d)continue;u.push({name:d,version:l.version||"0.0.0",root:l.root,skillCount:0,mcpCount:0});let p=u[u.length-1];for(let f of l.skills||[]){if(i.length>=gk)break;let m=Sk(d,f?.name||f?.relativePath);if(!m||a.has(m))continue;let w=typeof f.content=="string"?f.content:vk(f?.path);w!=null&&(a.add(m),p.skillCount+=1,i.push({name:m,description:Ak(m,w),path:f.path,size:w.length,content:w,source:`plugin:${d}`,plugin:d}))}for(let f of l.mcpServers||[]){if(s.length>=wk)break;if(f?.error)continue;let m=kk(d,f?.name,f?.config||f);!m||c.has(m.name)||(c.add(m.name),p.mcpCount+=1,s.push(m))}}return{pluginsDir:r,plugins:u,skills:i,mcpServers:s}}var mk,hk,gk,wk,yk,gh=S(()=>{fh();mk=/^[a-z0-9][a-z0-9_-]{0,63}$/,hk=/^[a-z0-9][a-z0-9-]*$/,gk=128,wk=16,yk=64*1024});var uc={};M(uc,{SKILL_TOOLS:()=>Bk,createSkill:()=>$k,getSkillsBlock:()=>Lk,listSkills:()=>Sh,loadSkill:()=>Pk});import J from"node:fs";import Ne from"node:path";import{homedir as Ik}from"node:os";function _k(){return process.env.ORACLE_CONFIG_DIR||Ne.join(Ik(),".config","oracle")}function kt(){return Ne.join(_k(),"skills")}function cc(e){J.existsSync(e)||J.mkdirSync(e,{recursive:!0,mode:448});let t=J.lstatSync(e);if(t.isSymbolicLink()||!t.isDirectory())throw new Error("skills directory must be a real directory")}function wh(){return J.constants.O_NOFOLLOW||0}function It(e){let t=J.lstatSync(e);if(t.isSymbolicLink()||!t.isFile())return null;let r=J.openSync(e,J.constants.O_RDONLY|wh());try{return J.readFileSync(r,"utf8")}finally{J.closeSync(r)}}function Tk(e,t){if(J.existsSync(e)){let n=J.lstatSync(e);if(n.isSymbolicLink()||!n.isFile())throw new Error("skill path must be a regular file")}let r=J.openSync(e,J.constants.O_WRONLY|J.constants.O_CREAT|J.constants.O_TRUNC|wh(),384);try{J.writeFileSync(r,t)}finally{J.closeSync(r)}try{J.chmodSync(e,384)}catch{}}function yh(e){let t=String(e??"").trim();if(!Vt.test(t))throw new Error("invalid skill name");return Ne.join(kt(),`${t}.md`)}function oi(e,t){let r=t.match(/^description:\s*(.+)$/m);return r?r[1].trim():t.split(`
|
|
11
|
-
`)[0].replace(/^#+\s*/,"").trim()||e}function Ok(){let e=[];for(let t of J.readdirSync(gn,{withFileTypes:!0})){let r,n;if(t.isFile()&&t.name.endsWith(".md"))r=t.name.replace(/\.md$/,""),n=Ne.join(gn,t.name);else if(t.isDirectory()&&Vt.test(t.name))r=t.name,n=Ne.join(gn,t.name,"SKILL.md");else continue;if(!Vt.test(r)||!J.existsSync(n))continue;let o=It(n);o!==null&&e.push({name:r,description:oi(r,o),path:n,size:o.length})}return e}function Ck(e=process.env){let t=String(e.ORACLE_ADMIN||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Nk(e=process.env){return String(e.ORACLE_ADMIN_SKILLS_DIR||"").trim()||null}function Rk(e){let t=[];if(!e||!J.existsSync(e))return t;let r=J.lstatSync(e);if(r.isSymbolicLink()||!r.isDirectory())return t;let n=[e];for(;n.length;){let o=n.pop(),i=[];try{i=J.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let s of i){if(s.name.startsWith("."))continue;let a=Ne.join(o,s.name);if(s.isDirectory()){n.push(a);continue}if(!s.isFile())continue;let c;if(s.name==="SKILL.md")c=Ne.basename(o);else if(s.name.endsWith(".md"))c=s.name.replace(/\.md$/,"");else continue;if(!Vt.test(c))continue;let u=It(a);u!==null&&t.push({name:c,description:oi(c,u),path:a,size:u.length,source:"admin"})}}return t}function bh(){return Ck()?Rk(Nk()):[]}function xh(){try{return(hh().skills||[]).map(t=>({name:t.name,description:t.description,path:t.path,size:t.size,source:t.source,content:t.content}))}catch{return[]}}function Sh(){try{cc(kt());let e=new Map(Ok().map(t=>[t.name,t]));for(let t of xh())e.has(t.name)||e.set(t.name,t);for(let t of bh())e.set(t.name,t);for(let t of J.readdirSync(kt(),{withFileTypes:!0})){if(t.isFile()&&t.name.endsWith(".md")){let r=Ne.join(kt(),t.name),n=It(r);if(n===null)continue;let o=t.name.replace(/\.md$/,"");if(!Vt.test(o))continue;e.set(o,{name:o,description:oi(o,n),path:r,size:n.length});continue}if(t.isDirectory()&&Vt.test(t.name)){let r=Ne.join(kt(),t.name,"SKILL.md");if(!J.existsSync(r))continue;let n=It(r);if(n===null)continue;e.set(t.name,{name:t.name,description:oi(t.name,n),path:r,size:n.length})}}return[...e.values()].sort((t,r)=>t.name.localeCompare(r.name))}catch{return[]}}function Pk(e){try{cc(kt());let t=yh(e);if(J.existsSync(t))return It(t);let r=Ne.join(kt(),e,"SKILL.md");if(Vt.test(e)&&J.existsSync(r))return It(r);for(let n of bh())if(n.name===e)return It(n.path);for(let n of xh())if(n.name===e&&typeof n.content=="string")return n.content;for(let n of[Ne.join(gn,e,"SKILL.md"),Ne.join(gn,`${e}.md`)]){if(!J.existsSync(n))continue;let o=It(n);if(o!==null)return o}return null}catch{return null}}function Lk(e){let t=Sh();if(t.length===0)return`## Skills
|
|
12
|
-
No skills installed. Use skill_create to save a successful workflow.
|
|
13
|
-
`;let r=t;if(e){let o=e.toLowerCase();r=[...t].sort((i,s)=>{let a=(i.name.toLowerCase().includes(o)?2:0)+(i.description.toLowerCase().includes(o)?1:0);return(s.name.toLowerCase().includes(o)?2:0)+(s.description.toLowerCase().includes(o)?1:0)-a})}return["## Skills","Available (use skill_load <name>):",...r.map(o=>`- **${o.name}**: ${o.description}`)].join(`
|
|
14
|
-
`)}function $k(e,t){cc(kt());let r=yh(e);if(J.existsSync(r)&&!J.lstatSync(r).isFile())throw new Error("skill path must be a regular file");Tk(r,t)}var gn,Vt,Bk,lc=S(()=>{da();gh();gn=Oo("skills",import.meta.url),Vt=/^[a-z0-9][a-z0-9_-]{0,63}$/;Bk=[{type:"function",function:{name:"skill_load",description:"Load full content of a skill by name.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Skill name using lowercase letters, digits, hyphens, or underscores"}},required:["name"],additionalProperties:!1}}},{type:"function",function:{name:"skill_create",description:"Save a new skill from a verified workflow. Refused without a verifier pass this turn.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Lowercase letters, digits, hyphens, or underscores"},content:{type:"string",description:"Full SKILL.md content"}},required:["name","content"],additionalProperties:!1}}},{type:"function",function:{name:"skill_list",description:"List all installed skills.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]});import{wordlists as qk}from"ethers";function Mk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Uk.has(t.length)&&t.every(r=>qk.en.getWordIndex(r)>=0)}function Vk(e){let t=Eh(e);return zk.has(t)||Hk.test(t)}function Eh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Wk(e){let t=Eh(e);return[...Fk].some(r=>t.includes(r))}function Gk(e,t,r){if(typeof t=="string"){if(Dk.some(n=>n.test(t))||Mk(t))throw new wn(r);if(jk.test(t)&&!Vk(e))throw new wn(r)}}function dc(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Gk(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>dc(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(Wk(o))throw new wn(i);e[o]!==void 0&&(n[o]=dc(e[o],i,o))}return n}function Er(e){return dc(e)}var Fk,Dk,Uk,jk,Hk,zk,wn,pc=S(()=>{Fk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Dk=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Uk=new Set([12,15,18,21,24]);jk=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Hk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,zk=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);wn=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as Jk,chmod as ii,readFile as Kk,rename as Yk,writeFile as Xk}from"node:fs/promises";import{homedir as Qk}from"node:os";import{dirname as Ah,join as fc}from"node:path";import Zk from"sql.js";function ci(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ci).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ci(e[t])}`).join(",")}}`}function vh(e){if(!e1.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function si(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ai(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function kh(e={}){let t=e.path||n1;await Jk(Ah(t),{recursive:!0,mode:448}),await ii(Ah(t),448);let r;try{r=await Kk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Zk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
6
|
+
- `)}`);let o=e.capabilities||{},i=Qt.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Qt.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Qt)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function Hn(e){let t=Pl(e);return Jt.set(t.chainId,t),t}function ps(e){return Jt.get(Number(e))||null}function $l(){return[...Jt.values()]}function Nb(){Jt.clear()}function Rb(){let e={};for(let t of Jt.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:Jt.size,capabilities:[...Qt],chains:e}}var Qt,U,L,Tb,Jt,ft=v(()=>{Qt=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),L=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Tb=/^0x[0-9a-fA-F]{40}$/;Jt=new Map});function Ll(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:d=!1,meta:l={}}=e||{};if(u||r==null)return{source:t,quality:$e.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=$r(r);if(p==null||p<=0n)return{source:t,quality:$e.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?$e.NO_GAS:$e.FULL,amountOut:p.toString(),minOut:$r(n)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:d,meta:l}}async function Ul(e,t,{divisor:r=1000n}={}){let n=$r(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=$r(i),c=$r(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),d=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(d)||u<=0?null:{impactPct:(1-d/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function Bl(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:n,impactUnmeasured:o,warnings:s}}function fs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(y=>y.quality!==$e.FAILED),c=e.filter(y=>y.quality===$e.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,d=Number(i),l=Number(s),p=Number.isFinite(d)&&d>0&&Number.isFinite(l)&&l>0,f=a.map(y=>{let k=BigInt(y.amountOut),S=0n,R=!1,I=!1,P=BigInt(y.oracleFeeBps??0),q=P>0n?k*P/10000n:0n;if(u){let B=y.gasUsd,H=Number(y.meta?.gasUnits??y.estimatedGas);if(B==null&&p&&Number.isFinite(H)&&H>0){let K=H*d/1e18*l;Number.isFinite(K)&&K>=0&&(B=K,I=!0)}let ie=(B??0)+(y.feeUsd??0);if(ie>0){let K=ie/t*10**r;Number.isFinite(K)&&K>=0&&(S=BigInt(Math.floor(K)),R=!0)}else B===0&&(R=!0)}let j=S+q,X=k>j?k-j:0n;return{...y,grossOut:k.toString(),netOut:X.toString(),costInDest:S.toString(),oracleFeeInDest:q.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,g=f.reduce((y,k)=>BigInt(k.netOut)>y?BigInt(k.netOut):y,0n),h=y=>g>0n?Number((g-BigInt(y))*10000n/g):0,w=[],E=f.slice().sort((y,k)=>BigInt(k.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,k)=>{let S=h(y.netOut)<=m?0:1,R=h(k.netOut)<=m?0:1;if(n&&m>0&&S!==R)return S-R;if(n&&m>0){let I=y.liquidityUsd??-1,P=k.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(k.netOut)>BigInt(y.netOut)?1:-1}),n&&m>0&&E&&f[0]&&f[0].source!==E.source&&w.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let _=f.filter(y=>!y.costAccounted).map(y=>y.source);u?_.length&&w.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let y=f.find(k=>k.costAccounted&&h(k.netOut)<=m);y&&w.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${y.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(y=>y.gasEstimated).map(y=>y.source);O.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${O.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let A=null,b=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let y=BigInt(f[0].netOut),k=BigInt(f[1].netOut);k>0n&&(A=Number((y-k)*10000n/k),b=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:A,spreadBasis:b,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function zn(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ll({source:s,error:String(o.reason?.message||o.reason)}):Ll({source:s,...o.value})})}var $e,ql,$r,ms=v(()=>{ft();$e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),ql={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},$r=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Fl(e={}){return vn({provider:"oneinch",defaultUrl:Pb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function $b(e={}){return Fl(e).baseUrl}function Dl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Lb(e={}){let t=Dl(e);return In({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Fl(e).trusted)}async function Ml(e={},t={}){if(!Dl(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await N(`${$b(t)}/${r}/quote?${s}`,{headers:Lb(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var Pb,jl=v(()=>{W();Re();es();ge();Pb="https://api.1inch.dev/swap/v6.0"});var Vl={};M(Vl,{UNI_V4_CHAINS:()=>Le,UNI_V4_FEE_TIERS:()=>gs,computeV4PoolId:()=>Gn,decodeV4HookPermissions:()=>ws,uniV4Chains:()=>Kb,uniV4Health:()=>Xb,uniV4InspectHook:()=>Vb,uniV4PrepareExactIn:()=>Gb,uniV4QuoteExactIn:()=>Kn,uniV4QuoteExactOut:()=>Wb});import{AbiCoder as qb,Interface as hs,getAddress as Ke,isAddress as ys,keccak256 as Ub}from"ethers";function ws(e){let t=Br(e),r=Number(BigInt(t)&Fb),n=Object.fromEntries(Hl.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Hl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Ur(e){let t=Number(e),r=Le[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Le).join(", ")})`);return{chainId:t,...r}}function Br(e){if(e==null||e==="")return ye;let t=String(e);if(!ys(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function Zt(e,t){let r=Le[Number(t)];if(qr(e))return Ke(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ke(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ke(r.usdc);if(!ys(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function qr(e){let t=String(e||"").trim().toLowerCase();return!t||t===Hb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function Gn({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=Br(o);return Ub(Lr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function xs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:Br(o)},zeroForOne:u}}function zb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=ws(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==ye&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),n&&e===ye&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==ye&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==ye&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==ye,returnsDelta:i,reasons:Object.freeze(a)})}async function Vb(e={},t={}){let r=Ur(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=Zt(e.tokenIn||"WETH",r.chainId),o=Zt(e.tokenOut||r.usdc,r.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Br(e.hooks),{poolKey:c}=xs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Gn(c),d=t.rpcCall||Y,l=Vn.encodeFunctionData("getSlot0",[u]),p=Vn.encodeFunctionData("getLiquidity",[u]),[f,m,g]=await Promise.all([d(r.chainId,"eth_call",[{to:r.stateView,data:l},"latest"],t),d(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===ye?Promise.resolve(null):d(r.chainId,"eth_getCode",[a,"latest"],t)]),h=Vn.decodeFunctionResult("getSlot0",f),w=Vn.decodeFunctionResult("getLiquidity",m)[0],E=h[0],_=E>0n,x=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,O=!!(i&bs),A=zb({hook:a,codePresent:x,initialized:_,dynamicFee:O});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:_,sqrtPriceX96:E.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:w.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:x,codeBytes:x?(g.length-2)/2:0,permissions:ws(a)}),risk:A})}async function Kn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],d=e.hooks||ye,l=[],p=null;for(let b of u){let{poolKey:y,zeroForOne:k}=xs({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:d}),S=Wn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:S},"latest"],t);if(!R||R==="0x"){l.push({...b,ok:!1,error:"empty result"});continue}let I=Wn.decodeFunctionResult("quoteExactInputSingle",R),P={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:k,poolId:Gn({...y})};l.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(R){l.push({...b,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let b=l.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>[]):[],m=new Map;for(let b of f){let y=String(b.pairAddress||"").toLowerCase();y&&m.set(y,b)}let g=b=>m.get(String(b.poolId||"").toLowerCase())??null,h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&h>0&&BigInt(p.amountOut)>0n){let b=BigInt(p.amountOut),k=l.filter(S=>S.ok&&Number((b-BigInt(S.amountOut))*10000n/b)<=h).filter(S=>g(S)?.liquidityUsd!=null).sort((S,R)=>g(R).liquidityUsd-g(S).liquidityUsd)[0];k&&k.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:k.fee,chosenPoolUsd:g(k).liquidityUsd,bandBps:h},p=k)}let E=g(p),_=f[0]??null,x=E??_,O=e.liquidityUsd??E?.liquidityUsd??_?.liquidityUsd??null,A=e.liquidityUsd!=null?"caller":E?"pool":_?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:O,liquiditySource:x,liquidityAttribution:A,liquidityPick:w,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ys(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!qr(e.tokenIn)&&!qr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&bs)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Wb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],d=e.hooks||ye,l=[],p=null;for(let m of u){let{poolKey:g,zeroForOne:h}=xs({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:d}),w=Wn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let E=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:w},"latest"],t);if(!E||E==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let _=Wn.decodeFunctionResult("quoteExactOutputSingle",E),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:_[0].toString(),gasEstimate:_[1].toString(),poolKey:g,zeroForOne:h,poolId:Gn({...g})};l.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(E){l.push({...m,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let m=l.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await hl({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:l,best:!0,executionReady:!1,prepareReady:!1}}async function Gb(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=Ur(n);if(Br(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&bs)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let s=Ke(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(qr(e.tokenIn)||qr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Kn(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let d=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,l={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Lr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[l,u.zeroForOne,BigInt(u.amountIn),d,0n,"0x"]]),m=Lr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),g=Lr.encode(["address","uint256"],[u.tokenOut,d]),h=Lr.encode(["bytes","bytes[]"],[Mb,[f,m,g]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=Bb.encodeFunctionData("execute",[Db,[h],E]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:E,quote:{...u,amountOutMinimum:d.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:jb,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:_,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Kb(){return Object.entries(Le).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Xb(e={}){let t=Ur(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Lr,ye,Le,gs,Wn,Bb,Vn,Hl,Fb,bs,Db,Mb,jb,Hb,zl,Es=v(()=>{ot();Tr();Re();ge();Lr=qb.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",Le={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},gs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Wn=new hs(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Bb=new hs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Vn=new hs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Hl=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Fb=(1n<<14n)-1n,bs=8388608;Db="0x10",Mb="0x060c0f",jb="0x000000000022D473030F116dDEE9F6B43aC78BA3",Hb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";zl=["uniswap-v4","uniswapv4"]});function Jb(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Yb).replace(/\/$/,"")}function Zb(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||Qb).replace(/\/$/,"")}async function Xn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${Jb(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wl(e={}){return N(`${Zb(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var Yb,Qb,Ss=v(()=>{W();Yb="https://coins.llama.fi",Qb="https://api.llama.fi"});var Yn={};M(Yn,{ACROSS_API:()=>Gl,HOP_API:()=>Kl,RELAY_API:()=>Xl,acrossHealth:()=>tw,acrossSuggestedFees:()=>Yl,hopHealth:()=>rw,hopQuote:()=>Ql,relayHealth:()=>nw,relayPrepare:()=>ow,relayQuote:()=>ks});async function tw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Yl({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Yl(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Gl).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function rw(e={}){try{let t=await Ql({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ql(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Kl).replace(/\/$/,""),d=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=d?.estimatedRecieved||d?.estimatedReceived;return l?ae(d,{chainId:Number(e.originChainId||e.chainId||ew[o]||0),venue:d?.tx?.to||"hop",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...d,autoSlippagePolicy:a}}async function nw(e={}){try{let t=await ks({user:pt,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function ks(e={},t={}){let{user:r=pt,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let d=(t.baseUrl||process.env.RELAY_API_URL||Xl).replace(/\/$/,""),l=await N(`${d}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=l?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...l,autoSlippagePolicy:u}:ae(l,{chainId:Number(n),venue:l?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ow(e={},t={}){let r=await ks(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:n,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:ke(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return J({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Gl,Kl,Xl,ew,Qn=v(()=>{W();Re();En();ge();Gl="https://across.to/api",Kl="https://api.hop.exchange/v1",Xl="https://api.relay.link",ew={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Jn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Xe(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Zl(e,t={}){let r=ql[Number(e)];if(!r)return null;try{let n=await Xn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function iw(e={}){try{let t=await Wl({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function sw(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Jl[r]||[r]),n.push(...Jl[mt(e)]||[e]),n}function aw(e,t,r={}){let n=Array.isArray(e)?e:[],o=sw(t,r).map(mt).filter(Boolean);for(let i of o){let s=n.find(c=>mt(c?.slug)===i||mt(c?.name)===i),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=mt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:mt(c?.slug).includes(i)||mt(c?.name).includes(i)}),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function As({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:d={}}){let l=[];return l.push({source:"lifi",run:async()=>{let p=await It({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},d),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:Jn(f?.gasCosts),feeUsd:Jn(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&l.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await Wt({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},d),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:Xe(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&l.push({source:"0x",run:async()=>{let p=await Gt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},d),f=null,m=p?.totalNetworkFee,g=await Promise.resolve(c);return m!=null&&g&&(f=Number(m)/1e18*g),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&l.push({source:"1inch",run:async()=>{let p=await Ml({chainId:e,src:t,dst:r,amount:n},d),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),l.push({source:"cow",run:async()=>{let p=await _t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},d),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),be[Number(e)]&&l.push({source:"uniswap-v3",run:async()=>{let p=await Ot({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},d);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),Le[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let p=await Kn({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},d);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),l}function ed({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(d,l={})=>(c||=iw(s),aw(await c,d,l));return a.push({source:"lifi",run:async()=>{let d=await It({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),l=d?.estimate??d?.[0]?.estimate,p={tool:d?.tool??d?.toolDetails?.name,durationSeconds:Xe(l?.executionDuration)},f=await u("lifi",p);return{amountOut:l?.toAmount,minOut:l?.toAmountMin,gasUsd:Jn(l?.gasCosts),feeUsd:Jn(l?.feeCosts),oracleFeeBps:d?.oracleFee?.applies?d.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:d?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:d}=await Promise.resolve().then(()=>(Qn(),Yn)),p=(await d({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:Xe(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Xe(p?.totalImpact?.usd)!=null?Math.abs(Xe(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:d}=await Promise.resolve().then(()=>(Qn(),Yn)),l=await d({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},s),p=l?.totalRelayFee?.total,f=null;if(p!=null)try{let g=BigInt(String(o))-BigInt(String(p));g>0n&&(f=g.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Xe(l?.estimatedFillTimeSec),limits:l?.limits?{min:l.limits.minDeposit,max:l.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Xe,mt,Jl,td=v(()=>{Ir();An();On();jl();$n();jn();Es();Ss();ms();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Jl=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var nd={};M(nd,{QUALITY:()=>$e,bestBridgeRoute:()=>Fr,bestSwapRoute:()=>er,formatComparisonNote:()=>Zn});async function rd(e,t,r){let n=cw[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await Xn([o],r))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function er(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Zl(r,t),a=rd(r,o,t),c=ul(r,t).catch(()=>null),u=As({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[d,l,p]=await Promise.all([zn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=fs(d,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),g=t.maxImpactPct===void 0?25:t.maxImpactPct;if(g!=null&&m.best){let h=m.best.source,E=await Ul(async _=>{let x=As({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(A=>A.source===h);return x.length?(await zn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let _=Bl(m,{[h]:E},{maxImpactPct:g});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:d.filter(x=>x.quality!==$e.FAILED).length,note:Zn(_,u.length),priceImpact:{[h]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:d.filter(h=>h.quality!==$e.FAILED).length,note:Zn(m,u.length)}}async function Fr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=rd(n,i,t),c=ed({...e,opts:t}),[u,d]=await Promise.all([zn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=fs(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=l.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.seconds!=null);return{kind:"bridge",fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...l,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==$e.FAILED).length,note:Zn(l,c.length)}}function uw(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Cu(t)}`:""}function Zn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=uw(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var cw,tr=v(()=>{ms();td();kn();Ss();ot();cw={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var od={};M(od,{ARTIFACT:()=>it,prepareBestRoute:()=>hw,supportedPreparers:()=>dw});function dw(){return Object.keys(eo)}async function hw(e,t={}){if(mw.some(h=>Object.hasOwn(e,h)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:r}=e;if(!r)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!fw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(pw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let n=await er(e,t);if(!n.best){let h=n.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=eo[o];if(!s){let h=n.routes.find(w=>eo[w.source]&&w.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await s(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O,A;_?(A="approval-required-first",O=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${E}`):x?(A="taker-not-funded",O=`${o} refused to build the transaction: ${E}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(A="provider-error",O=`${o} prepare failed: ${E}`);let b=n.routes.find(y=>eo[y.source]&&y.source!==o);return{ok:!1,reason:O,failureKind:A,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??lw,u=null,d=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),w=BigInt(a.amountOut);h>0n&&(u=Number((w-h)*10000n/h),u<-c&&(d=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let l=n.routes.filter(h=>h.source!==o).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),f=n.routes.map(h=>({source:h.source,liquidityUsd:h.liquidityUsd??null})).reduce((h,w)=>Math.max(h,w.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,g=m!=null&&f>0?Math.round(m/f*100):null;return J({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:g},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===it.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...d?[d]:[],...n.warnings||[],...a.artifactKind===it.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:l,comparison:{rankedOn:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var it,lw,eo,pw,fw,mw,id=v(()=>{tr();ge();it=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),lw=100,eo={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(jn(),vl)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},d)=>{let{uniV4PrepareExactIn:l}=await Promise.resolve().then(()=>(Es(),Vl)),p=await l({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},d);return{artifactKind:it.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Ir(),Ji)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(An(),qu)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:it.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(On(),zu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>($n(),sl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:it.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};pw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fw=/^0x[0-9a-fA-F]{40}$/,mw=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var sd={};M(sd,{prepareBestBridgeRoute:()=>xw,supportedBridgePreparers:()=>ww});function ww(){return Object.keys(to)}async function xw(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!yw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(gw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await Fr(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=to[s];if(!c){let h=i.routes.find(w=>to[w.source]&&w.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...h?{alternative:h.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O=i.routes.find(A=>to[A.source]&&A.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${E}`:x?`${s} refused to build: ${E}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${E}`,failureKind:_?"approval-required-first":x?"taker-not-funded":"provider-error",...O?{alternative:O.source}:{},comparison:i}}let d=u.transactions||[];if(!d.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let l=d.filter(h=>h.chainId!=null&&Number(h.chainId)!==Number(n));if(l.length)return{ok:!1,reason:`${s} returned a transaction for chain ${l[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??bw,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),w=BigInt(u.amountOut);h>0n&&(f=Number((w-h)*10000n/h),f<-p&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(p/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let g=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return d.length>1&&g.push(`This route needs ${d.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),J({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:d.length,transactions:d,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:d[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:g,runnersUp:i.routes.filter(h=>h.source!==s).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${d.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var yw,gw,bw,to,ad=v(()=>{tr();ge();yw=/^0x[0-9a-fA-F]{40}$/,gw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),bw=100,to={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Qn(),Yn)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Ir(),Ji)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var ld={};M(ld,{buildTwapSchedule:()=>ud,normalizeTwapParams:()=>cd,prepareTwapChunk:()=>Iw,simulateTwap:()=>_w});function cd(e={}){let t=Math.max(Ew,Math.min(Sw,Number(e.splits)||Aw)),r=Math.max(.1,Number(e.windowHours)||vw),n=Math.max(kw,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function ud(e){let t=cd(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function Iw(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await er({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=J(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function _w(e,{quoteFn:t=er,...r}={}){let n=ud(e),o=[],i=0n,s="unknown";for(let c=0;c<n.params.splits;c++)try{let u=await t({chainId:n.params.chainId,tokenIn:n.params.tokenIn,tokenOut:n.params.tokenOut,amountIn:n.params.chunkSize,taker:n.params.taker},r),d=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=d,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(d),source:u.source??u.venue})}catch(u){if(r.signal?.aborted)throw r.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(n.params.amount))).toFixed(6):null;return{params:n.params,schedule:n.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var Ew,Sw,kw,Aw,vw,dd=v(()=>{tr();ge();Ew=2,Sw=100,kw=60,Aw=10,vw=6});async function md({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!pd.has(Number(e))||!pd.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await N(`${fd}/dln/order/quote`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return u.error?{error:String(u.error)}:{estimation:u.estimation??{},order:u.order??{},fixFee:u.fixFee??"0"}}catch(c){return{error:String(c.message||c).slice(0,200)}}}async function hd(){try{return{ok:!0,chainCount:(await N(`${fd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var fd,pd,yd=v(()=>{W();ge();fd="https://dln.debridge.finance/v1.0",pd=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function bd({active:e=!0}={},t={}){let r=Date.now();if(rr.size&&r-gd<Ow)return[...rr.values()];try{let n=await N(`${vs}/exchange/currencies?active=${e?"true":"false"}`,t);rr.clear();for(let o of n??[])rr.set(String(o.ticker).toLowerCase(),o);return gd=r,n??[]}catch(n){return rr.size?[...rr.values()]:{error:String(n.message||n).slice(0,200)}}}async function Cw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${vs}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function Tw(e,t,r,{flow:n="standard"}={},o={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await N(`${vs}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function wd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Cw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Tw(e,t,s,{flow:n},o);if(a.error)return a;let c=await bd({},o),u=c.find(l=>String(l?.ticker).toLowerCase()===String(e).toLowerCase()),d=c.find(l=>String(l?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:a.toAmount,estimatedRate:a.rate,minAmount:i.minAmount,flow:a.flow,networkFee:u?.networkFee??null,kycRequired:u?.kycRequired??d?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function xd(){try{let e=await bd();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var vs,rr,gd,Ow,Ed=v(()=>{W();vs="https://api.changenow.io/v2",rr=new Map,gd=0,Ow=6e5});async function Sd({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},u=await N(`${Nw}/route`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return{route:u?.route??{},toAmount:u?.route?.estimate?.toAmount,fee:u?.route?.estimate?.feeCosts}}catch(c){return{error:String(c.message||c).slice(0,200)}}}var Nw,kd=v(()=>{W();Nw="https://api.squidrouter.com/v1"});async function Ad({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),c=await N(`${Rw}/quote?${a}`,s);return{amountOut:c?.amountOut,fee:c?.fee,estimatedTime:c?.estimatedTime}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Rw,vd=v(()=>{W();Rw="https://api.stargate.finance"});async function Id({fromAsset:e,toAsset:t,amount:r,destination:n}={},o={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await N(`${Pw}/quote/swap?${i}`,o);return{expectedAmountOut:s?.expected_amount_out,fees:s?.fees,slippageBps:s?.slippage_bps,inboundAddress:s?.inbound_address,memo:s?.memo,estimatedTime:s?.total_swap_seconds?`${Math.round(s.total_swap_seconds/60)} min`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Pw,_d=v(()=>{W();Pw="https://midgard.ninerealms.com/v2"});async function Od({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!r||!n||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await N(`${$w}/quote?${a}`,s);return{amountOut:c?.result?.toAmount,feeUsd:c?.result?.totalGasFeesInUsd,route:c?.result?.route,estimatedTime:c?.result?.serviceTime?`${c.result.serviceTime}s`:"unknown"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var $w,Cd=v(()=>{W();$w="https://api.socket.tech/v2"});async function Td({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={},i={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},a=await N(`${Lw}/estimate`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Lw,Nd=v(()=>{W();Lw="https://api.connext.network"});async function Rd({fromChain:e,toChain:t,token:r,amount:n}={},o={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await N(`${qw}/quote?${i}`,o);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var qw,Pd=v(()=>{W();qw="https://api.portalbridge.com/v1"});function Uw(e,t){return`0x${_s.getAmountsOut}`+_e(e)+_e(64)+_e(t.length)+t.map(Dr).join("")}function Bw(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Is(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Fw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Os)throw new Error(`slippageBps ${r} exceeds the ${Os} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function $d(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:Uw(i,s)},"latest"],a);return Bw(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Is(c.scanner);if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let d=a||[o,i];if(d.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let l=await n(u,s,d,c);return l?{chainId:t,router:u,path:d,amountIn:String(s),amountOut:l[l.length-1].toString(),hops:d.length-1,evidence:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:d,evidence:U.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Is(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let d=await n(c,i,[u,o],a);if(!d)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let l=d[d.length-1];if(l===0n)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,l,[o,u],a);if(!p)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"sell",bought:l.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p[p.length-1],m=Number(f*10000n/BigInt(i)),g=L.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(g=L.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(g=L.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:g,reason:h,amountIn:String(i),bought:l.toString(),returned:f.toString(),retentionBps:m,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:d},l={}){let p=l.scanner,f=Is(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=d||[o,i],g=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},l);if(g.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${g.evidence}: ${g.reason??"no reason given"})`);let h=Fw(g.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(u)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,_=E?`0x${_s.swapExactETHForTokens}`+_e(h)+_e(128)+Dr(a)+_e(w)+_e(m.length)+m.map(Dr).join(""):`0x${_s.swapExactTokensForTokens}`+_e(s)+_e(h)+_e(160)+Dr(a)+_e(w)+_e(m.length)+m.map(Dr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Os,deadline:w.toString()},requires:E?[]:[{step:"approve",token:m[0],spender:f,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var _s,_e,Dr,Os,Ld=v(()=>{ot();ft();_s={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},_e=e=>BigInt(e).toString(16).padStart(64,"0"),Dr=e=>e.slice(2).toLowerCase().padStart(64,"0");Os=100});function Mw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Ts)throw new Error(`slippageBps ${r} exceeds the ${Ts} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Cs(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Bd(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},d){let l=`0x${qd.quoteExactInputSingle}`+Mr(s)+Mr(a)+Ct(c)+Ct(u)+Ct(0),p=await Y(t,"eth_call",[{to:i,data:l},"latest"],d).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let d=[],l=null;for(let p of Dw){let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);d.push({fee:p,amountOut:f?f.toString():null}),f&&(!l||f>l.amountOut)&&(l={fee:p,amountOut:f})}return{best:l,tried:d}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=Cs(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Ud.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:d,tried:l}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return d?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:d.amountOut.toString(),fee:d.fee,useNative:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:l,evidence:U.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:l,evidence:U.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=Cs(c.scanner,"quoter"),d=(e.stableQuoteAssets||[]).map(O=>String(O).toLowerCase()),l=null;!a&&typeof e.resolveQuoteAsset=="function"&&(l=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||l||(d[0]&&p!==d[0]?d[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let g=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!g.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(A.best){let b=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c);if(b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),S=L.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return k<5e3?(S=L.FAIL,R=`round trip vs dollar book returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(S=L.CAUTION,R=`round trip vs dollar book returns ${(k/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:g.best.amountOut},c);if(!h.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),b=A.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c):{best:null};if(A.best&&b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),S=L.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return k<5e3?(S=L.FAIL,R=`dollar-book round trip returns only ${(k/100).toFixed(2)}%`):k<9e3&&(S=L.CAUTION,R=`dollar-book round trip returns ${(k/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"sell",bought:g.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=h.best.amountOut,E=Number(w*10000n/BigInt(s)),_=L.PASS,x="round trip completes with expected fee/impact loss";return E<5e3?(_=L.FAIL,x=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(_=L.CAUTION,x=`round trip returns ${(E/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:_,reason:x,amountIn:String(s),bought:g.best.amountOut.toString(),returned:w.toString(),retentionBps:E,buyFee:g.best.fee,sellFee:h.best.fee,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:d},l={}){let p=Cs(l.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!Ud.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},l);if(f.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=d??f.fee,g=Mw(f.amountOut,u);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(l.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),w=`0x${qd.exactInputSingle}`+Mr(i)+Mr(s)+Ct(m)+Mr(c)+Ct(a)+Ct(g)+Ct(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:h?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:g.toString(),slippageBps:u,maxSlippageBps:Ts,fee:m},requires:h?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Dw,qd,Ct,Mr,Ud,Ts,Fd=v(()=>{ot();ft();Dw=[100,500,3e3,1e4],qd={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Mr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Ud=/^0x[0-9a-fA-F]{40}$/,Ts=100});function Dd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Md(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function jw(e){let{chainId:t}=e;async function r(n,o,i){return Y(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await Un(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await ll(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await pl({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,ro.decimals,o).catch(()=>null),r(n,ro.symbol,o).catch(()=>null),r(n,ro.name,o).catch(()=>null),r(n,ro.totalSupply,o).catch(()=>null)]),u=Dd(i?.result??i),d=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Md(s?.result??s),name:Md(a?.result??a),totalSupply:(Dd(c?.result??c)??null)?.toString()??null,evidence:d?U.LIVE:U.UNKNOWN,warning:d?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Fn(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(d=>String(d.chainId).toLowerCase()===String(i).toLowerCase()).map(d=>({pair:d.pairAddress,dex:d.dexId,base:d.baseToken?.address,quote:d.quoteToken?.address,liquidityUsd:d.liquidity?.usd??null,priceUsd:d.priceUsd??null,volume24hUsd:d.volume?.h24??null,createdAt:d.pairCreatedAt??null})).sort((d,l)=>(l.liquidityUsd??0)-(d.liquidityUsd??0)),u=Bn(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:ml(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],d=[];for(let l=n;l<=o;l+=a){let p=Math.min(l+a-1,o);d.push([l,p])}for(let[l,p]of d){let f={fromBlock:`0x${l.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let m=await Y(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[l,p],error:m.error,evidence:U.UNKNOWN};for(let g of m?.result??m??[])u.push(g)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:d.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=L.PASS,a=d=>{let l={[L.PASS]:0,[L.CAUTION]:1,[L.UNKNOWN]:2,[L.FAIL]:3};l[d]>l[s]&&(s=d)},c=await this.resolveToken(n,o);c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:L.UNKNOWN,detail:c.warning}),a(L.UNKNOWN)):i.push({check:"erc20-metadata",result:L.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:L.UNKNOWN,detail:u.reason}),a(L.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:L.FAIL,detail:"no pool with liquidity found"}),a(L.FAIL);else{let d=u.pools[0],l=d.liquidityUsd??0;l<5e3?(i.push({check:"liquidity",result:L.CAUTION,detail:`top pool only $${l}`}),a(L.CAUTION)):i.push({check:"liquidity",result:L.PASS,detail:`$${l} on ${d.dex}`}),d.createdAt&&Date.now()-d.createdAt<24*3600*1e3&&(i.push({check:"age",result:L.CAUTION,detail:"pool under 24h old"}),a(L.CAUTION))}if(typeof this.sellSimulation=="function"){let d=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:L.UNKNOWN,reason:String(l?.message||l)}));i.push({check:"sellability",result:d.verdict,detail:d.retentionBps!=null?`round trip returns ${(d.retentionBps/100).toFixed(2)}% -- ${d.reason}`:d.reason}),a(d.verdict)}else i.push({check:"sellability",result:L.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(L.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ns(e){let r={...jw(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Bd({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,$d({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var ro,jd=v(()=>{ot();Tr();ft();Ld();Fd();us();ro={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function no(){return jr.map(e=>Hn(Ns(e)))}function Hd(e){return Hn(Ns(e))}var jr,oo=v(()=>{jd();ft();jr=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Xd,getAddress as Hw,id as Yd}from"ethers";function nr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function $s(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function io(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function sx(e,t){try{return Hw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ax(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Kd(e){return`0x${String(e).slice(-40).toLowerCase()}`}function cx({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>ex)return"stale"}return"scoped"}function ux(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function lx(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(nr(r)){let a=$s(Wd,o,tx);if(a)return a.value}let s=(async()=>{let a=async l=>{try{let p=zd.encodeFunctionData(l,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:zd.decodeFunctionResult(l,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),d={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return nr(r)&&io(Wd,o,d,ox),d})();return n?.set(o,s),s}async function dx(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Vw,1),Ww),o=await Un(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[zw,ax(t)]}],r);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),d=c?.topics?.[2];!u||!d||a.set(`${u}:${Kd(d)}`,{token:u,spender:Kd(d)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function px(e){return(Qw[e]||[]).flatMap(r=>Kw.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function fx(e,t,r={}){let n=[],o="direct-probe",i=null,s=px(e),a=Ps(e),c=nr(r)&&$s(Rs,e,rx)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let u=await dx(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},nr(r)&&io(Rs,e,!0,64)}catch{if(nr(r)&&io(Rs,e,!1,64),n=s,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,l=(await un(n,r.concurrency||4,async f=>{try{let m=await dl({chainId:e,token:f.token,owner:t,spender:f.spender},r),g=BigInt(m.allowance);if(g<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await lx(e,f.token,r,u),w=g>=Zw,E=Gw[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:h.symbol,decimals:h.decimals,spender:f.spender,spenderLabel:E,allowance:g.toString(),allowanceDisplay:ux(g,h.decimals,w),unlimited:w,lastActivityAt:null,risk:cx({unlimited:w,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await hx(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:Ps(e).length,...i||{}},approvals:[...l,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function mx(e,t,r,n,o){try{let i=Vd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Vd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function Ps(e){return(Yw[e]||[]).flatMap(r=>Xw.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function hx(e,t,r){let n=Ps(e);return n.length===0?[]:(await un(n,r.concurrency||4,async i=>await mx(e,i.collection,t,i.operator,r)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Qd(e={},t={}){let r=sx(e.owner||e.address,"owner"),n=new Map(jr.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=nr(t)&&!e.refresh;if(s){let f=$s(Gd,i,nx);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await un(o,e.concurrency||3,f=>fx(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),d=u.find(f=>f.method==="log-scan"&&f.toBlock),l=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:d?`last ${d.toBlock-d.fromBlock} blocks`:l?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&io(Gd,i,p,ix),{...p,cached:!1,cachedAgeMs:0}}var zd,Vd,zw,uO,Vw,Ww,Gw,Kw,Xw,Yw,Qw,Jw,Zw,ex,tx,rx,nx,ox,ix,Wd,Rs,Gd,Jd=v(()=>{oo();W();ot();zd=new Xd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Vd=new Xd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),zw=Yd("Approval(address,address,uint256)"),uO=Yd("ApprovalForAll(address,address,bool)"),Vw=1e4,Ww=2e5,Gw=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),Kw=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),Xw=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),Yw=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),Qw=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),Jw=(1n<<256n)-1n,Zw=Jw/2n,ex=4320*60*60*1e3,tx=360*60*1e3,rx=600*1e3,nx=45*1e3,ox=512,ix=128,Wd=new Map,Rs=new Map,Gd=new Map});var tp={};M(tp,{aggregateBridgeQuotes:()=>Zd,bridgeAggregatorHealth:()=>gx,checkRevokeNeeded:()=>ep,scanBridgeRoutes:()=>yx});async function Zd(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:d=18,toDecimals:l=18}=e,p=[],f=[],m=md({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(y=>y.error?(f.push(`debridge: ${y.error}`),null):{provider:"debridge",amountOut:y.estimation?.dstChainTokenOut?.amount??y.estimation?.toAmount,feeUsd:y.estimation?.fixFee??y.fixFee,estimatedTime:y.estimation?.execution?.estimatedTransferTime?`${y.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:y}).catch(y=>(f.push(`debridge: ${y.message}`),null)),g=Fr({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(y=>!y||y.error?(f.push(`lifi: ${y?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:y.amountOut??y.quote?.amountOut,feeUsd:y.feeUsd??y.totalFee,estimatedTime:y.estimatedTime??y.duration??"unknown",preparable:!!y.transaction,raw:y}).catch(y=>(f.push(`lifi: ${y.message}`),null)),h=Sd({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(y=>y.error?(f.push(`squid: ${y.error}`),null):{provider:"squid",amountOut:y.toAmount,feeUsd:Array.isArray(y.fee)?y.fee.reduce((k,S)=>k+(Number(S.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),w=Ad({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(y=>y.error?(f.push(`stargate: ${y.error}`),null):{provider:"stargate",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"1-5 min",preparable:!1,raw:y}).catch(y=>(f.push(`stargate: ${y.message}`),null)),E=Id({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(y=>y.error?(f.push(`thorchain: ${y.error}`),null):{provider:"thorchain",amountOut:y.expectedAmountOut,feeUsd:y.fees?.total,estimatedTime:y.estimatedTime||"10-30 min",preparable:!1,raw:y}).catch(y=>(f.push(`thorchain: ${y.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let y=await wd({fromTicker:c,toTicker:u,fromAmount:s},t);return y.error?(f.push(`changenow: ${y.error}`),null):{provider:"changenow",amountOut:y.toAmount,feeUsd:y.networkFee,estimatedTime:y.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:y.kycRequired,raw:y}}catch(y){return f.push(`changenow: ${y.message}`),null}})(),x=Od({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(y=>y.error?(f.push(`bungee: ${y.error}`),null):{provider:"bungee",amountOut:y.amountOut,feeUsd:y.feeUsd,estimatedTime:y.estimatedTime,preparable:!1,raw:y}).catch(y=>(f.push(`bungee: ${y.message}`),null)),O=Td({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(y=>y.error?(f.push(`connext: ${y.error}`),null):{provider:"connext",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-20 min",preparable:!1,raw:y}).catch(y=>(f.push(`connext: ${y.message}`),null)),A=Rd({fromChain:r,toChain:n,token:o,amount:s},t).then(y=>y.error?(f.push(`wormhole: ${y.error}`),null):{provider:"wormhole",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-15 min",preparable:!1,raw:y}).catch(y=>(f.push(`wormhole: ${y.message}`),null)),b=await Promise.allSettled([m,g,h,w,E,x,O,A,_]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,k)=>{let S=Number(y.amountOut??0),R=Number(k.amountOut??0);return S!==R?R-S:y.preparable&&!k.preparable?-1:!y.preparable&&k.preparable?1:0}),{providers:p.map(y=>y.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function ep({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Qd({chainIds:[e],address:t},n)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?i.find(a=>String(a.token).toLowerCase()===String(r).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function yx(e={},t={}){let[r,n]=await Promise.all([Zd(e,t),ep({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=r.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:r.providers,runnersUp:r.runnersUp,revokeCheck:n,errors:r.errors,confidence:r.providers.length>=2?.85:r.providers.length===1?.6:.1}}async function gx(){let[e,t]=await Promise.all([hd().catch(r=>({ok:!1,error:r.message})),xd().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var LO,rp=v(()=>{tr();yd();Ed();kd();vd();_d();Cd();Nd();Pd();Jd();LO=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var np={};M(np,{DYDX_API:()=>so,dydxHealth:()=>xx,dydxMarkets:()=>bx,dydxOrderbook:()=>wx});async function bx(e=50,t={}){try{return((await N(`${so}/v4/perpetualMarkets?limit=${e}`,t))?.markets||[]).map(n=>({ticker:n?.ticker,oraclePrice:n?.oraclePrice,indexPrice:n?.indexPrice,nextFundingRate:n?.nextFundingRate?`${(Number(n.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:n?.openInterest,volume24h:n?.volume24H}))}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function wx(e){try{let t=await N(`${so}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function xx(){try{return{ok:!0,serverTime:(await N(`${so}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var so,op=v(()=>{W();so="https://api.dydx.exchange"});var sp={};M(sp,{DRIFT_API:()=>ip,driftHealth:()=>Sx,driftMarkets:()=>Ex});async function Ex(e={}){try{return((await N(`${ip}/v2/markets`,e))?.markets||[]).map(r=>({symbol:r?.symbol||r?.marketIndex,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Sx(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ip,ap=v(()=>{W();ip="https://dlob.drift.trade"});var cp={};M(cp,{VERTEX_API:()=>ao,vertexHealth:()=>vx,vertexMarkets:()=>kx,vertexOrderbook:()=>Ax});async function kx(e={}){try{return((await N(`${ao}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets||[]).map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Ax(e){try{let r=(await N(`${ao}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function vx(){try{return{ok:!0,status:(await N(`${ao}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ao,up=v(()=>{W();ao="https://gateway.prod.vertexprotocol.com/v2"});var lp={};M(lp,{pancakeHealth:()=>Ox,pancakeQuote:()=>_x});async function _x({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},a=await N(`${Ix}/quote`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,route:a?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Ox(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ix,dp=v(()=>{W();Ix="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var fp={};M(fp,{sushiHealth:()=>Nx,sushiQuote:()=>Tx});async function Tx({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,a=await N(`${Cx(e)}/quote?query=${encodeURIComponent(s)}`,i);return{amountOut:a?.data?.quote?.amountOut,route:a?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Nx(){try{return{ok:!0,chains:Object.keys(pp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cx,pp,mp=v(()=>{W();Cx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${pp[e]||"ethereum"}`,pp={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var hp={};M(hp,{raydiumHealth:()=>$x,raydiumQuote:()=>Px});async function Px({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={},o={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await N(`${Rx}/quote?${i}`,o),a=(s?.routePlan||[]).filter(c=>c?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:a.length,allRoutes:s?.routePlan?.length||0}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function $x(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Rx,yp=v(()=>{W();Rx="https://quote-api.jup.ag/v6"});var gp={};M(gp,{AEVO_API:()=>Ls,aevoHealth:()=>qx,aevoMarkets:()=>Lx});async function Lx(e={}){try{return(await N(`${Ls}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function qx(){try{return{ok:(await N(`${Ls}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ls,bp=v(()=>{W();Ls="https://api.aevo.xyz"});var wp={};M(wp,{compoundHealth:()=>Fx,compoundMarkets:()=>Bx});async function Bx(e={}){try{return((await N(`${Ux}/ctoken`,e))?.cToken||[]).map(r=>({symbol:r?.symbol,underlying:r?.underlying_symbol,supplyApy:r?.supply_rate?.value?`${(Number(r.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:r?.borrow_rate?.value?`${(Number(r.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:r?.total_supply?.value,totalBorrow:r?.total_borrows?.value,collateralFactor:r?.collateral_factor?.value?`${(Number(r.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Fx(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ux,xp=v(()=>{W();Ux="https://api.compound.finance/api/v2"});var Ep={};M(Ep,{yearnHealth:()=>jx,yearnVaults:()=>Mx});async function Mx(e={}){try{return(await N(`${Dx}/vaults/all`,e)||[]).map(r=>({name:r?.name,symbol:r?.symbol,apy:r?.apy?.net_apy?`${(Number(r.apy.net_apy)*100).toFixed(2)}%`:null,tvl:r?.tvl?.tvl_deposited,chain:r?.chainId,type:r?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function jx(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Dx,Sp=v(()=>{W();Dx="https://api.yearn.fi/v1"});var kp={};M(kp,{convexHealth:()=>Vx,convexPools:()=>zx});async function zx(e={}){try{return(await N(`${Hx}/pools`,e)||[]).map(r=>({name:r?.curvePool?.name||r?.name,curveApy:r?.curvePool?.apy?`${(Number(r.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:r?.apy?`${(Number(r.apy)*100).toFixed(2)}%`:null,tvl:r?.tvl,boosted:r?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Vx(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Hx,Ap=v(()=>{W();Hx="https://api.convexfinance.com/api"});function Tt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ye(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Tt(t),Object.freeze({mantissa:e,scale:t})}function ht(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Tt(e.scale)}function co(e){return Tt(e),10n**BigInt(e)}function F(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return Ye(s,o.length)}function we(e,t){if(Tt(t),typeof e=="bigint")return Ye(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ye(BigInt(e),t)}function qe(e){ht(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function Hr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*co(t-e.scale),t):Ye(e.mantissa/co(e.scale-t),t)}function qs(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Hr(e,r),Hr(t,r),r]}function yt(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa+n.mantissa,o)}function zr(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa-n.mantissa,o)}function Ae(e,t){ht(e,"left"),ht(t,"right");let r=e.scale+t.scale;return Tt(r),Ye(e.mantissa*t.mantissa,r)}function Ue(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(ht(e,"left"),ht(t,"right"),Tt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*co(t.scale+r),o=t.mantissa*co(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=qs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var WO,Oe=v(()=>{WO=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Ip,readFileSync as Wx}from"node:fs";import{dirname as vp,join as Us}from"node:path";import{fileURLToPath as Gx}from"node:url";function Kx(e){let t=vp(Gx(e));for(let r=0;r<8;r+=1){let n=Us(t,"package.json");if(Ip(n))try{let i=JSON.parse(Wx(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=vp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function _p(e,t){let r=Kx(t),n=Us(r,e);return Ip(n)?n:Us(r,"dist","assets",e)}var Op=v(()=>{});import{readFileSync as Xx,existsSync as Yx}from"node:fs";import{fileURLToPath as Qx}from"node:url";import{dirname as Jx,join as Tp}from"node:path";function eE(){try{let e=_p("equities-fixtures",import.meta.url);if(e&&Yx(e))return e}catch{}return Zx}function rE(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function V(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){rE(e)||V(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&V(t,`${r} must be a nonempty string`)}function Qe(e,t,r){Number.isSafeInteger(e)||V(t,`${r} must be a safe integer`)}function bt(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function nE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];oe(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),bt(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))bt(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function oE(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||V(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function iE(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Qe(e[r],t,r);G(e.usdg,t,"usdg"),bt(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&V(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&V(t,`assets.${r}.usd must be a nonnegative finite source number`)}function sE(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||V(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&V(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>Qe(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&V(t,`dates[${o}] must use YYYY-MM-DD`)})}function aE(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&V(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Qe(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&V(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&V(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function cE(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&V(t,`${r}.liq must be a nonnegative finite source number`)}}function uE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),Qe(e.block,t,"block"),Qe(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),bt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&V(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&V(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&V(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&V(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function lE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&V(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&V(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())oe(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())oe(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function dE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function pE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&V(t,'chain must be "ton"'),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function mE(e,t){let r=Np[t],n=Tp(e,r),o;try{o=Xx(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return fE[t](i,r),i}function Rp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Rp(t)}return e}function Bs({fixtureDir:e=tE}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Np))t[r]=mE(e,r);return Rp(t)}function st(){return Cp??=Bs(),Cp}function ve(){return st().venues}function Pp(){return st().universe}function $p(){return st().oracles}function Lp(){return st().nyseHolidays}function qp(){return st().dstTransitions}function uo(){return st().rhPoolState}function Up(){return st().solanaXstocks}function Bp(){return st().tonXstocks}function Fp(){return st().hip3L2Books}var Zx,tE,Np,fE,Cp,Be=v(()=>{Op();Zx=Tp(Jx(Qx(import.meta.url)),"fixtures");tE=eE(),Np=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});fE=Object.freeze({venues:nE,universe:oE,oracles:iE,nyseHolidays:sE,dstTransitions:aE,equityDexPools:cE,rhPoolState:uE,solanaXstocks:dE,tonXstocks:pE,hip3L2Books:lE})});function gE(){let e=qp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ds,endMs:n.endUtc*Ds}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function Gp(){return Mp??=gE(),Mp}function bE(){return Fs===void 0&&(Fs=new Set(Lp().holidayDayIndex)),Fs}function Kp(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function wE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Gp();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function xE(e){for(let t of Gp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function EE(e){return xE(e)?yE:hE}function SE(e){let t=e+EE(e),r=Math.floor(t/Dp),n=t-r*Dp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/jp),msIntoDay:n,weekday:o.getUTCDay()}}function kE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!bE().has(e)}function AE(e){return e<Hp?"dark":e<zp?"extended":e<Vp?"core":e<Wp?"extended":"dark"}function Vr(e){Kp(e,"sessionState"),wE(e,"sessionState");let t=SE(e);return kE(t)?AE(t.minuteOfDay):"dark"}function js(e){return Kp(e,"isDark"),Vr(e)==="dark"}var Ds,jp,Ms,Dp,hE,yE,Hp,zp,Vp,Wp,oC,iC,Mp,Fs,lo=v(()=>{Be();Ds=1e3,jp=60*Ds,Ms=60*jp,Dp=24*Ms,hE=-5*Ms,yE=-4*Ms,Hp=240,zp=570,Vp=960,Wp=1200,oC=Object.freeze([Hp,zp,Vp,Wp]),iC=Object.freeze(["core","extended","dark"])});function fo(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function _E(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function OE(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function Xp(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function mo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??vE,o=t.oracleFreshnessMs??IE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(_E(c)){i?s.push(Object.freeze({...c,staleData:!0})):fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(OE(c)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Xp(c,r,n)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=Vr(r),d=u==="core"?o:o*2;if(Xp(c,r,d)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var po,vE,IE,Hs=v(()=>{Oe();lo();po=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),vE=12e4,IE=6e5});function CE(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[a,c=""]=s.split("."),u=`${a}${c}`,d=a.length+o,l;return d<=0?l=`0.${"0".repeat(-d)}${u}`:d>=u.length?l=`${u}${"0".repeat(d-u.length)}`:l=`${u.slice(0,d)}.${u.slice(d)}`,`${i?"-":""}${l}`}function le(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(CE(e))}function Fe(e,t){let r=le(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Nt=v(()=>{Oe()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function Jp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){Jp(e)||Z(t,"must be an object")}function Zp(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function or(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function Wr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Vs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function zs(e,t,r=!1){e===null&&r||(Jp(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function ho(e,t,r=!1){e===null&&r||Rt(e,t)}function Qp(e,t){Rt(e,t),or(e.venue,`${t}.venue`),or(e.reason,`${t}.reason`),qE.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&or(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Yp,"costAccounted","capturedAt","blockOrSeq","raw"])Zp(e,r,"quote");or(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),Wr(e.instrument,TE,"quote.instrument"),Wr(e.tier,NE,"quote.tier"),or(e.symbolRaw,"quote.symbolRaw"),or(e.symbol,"quote.symbol"),Wr(e.side,RE,"quote.side"),zs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of LE)Object.hasOwn(e,r)&&(zs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of Yp)zs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Vs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Rt(e.raw,"quote.raw"),e}function yo(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Zp(e,t,"rankResult");return Wr(e.rankedOn,PE,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>ho(t,`rankResult.ranked[${r}]`)),ho(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>ho(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Vs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Vs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Qp(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Qp(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),Wr(e.instrumentMix,$E,"rankResult.instrumentMix"),ho(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var TE,NE,RE,PE,$E,LE,Yp,qE,at=v(()=>{TE=new Set(["spot","perp"]),NE=new Set(["read-only","quote-only","prepare","intent"]),RE=new Set(["buy","sell"]),PE=new Set(["net-of-cost","gross"]),$E=new Set(["homogeneous","heterogeneous"]),LE=["bid","ask","mid","mark"],Yp=["fees","gasEstimate","priceImpact","fundingHourly"],qE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function ef(){return ve().venues.arcus}function DE(){return Object.keys(ef().markets).sort()}function ME({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=ef().markets[n];if(!o)return null;let i=Fe(o.mark,`${n}.mark`),s=le(o.oracle),a=le(o.fundingHourly),c=r===null?F("0"):r,u={venue:UE,chain:BE,instrument:"perp",tier:FE,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:go,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),xe(u)}function bo({side:e="buy",sizeUsd:t=null}={}){return DE().map(r=>ME({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var UE,BE,FE,go,Ws=v(()=>{Be();Nt();Oe();at();UE="arcus_perp",BE="robinhood-4663",FE="quote-only",go="0.00000480324074074"});function Gs(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return F("0");let n=F(String(t)),o=we(10000n,0);return Ae(Ae(e,n),o)}function rf(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=jE(n,t),c=t-a,u=F(go),d=Gs(i,c),l=Gs(u,a),p=Math.max(d.scale,l.scale),f={mantissa:d.mantissa*10n**BigInt(p-d.scale)+l.mantissa*10n**BigInt(p-l.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:qe(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:go,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Gs(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:qe(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function jE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)js(e+o*tf)&&(r+=1);return t>n&&js(e+n*tf)&&(r+=t-n),r}var tf,SC,nf=v(()=>{Oe();Ws();lo();tf=36e5,SC=24*365});function HE(e){return e.mid??e.mark??e.ask??e.bid??null}function zE(e){let t=HE(e);if(t===null)return null;let r=e.costAccounted===!0,n=F("0");e.fees!==null?n=yt(n,e.fees):r=!1,e.priceImpact!==null?n=yt(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=yt(n,e.gasEstimate);let o;if(e.fees!==null&>(e.fees,F("1"))<0&>(e.fees,F("0"))>=0){let i=yt(F("1"),e.fees);o=Ae(t,i),e.priceImpact!==null&&(o=yt(o,Ae(t,e.priceImpact)))}else o=yt(t,n);return{net:o,costAccounted:r,px:t}}function VE(e,t,r=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:r,quote:e}}function WE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=zr(t.net,e.net);return Ue(Ae(r,we(10000n,0)),t.net,4)}function wo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let b=mo(e,{nowMs:r});o=b.survivors,i=b.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,d=[];for(let b of o){let y=zE(b);if(y===null)continue;let k=null;if(u&&b.instrument==="perp"&&(k=rf(b,c,{nowMs:r}),k.carryBps!==null)){let S=yt(F("1"),Ue(k.carryBps,we(10000n,0),12));y.net=Ae(y.net,S),y.costAccounted=!1}d.push(VE(b,y,k))}let l=d,p="homogeneous";if(u)p="heterogeneous",l=d;else{let b=d.filter(k=>k.instrument==="spot"),y=d.filter(k=>k.instrument==="perp");b.length>0&&y.length>0?(l=b.length>=y.length?b:y,p="homogeneous"):(l=d,p="homogeneous")}l.sort((b,y)=>{let k=gt(b.net,y.net);return k!==0?k:b.venue<y.venue?-1:b.venue>y.venue?1:0});let f=l[0]??null,m=l.slice(1),g=l,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:WE(f,m[0]),E=d.find(b=>b.tier==="prepare")??null,_=Vr(r),x=_==="core"?null:{session:_,warning:_==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},O=null;u&&(O=GE(d));let A={rankedOn:h,ranked:g,winner:f,runnersUp:m,improvementBps:w===null?null:Number(qe(w)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:O};return yo(A)}function GE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>gt(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>gt(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=zr(t.net,r.net);if(n.mantissa===0n)return 0;let o=Ae(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=Ue(n,o,4),s=Number(qe(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Ks=v(()=>{Hs();nf();lo();Oe();at()});function Xs(){return uo()}function ZE(e){return{mantissa:e*e*10n**BigInt(ir)/QE,scale:ir}}function eS(e){let t=ZE(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ue(Ae(t,we(10n**BigInt(r),0)),we(10n**BigInt(n),0),ir);return o.mantissa===0n?null:Ue(F("1"),o,ir)}return Ue(Ae(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),ir)}function tS(e){let t=$p(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function rS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,nS(r,t),ir)}function nS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Hr(e,r).mantissa+Hr(t,r).mantissa,scale:r}}function oS(e){let t=Xs(),r=JE[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ys(){return Object.keys(Xs().pools).sort()}function sr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Xs(),o=n.pools[e];if(!o)return null;let i=eS(o);if(i===null)return null;let s=le(o.liqUsd),a=r===null?F("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:Ue(we(BigInt(o.feePpm),0),we(1000000n,0),8),u=a.mantissa===0n?F("0"):rS(s,a),d=oS(o.version),f={venue:KE,chain:XE,instrument:"spot",tier:YE,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:d===null?null:d.wei.toString(),gasUnits:d===null?null:d.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},m=tS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=qe(Ue(Ae(zr(i,m),we(10000n,0)),m,4))),xe(f)}function of({side:e="buy",sizeUsd:t=null}={}){return Ys().map(r=>sr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var KE,XE,YE,QE,ir,JE,Qs=v(()=>{Be();Nt();Oe();at();KE="rh_uniswap",XE=4663,YE="prepare",QE=1n<<192n,ir=18,JE=Object.freeze({v3:180000n,v4:240000n})});function xo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=sr({symbol:t,side:r,sizeUsd:n});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>sf)throw new Error(`quote is stale (${a}ms old, bound ${sf}ms); re-quote before preparing`);let u=uo().pools[t],d=u.version==="v4"?sS:iS,l=d,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:d,data:"0x",value:"0",requiresApproval:{spender:l,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var sf,iS,sS,Js=v(()=>{Qs();Be();sf=12e4,iS="0x0000000000000000000000000000000000000000",sS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Gr(){return ve().venues.hyperliquid_hip3}function af(){return Object.keys(Gr().dexs).sort()}function lS(){let e=[];for(let[t,r]of Object.entries(Gr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function dS(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=Gr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Gr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function pS(e,t){try{return Fp().books[`${e}:${t}`]??null}catch{return null}}function fS(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(qe(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),d=Number(c.sz);if(!(u>0)||!(d>0))continue;let l=u*d,p=Math.min(o,l),f=p/u;if(i+=p,s+=f,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function mS(e,t,r,n){let o=fS(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(qe(n));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:le(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function cf({dex:e,ticker:t,market:r,side:n,size:o}){let i=Fe(r.mark,`${e}:${t}.mark`),s=le(r.fundingHourly),a=le(r.vol24h),c=le(r.oi),u=o===null?F("0"):o,d=pS(e,t),l=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(d){let h=mS(d,n,u,i);l=h.impact,p=h.depth,p?.fullyFilled?f="impact measured from l2Book; fees and gas still not captured":f="book walked but size exceeds visible depth; fees and gas not captured"}else f="no order book depth wired for this coin; fees and gas not captured";else d?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let g={venue:aS,chain:cS,instrument:"perp",tier:uS,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:s,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:d!==null,l2BookFixture:d?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(g.raw.vol24hFixed=a),c!==null&&(g.raw.oiFixed=c),d?.bids?.[0]&&d?.asks?.[0]&&(g.bid=F(String(d.bids[0].px)),g.ask=F(String(d.asks[0].px))),xe(g)}function uf({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=dS(e);return n.length===0||n.length>1?null:cf({...n[0],side:t,size:r})}function Eo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of lS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Gr().dexs[i][s];n.push(cf({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var aS,cS,uS,lf=v(()=>{Be();Nt();Oe();at();aS="hyperliquid_hip3",cS="hyperliquid",uS="quote-only"});function df(){return ve().venues.arcus_spot}function bS(){return Object.keys(df().pairs).sort()}function wS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=df().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Fe(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Fe(n.ask,`${e}.ask`),s=le(n.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let l=Math.max(o.scale,i.scale),p=o.scale===l?o.mantissa:o.mantissa*10n**BigInt(l-o.scale),f=i.scale===l?i.mantissa:i.mantissa*10n**BigInt(l-i.scale);a={mantissa:p+f,scale:l+1},a={mantissa:(p+f)/2n,scale:l}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=r===null?F("0"):r,u=F("0"),d={venue:hS,chain:yS,instrument:"spot",tier:gS,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(d.bid=o),i!==null&&(d.ask=i),a!==null&&(d.mid=a),xe(d)}function So({side:e="buy",sizeUsd:t=null}={}){return bS().map(r=>wS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var hS,yS,gS,pf=v(()=>{Be();Nt();Oe();at();hS="arcus_spot",yS="robinhood-4663",gS="quote-only"});function ko(){return Up()}function Zs(){return Object.keys(ko().tokens).sort()}function kS(e){let t=ko().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function AS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ea({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=ko().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=kS(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):AS(u,d),p=!1;d.mantissa===0n&&(a.liquidityUsd??0)>=ff&&(p=!1);let f={venue:xS,chain:ES,instrument:"spot",tier:SS,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:p,capturedAt:ko().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<ff}};return xe(f)}function mf({side:e="buy",sizeUsd:t=null}={}){return Zs().map(r=>ea({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var xS,ES,SS,ff,hf=v(()=>{Be();Nt();Oe();at();xS="solana_xstocks",ES="solana",SS="quote-only",ff=25e3});function Ao(){return Bp()}function ta(){return Object.keys(Ao().tokens).sort()}function TS(e){let t=Ao().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function NS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ra({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Ao().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=TS(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):NS(u,d),f={venue:vS,chain:IS,instrument:"spot",tier:_S,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:Ao().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<OS,impactSizeFractionHint:CS}};return xe(f)}function yf({side:e="buy",sizeUsd:t=null}={}){return ta().map(r=>ra({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var vS,IS,_S,OS,CS,gf=v(()=>{Be();Nt();Oe();at();vS="ton_stonfi",IS="ton",_S="quote-only",OS=25e3,CS=.01});var vo={};M(vo,{bestEquityRoute:()=>RS,collectEquityQuotes:()=>wf,equityVenues:()=>PS,getUniverse:()=>Pp,getVenues:()=>ve,loadFixtures:()=>Bs,prepareEquity:()=>xo,prepareEquityRoute:()=>$S,rankEquityQuotes:()=>wo,toJsonSafe:()=>LS,validateQuote:()=>xe,validateRankResult:()=>yo});function na(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function wf(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=na(t),o=[],i=uf({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Eo({ticker:r,sizeUsd:n}))o.push(u);for(let u of bo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of So({sizeUsd:n}))u.symbol===r&&o.push(u);let s=sr({symbol:r,sizeUsd:n});s&&o.push(s);let a=ea({symbol:r,sizeUsd:n});a&&o.push(a);let c=ra({symbol:r,sizeUsd:n});return c&&o.push(c),o}function RS(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=na(e.sizeUsd??e.size??null),n=wf(t,{sizeUsd:r});if(n.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=n[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=wo(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>bf}}function PS(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Eo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:bo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:So().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ys().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Zs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ta().length}],t=[...Eo(),...bo(),...So(),...of(),...mf(),...yf()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=mo(t,{nowMs:r});return{inventory:e,hip3Dexs:af(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:ve().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function $S(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=na(e.sizeUsd??e.size??null),o=sr({symbol:t,sizeUsd:n});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=xo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>bf}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function LS(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var bf,Io=v(()=>{Oe();Ks();Js();Hs();lf();pf();Ws();Qs();hf();gf();Be();Ks();Js();at();Be();bf=3600*1e3});var _o={};M(_o,{CHAIN_CONFIGS:()=>jr,EVIDENCE:()=>U,RISK:()=>L,SCANNER_CAPABILITIES:()=>Qt,__clearScanners:()=>Nb,createScanner:()=>Pl,getScanner:()=>ps,listScanners:()=>$l,registerBuiltinScanners:()=>no,registerCustomChain:()=>Hd,registerScanner:()=>Hn,scannerCoverage:()=>Rb,validateScanner:()=>Rl});var Oo=v(()=>{ft();oo()});var sa={};M(sa,{createWatch:()=>DS,listWatches:()=>FS,removeWatch:()=>MS});import Kr from"node:fs";import oa from"node:path";import{randomUUID as qS}from"node:crypto";import{homedir as US}from"node:os";function BS(e=process.env){return e.ORACLE_CONFIG_DIR||oa.join(US(),".config","oracle")}function xf(e=process.env){return oa.join(BS(e),"watches.json")}function ia(e=process.env){let t=xf(e);if(!Kr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Kr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Ef(e,t=process.env){let r=xf(t);Kr.mkdirSync(oa.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Kr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
+
`,{mode:384}),Kr.renameSync(n,r)}function FS(e=process.env){return ia(e).watches}function DS({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:qS(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=ia(o);return s.watches.push(i),Ef(s,o),i}function MS(e,t=process.env){let r=ia(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Ef({watches:n},t),!0)}var aa=v(()=>{});var Sf={};M(Sf,{classifyReceipt:()=>jS});function jS(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var kf=v(()=>{});function GS(e){return!(WS.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Af(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
8
|
+
`),n=[...new Set((r.match(HS)||[]).map(i=>i.toLowerCase()))].filter(i=>!VS.has(i)),o=[...new Set(r.match(zS)||[])].filter(GS);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function vf(e){let t=String(e||"").trim();if(!t)return[];let r=[],n=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let u of c)u?.expanded_url&&a.push(u.expanded_url),u?.url&&a.push(u.url);(i||s)&&r.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(n):n(o)}catch{for(let o of t.split(`
|
|
9
|
+
`)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var HS,zS,VS,WS,If=v(()=>{HS=/\b0x[a-fA-F0-9]{40}\b/g,zS=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,VS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),WS=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as KS}from"node:child_process";import _f from"node:fs";import ca from"node:path";function JS(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Tf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function ZS(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ca.isAbsolute(t)?_f.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(ca.delimiter)){if(!n)continue;let o=ca.join(n,"xurl");try{if(_f.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function ek(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function tk(e){for(let t of e){let r=String(t);if(Cf.includes(r))return r;if(Cf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function rk(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(d=>String(d)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=tk(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!Tf(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(d=>d==="-X"||d==="--request"),u=String(r[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!YS.includes(o))if(QS.includes(o)){if(!Tf(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...r],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function Nf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!JS(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=rk(t,n);if(!o.ok)return o;let i=ZS(n);if(!i.ok)return i;let a=(r.spawnFn||KS)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Of,maxBuffer:1024*1024,env:ek(n)});if(a.error){let l=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Of}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(l,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,XS),{force:!0}),u=wt(String(a.stderr||"").slice(0,2e3),{force:!0}),d=typeof a.status=="number"?a.status:1;return{ok:d===0,status:d,command:o.command,argv:o.argv.map(l=>/=/.test(l)&&/token|secret|key|bearer/i.test(l)?"[redacted-arg]":l),stdout:c,stderr:u||void 0}}var Of,XS,YS,QS,Cf,LT,Rf=v(()=>{Qo();Of=45e3,XS=4e4,YS=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),QS=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Cf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);LT=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function sk(e){return!e||e==="0x"||e===ik}async function Pf(e={},t={}){let r=t.rpcCall||Y,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await r(o,"eth_getCode",[n,"latest"],t)}catch(m){return{address:n,chainId:o,status:"unavailable",error:m?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:n,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[m,g]of Object.entries(nk))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,d=null,l=null;for(let{label:m,slot:g}of ok)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!sk(h)){u=!0,d=m,l=`0x${String(h).slice(-40)}`;break}}catch{s.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}u&&(a.push({selector:d,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${d}), not the implementation ${l} it delegates to`));let f=a.filter(m=>m.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:f,findings:a,isProxy:u,proxyStandard:d,implementation:l,codeSize:Math.floor(c.length/2),notes:s}}var nk,ok,ik,$f=v(()=>{ot();nk=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),ok=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),ik=`0x${"0".repeat(64)}`});function Co(e,t){let r=String(e||"").trim();if(!ak.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function ua(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function Xr(e,t){return e==null||e===""?null:ua(e,t)}function uk({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let d=a?.tx;if(!d||typeof d!="object")throw new Error("local-signer envelope requires unsigned tx object");let l=Co(d.to,"prepared destination"),p=String(d.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=ua(d.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Xr(d.gasLimit??c.gasLimit,"gasLimit"),g=Xr(d.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!g)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let h=Number(u.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=Gi({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=ke(E,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:l,data:p,value:f,gasLimit:m,maxFeePerGas:g,slippageBps:_.selectedBps,expiresAtMs:h+w},O=Xr(d.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(x.maxPriorityFeePerGas=O),c.nonce!==void 0&&(x.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(x.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(x.l1FeeWei=Xr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=Xr(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:l,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:_.selectedBps,expiresAtMs:h+w,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[x]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function lk(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}no();let r=ps(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function dk({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==L.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==L.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Lf(e={},t={}){let r=Number(e.chainId??ck);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Co(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Co(e.tokenIn,"tokenIn"):null,i=e.recipient?Co(e.recipient,"recipient"):null,s=e.amountIn==null?null:ua(e.amountIn,"amountIn"),a=lk(r,t.scanner),c=t.scanContractRisk||Pf,[u,d,l]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let g={...e,tokenIn:o,amountIn:s,recipient:i},h=dk({token:u,pools:d,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),w=null,E=null,_=null;if(e.prepare===!0&&h.length===0){w=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=uk({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:d?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(x){_=String(x?.message||x).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!E,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:d,topPool:d?.pools?.[0]||null,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,blockedReasons:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:E,localSignerBlockedReason:_,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var ak,ck,qf=v(()=>{oo();ft();Re();$f();ak=/^0x[0-9a-fA-F]{40}$/,ck=4663});var Mf={};M(Mf,{evaluateContracts:()=>Df,fetchAccountTweets:()=>Ff,snipeExecuteEnabled:()=>Uf,tickTwitterCaWatch:()=>gk,twitterSnipeEmitsCard:()=>bk});function Uf(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Bf(e){return String(e||"").trim().replace(/^@/,"")}async function Ff({handle:e,limit:t=5,xurlFn:r=Nf}={},n={}){let o=Bf(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:vf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function hk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Lf({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function yk(e,t){let r=await yl(e,{chainSlug:"solana",stables:[fk,mk]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function Df(e,t={},r={}){let n=Number(t.chainId??pk),o=[];for(let i of e.evm||[])o.push(await hk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await yk(i,r));return o}async function gk(e={},t={}){let r=Bf(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Ff({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Af(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let l=await(t.evaluateFn||Df)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:l})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:Uf(t.env||process.env),hits:i,seen:[...n]}}function bk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var pk,fk,mk,jf=v(()=>{If();Rf();qf();Tr();on();pk=4663,fk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",mk="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as wk}from"ethers";function kk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Sk.has(t.length)&&t.every(r=>wk.en.getWordIndex(r)>=0)}function _k(e){let t=Hf(e);return Ik.has(t)||vk.test(t)}function Hf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Ok(e){let t=Hf(e);return[...xk].some(r=>t.includes(r))}function Ck(e,t,r){if(typeof t=="string"){if(Ek.some(n=>n.test(t))||kk(t))throw new Yr(r);if(Ak.test(t)&&!_k(e))throw new Yr(r)}}function la(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Ck(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>la(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(Ok(o))throw new Yr(i);e[o]!==void 0&&(n[o]=la(e[o],i,o))}return n}function ar(e){return la(e)}var xk,Ek,Sk,Ak,vk,Ik,Yr,da=v(()=>{xk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Ek=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Sk=new Set([12,15,18,21,24]);Ak=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,vk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Ik=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Yr=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as Tk,chmod as To,readFile as Nk,rename as Rk,writeFile as Pk}from"node:fs/promises";import{homedir as $k}from"node:os";import{dirname as zf,join as pa}from"node:path";import Lk from"sql.js";function Po(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Po).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Po(e[t])}`).join(",")}}`}function Vf(e){if(!qk.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function No(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Ro(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Wf(e={}){let t=e.path||Fk;await Tk(zf(t),{recursive:!0,mode:448}),await To(zf(t),448);let r;try{r=await Nk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Lk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
15
10
|
PRAGMA foreign_keys=ON;
|
|
16
11
|
CREATE TABLE IF NOT EXISTS artifacts (
|
|
17
12
|
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
|
|
@@ -23,10 +18,9 @@ No skills installed. Use skill_create to save a successful workflow.
|
|
|
23
18
|
CREATE TABLE IF NOT EXISTS action_receipts (
|
|
24
19
|
artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
|
|
25
20
|
);
|
|
26
|
-
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await Xk(l,Buffer.from(o.export()),{mode:384}),await ii(l,384),await Yk(l,t),await ii(t,384)};return s=s.then(u,u),s}r?await ii(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let l=vh(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Er(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,f,ci(p)]),await a(),{id:d,type:l,createdAt:f,data:p}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?ai(l.getAsObject()):null;return l.free(),d},listArtifacts(u){c();let l=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(vh(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),si(l).map(ai)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let p=si(d),f=p.find(w=>w.id===String(u)),m=p.find(w=>w.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!t1.has(`${f.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${f.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[f.id,m.id]),await a(),{parentId:f.id,childId:m.id}},children(u){c();let l=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return l.bind([String(u)]),si(l).map(ai)},parents(u){c();let l=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return l.bind([String(u)]),si(l).map(ai)},async putReceipt(u,l){c();let d=this.getArtifact(u);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=Er(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),ci(p)]),await a(),p},getReceipt(u){c();let l=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");l.bind([String(u)]);let d=l.step()?JSON.parse(l.getAsObject().receipt_json):null;return l.free(),d},async close(){i||(await a(),o.close(),i=!0)}}}var mc,e1,t1,r1,n1,Ih=S(()=>{pc();mc=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),e1=new Set(mc),t1=new Set(mc.slice(0,-1).map((e,t)=>`${e}:${mc[t+1]}`)),r1=fc(process.env.ORACLE_CONFIG_DIR||fc(Qk(),".config","oracle"),"workspace"),n1=fc(r1,"artifacts.sqlite")});import{createHash as _h}from"node:crypto";function i1(e){return o1.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function hc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(hc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${hc(e[t])}`).join(",")}}`}function s1(e){return _h("sha256").update(String(e)).digest("hex")}function Th(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let r of t.searchParams.keys())if(i1(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Oh(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function a1(e={}){let t=Th(e.url??e.sourceUrl),r=Oh(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(Er({url:t,fetchedAt:r,contentHash:n}))}function Ch(e={}){let t=Th(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Oh(e.fetchedAt),s=s1(r);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(a1),c=Er({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${_h("sha256").update(hc(c)).digest("hex")}`,...c})}var o1,Nh=S(()=>{pc();o1=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Rh(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function yn(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function wc(e,t){return t>0?yn(e/t*100):null}function yc(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function l1(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Wt(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Rh(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||u1.has(n.toUpperCase())})}function d1(e){let t=[],r=yc(e);for(let n of e.assets||e.holdings||[])Wt(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Wt(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Wt(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Wt(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Wt(t,a,{...i,venue:"Hyperliquid spot"});let s=Rh(n.perps?.accountValueUsd);s!=null&&Wt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Wt(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function p1(e,t){let r=yc(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function gc(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:yn(i),percentOfKnown:wc(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Ph(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=l1(t.labels??t.addressBook??e.labels??e.addressBook),o={...c1,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((v,R)=>{if(!v||typeof v!="object")return;let I=p1(v,R);s.has(I)?a+=1:(s.add(I),i.push(v))});let c=i.flatMap(d1),u=c.filter(v=>v.usdValue!=null),l=c.filter(v=>v.usdValue==null),d=i.reduce((v,R)=>v+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=yn(u.reduce((v,R)=>v+R.usdValue,0)),f=l.length+d,m=gc(u,"chain",p),w=gc(u,"venue",p),g=gc(u,"symbol",p);for(let v of m)v.chain=v.name;for(let v of w)v.venue=v.name;for(let v of g)v.asset=v.name,v.symbol=v.name;let y=yn(u.filter(v=>v.stablecoin).reduce((v,R)=>v+R.usdValue,0)),b=c.filter(v=>v.kind==="nft"),T=i.reduce((v,R)=>v+Number(R.valuation?.nftUnvaluedItems||0),0),x=b.filter(v=>v.usdValue==null).length+T,_=b.filter(v=>v.usdValue!=null).length,k=g[0]||null,h=k?k.percentOfKnown>=o.assetHighPct?"high":k.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",E=[];f&&E.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&E.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&E.push(`${a} duplicate address/chain snapshot(s) were ignored.`),k&&h!=="low"&&E.push(`Asset concentration is ${h}: ${k.name} is ${k.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&E.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),w[0]?.percentOfKnown>=o.venueHighPct&&E.push(`Venue concentration is high: ${w[0].name} is ${w[0].percentOfKnown}% of known value.`);let A=i.map(yc).filter(Boolean).map(v=>{let R=n.get(String(v).toLowerCase());return{address:v,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:f===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:w,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:h,topAsset:k?.name??null,topAssetPercent:k?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:y,percentOfKnown:wc(y,p),high:p>0&&wc(y,p)>=o.stablecoinHighPct},nftCoverage:{status:b.length||T?x?"partial":"valued":"not-observed",valuedItems:_,unvaluedItems:x,knownUsd:yn(b.filter(v=>v.usdValue!=null).reduce((v,R)=>v+R.usdValue,0))},addresses:A,warnings:[...new Set(E)]}}var c1,u1,Lh=S(()=>{c1=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),u1=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function $h(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function Fh(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function f1(e){return Number.isFinite(Number(Fh(e)))}function Bh(e){return pe(Fh(e),0)}function m1(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Ve(o))return;let s=Dh(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>f1(o))?r.sort((o,i)=>Bh(o.row)-Bh(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function Dh(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[li(e),ue(t),ue(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function ui(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Ve(o))continue;let i=t==="fill"?Dh(o):li(o);r.has(i)?(n+=1,t!=="fill"&&$h(o)>$h(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function h1(e){let t=new Map;for(let r of e){let n=[li(r),`${ue(r.chain??r.chainId)}|${ue(Ve(r))}`,`*|${ue(Ve(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function g1(e,t){return t.get(li(e))??t.get(`${ue(e.chain??e.chainId)}|${ue(Ve(e))}`)??t.get(`*|${ue(Ve(e))}`)??null}function w1(e){let t=new Map,r=0;for(let n of e){let o=[ue(n.chain??n.chainId),ue(qh(n)),ue(Ve(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ue(n.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:pe(n.costBasisUsd)/(s||1);r+=u*(a-l)-c,i.quantity-=u,i.cost-=u*l}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:ze(r),lots:t}}function Uh(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=ui(e.balances||[],"balance"),i=ui(e.positions||[],"position"),s=ui(e.fills||[],"fill"),a=ui(e.prices||[],"price"),c=h1(a.rows),u=[],l=0,d=0;for(let A of[...o.rows,...i.rows]){let v=g1(A,c),R=pe(A.quantity??A.amount??A.size),I=v?pe(v.priceUsd??v.price,NaN):pe(A.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let P=R*I,D=pe(v?.asOf??A.priceAsOf,0),V=r-D>n;V&&(l+=Math.abs(P)),u.push({...A,quantity:R,priceUsd:I,valueUsd:P,stale:V,kind:i.rows.includes(A)?"position":"balance"})}let p=u.filter(A=>A.kind==="balance").reduce((A,v)=>A+v.valueUsd,0),f=u.filter(A=>A.kind==="position"),m=f.reduce((A,v)=>A+v.valueUsd,0),w=f.reduce((A,v)=>A+Math.abs(v.valueUsd),0),g=p+m,y=pe(e.equityUsd,g),b=w1(m1(e.fills||[])).realizedPnlUsd,T=f.reduce((A,v)=>{let R=pe(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return A+v.quantity*(v.priceUsd-R)},0),x=new Map;for(let A of u)x.set(ue(Ve(A)),(x.get(ue(Ve(A)))||0)+Math.abs(A.valueUsd));let _=[...x.values()].reduce((A,v)=>A+v,0),k=[...x].map(([A,v])=>({asset:A,exposureUsd:ze(v),percent:_?ze(v/_*100):null})).sort((A,v)=>v.exposureUsd-A.exposureUsd||A.asset.localeCompare(v.asset)),h=u.reduce((A,v)=>A+Math.abs(v.valueUsd),0),E=Ph({snapshots:[{assets:u.map(A=>({symbol:Ve(A),usdValue:Math.abs(A.valueUsd),chain:A.chain,venue:A.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:b,unrealizedUsd:ze(T),totalUsd:ze(b+T)},exposure:{grossUsd:ze(w),netUsd:ze(g),leverage:y>0?ze(w/y):null,equityUsd:ze(y)},concentration:k,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(A=>A.stale).length,staleValueUsd:ze(l),stalePercent:h?ze(l/h*100):null,ttlMs:n},risk:E})}var pe,ze,ue,Ve,qh,li,Mh=S(()=>{Lh();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,ze=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ue=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Ve=e=>e.asset??e.symbol??e.coin,qh=e=>e.address??e.owner??e.account,li=e=>[ue(e.chain??e.chainId),ue(qh(e)),ue(Ve(e)),ue(e.source)].join("|")});var Q6,Z6,e5,jh=S(()=>{Q6=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Z6=Object.freeze(["read","simulate"]),e5=1440*60});function Hh(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return y1.test(t)||b1.includes(r)}function Gt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=S1.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of x1)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new bn(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Hh(o))throw new bn(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Gt(o,`${t}[key]`,r),Gt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Gt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Gt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Hh(o))throw new bn(`${t}.${o}`,"forbidden-key-name");Gt(i,`${t}.${o}`,r,o)}return e}var bn,y1,b1,x1,S1,zh=S(()=>{jh();bn=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},y1=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,b1=Object.freeze(["privkey","wif","xprv","seed"]);x1=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),S1=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as E1}from"node:crypto";function xc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(xc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xc(e[t])}`).join(",")}}`}function A1(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function di(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))di(t)}return e}function Sc(e,t="fact"){try{Gt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Gh(e){return E1("sha256").update(xc(e)).digest("hex")}function Jh({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:A1(r)};return di({...s,hash:Gh(s)})}function pi({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Sc(t,"intent");let n=Jh({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return di({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Kh(e,t,r,n={}){if(Ec(e),!(Vh[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);Sc(r,t);let i=n.external===!0||n.externallySupplied===!0;if(Wh.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=Jh({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return di({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ec(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(Gh(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Sc(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Vh[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(Wh.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var bc,Vh,Wh,Ac=S(()=>{zh();bc=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Vh=Object.freeze(Object.fromEntries(bc.map((e,t)=>[e,Object.freeze(t+1<bc.length?[bc[t+1]]:[])]))),Wh=new Set(["signed","broadcast"])});function Yh(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return v1[t]??t}function k1(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Yh(e)}:${t}`)}function Re(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:fi(r)})}function I1(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(e.walletWinRate??e.winRate);Re(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Re(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function _1(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Re(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Re(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Re(t,"liquidity_lock",o==null?null:o?.12:-.28)}function T1(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(e.sales??e.saleCount);Re(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Re(t,"sales_depth",n===null?null:fe(n/50)*.18)}function O1(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(e.fundingRate??e.funding);Re(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Re(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function C1(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Re(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Re(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function R1(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>Ee(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function mi(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Ee(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=Yh(o),a=k1(o,i),c=N1[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=fi(fe(u.length/l)),p=u.reduce((T,x)=>T+x.value,0),f=R1(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Re(u,"shadow_markout",m);let w=fi(fe(.5+p+m)),g=f===null?.8:fe(.85+f*.3,.35,1),y=fi(fe(d*g)),b=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||b.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&b.push("LOW_COVERAGE","NO_TRADE"),y<.5&&b.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Ee(o.ageHours??o.poolAgeHours)??1/0)<24&&b.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&b.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:w,confidence:y,coverage:d,contributions:u,flags:[...new Set(b)],noTrade:b.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var f5,v1,fe,Ee,fi,N1,vc=S(()=>{f5=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),v1=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),fe=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Ee=e=>Number.isFinite(Number(e))?Number(e):null,fi=e=>Math.round(e*1e4)/1e4;N1=Object.freeze({wallet:I1,pool:_1,nft_floor:T1,hl_flow:O1,prediction_market:C1})});function P1(e=[],t=[],r={}){let n=mi(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function L1(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=pi({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function Xh(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=P1(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(L1(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Qh=S(()=>{vc();Ac()});function hi(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function kc(e){e&&(e.prepareAttempted=!0)}function Ic(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function F1(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...Da(o)]:[];return new Set([...n,...i])}function D1(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function U1(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function M1(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function j1(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function H1(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of $1)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of B1)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,U1(e)){let o=M1(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=q1.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=F1(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(D1(e)){let o=j1(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):it;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>it||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>it?(r.push(`slippage ${o} exceeds cap ${Math.min(i,it)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function _c(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=H1(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var $1,B1,q1,Zh=S(()=>{Ua();ke();$1=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),B1=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),q1=/^0x[a-fA-F0-9]{40}$/});var tg={};M(tg,{DESK_TOOLS:()=>V1,runDeskTool:()=>G1});function W1(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>z1)throw new TypeError("tool arguments exceed size limit")}function rt(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function G1(e,t,r={}){if(W1(t),e==="research_artifact"){if(rt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>eg)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Ch)(t)}}if(e==="portfolio_analyze")return rt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Uh)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||pi,o=r.advanceTradeLifecycle||Kh,i=r.assertTradeLifecycle||Ec;if(t.action==="create")return rt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(rt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){kc(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=_c(t.lifecycle,s?.fact||{});if(!a.ok)return Ic(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};hi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else hi(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(rt(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){kc(r.loopVerifier);let a=_c(t.lifecycle,t.fact);if(!a.ok)return Ic(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&hi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(rt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||Xh)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||mi)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||kh,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return rt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return rt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return rt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return rt(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var z1,eg,gi,Jt,xn,V1,rg=S(()=>{Ih();Nh();Mh();Ac();vc();Qh();Zh();z1=128*1024,eg=5e4,gi={type:"string",minLength:1,maxLength:256},Jt={type:"object",additionalProperties:!0},xn=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),V1=Object.freeze([xn("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:gi,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Jt,parentId:gi,childId:gi},required:["action"],additionalProperties:!1}),xn("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:eg},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),xn("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Jt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),xn("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:gi,intent:Jt,lifecycle:Jt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Jt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),xn("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Jt},markouts:{type:"array",maxItems:100,items:Jt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var ng={};M(ng,{deployGloballyEnabled:()=>K1,executeGloballyEnabled:()=>J1,mevExecuteEnabled:()=>Y1});function J1(){return vn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function K1(){return vn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function Y1(){return vn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var og=S(()=>{Kt()});Kt();import ig from"node:fs";import Tc from"node:process";import{fileURLToPath as X1}from"node:url";Kt();import Ir from"node:fs";import _r from"node:path";var Dc=/^0x[0-9a-fA-F]{40}$/,wg=new Set(["privatekey","private_key","secret","seed","mnemonic","passphrase","signature","keystore"]),yg=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","signature","wif","xprv","xpriv","apikey","bearer","credential"],bg=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/,/\b(?:[a-z]{3,8}\s+){11,}[a-z]{3,8}\b/i],xg=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/;function Sg(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Eg(e,t){let r=Sg(e);if(wg.has(String(e).toLowerCase())||yg.some(n=>r.includes(n)))throw new Error(`address-book: ${t} is forbidden; the book stores labels, never key material`)}function Ag(e,t){if(typeof e=="string"&&(bg.some(r=>r.test(e))||xg.test(e)))throw new Error(`address-book: ${t} looks like key material; the book stores labels, never key material`)}function Uc(){let e=_t("ORACLE_ADDRESS_BOOK","MAD_ADDRESS_BOOK","");if(e)return _r.resolve(e);let t=_t("ORACLE_CONFIG_DIR","MAD_CONFIG_DIR",vi);return _r.join(t,"address-book.json")}function ki(e,t="field"){if(Array.isArray(e)){e.forEach((r,n)=>ki(r,`${t}[${n}]`));return}if(!e||typeof e!="object"){Ag(e,t);return}for(let[r,n]of Object.entries(e))Eg(r,r),ki(n,r)}function Ii(e){let t=String(e||"").trim();if(!Dc.test(t))throw new Error("address-book: address must be 0x + 40 hex characters");return t.toLowerCase()}function Yt(e,t){return e==null||e===""?null:String(e).slice(0,t)}function Fc(){return{version:1,updatedAt:null,entries:[]}}function Mc(e){return{address:String(e.address).toLowerCase(),label:Yt(e.label,80)||"unknown",who:Yt(e.who,120),role:Yt(e.role,40),chainIds:Array.isArray(e.chainIds)?e.chainIds.map(Number).filter(Number.isFinite):[],notes:Yt(e.notes,500),source:Yt(e.source,80),firstSeenAt:e.firstSeenAt||null,lastSeenAt:e.lastSeenAt||null}}function kn(){try{let e=JSON.parse(Ir.readFileSync(Uc(),"utf8"));if(!e||typeof e!="object")return Fc();let t=Array.isArray(e.entries)?e.entries:[];return{version:1,updatedAt:e.updatedAt||null,entries:t.filter(r=>r&&typeof r=="object"&&Dc.test(String(r.address||""))).map(Mc)}}catch{return Fc()}}function jc(e){let t=Uc();Ir.mkdirSync(_r.dirname(t),{recursive:!0,mode:448});let r={...e,version:1,updatedAt:new Date().toISOString()},n=_r.join(_r.dirname(t),`.address-book.${process.pid}.tmp`);Ir.writeFileSync(n,`${JSON.stringify(r,null,2)}
|
|
27
|
-
|
|
28
|
-
`)
|
|
29
|
-
`);for(let k=0;k<_.length;k+=1){if(d+=Buffer.byteLength(_[k]),d>o){T();return}k<_.length-1&&(d=0)}}),l.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){T();return}let _;try{_=JSON.parse(x)}catch{g(me(null,-32700,"parse error"));return}if(p.length>=a){g(me(_?.id,-32e3,"server busy"));return}p.push(_),b()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Jc=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),Cg=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function dt(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Ae(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function Tr(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Ae(o)}return`${r} raw`}return Ae(e)}var Ng=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Rg(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Ng[String(e||"").toUpperCase()]}function Kc(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let i=[],s=(c,u,l={})=>{u==null||u===""||i.push({label:c,value:String(u),...l})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Rg(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let l=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=Tr(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??Tr(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?Tr(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ae(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ae(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",Tr(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let y=Number(d),b=Number(m);Number.isFinite(y)&&Number.isFinite(b)&&y>0&&b>0&&b<=y&&s("SLIPPAGE",`${((1-b/y)*1e4).toFixed(0)} bps max`)}let w=c.meta?.fee??c.poolFee;w!=null&&s("POOL FEE",`${Number(w)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Ae(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let g=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(y=>y!==a).slice(0,3):[];for(let y of g){let b=y?.provider||y?.venue||y?.source,T=Tr(y?.netOut??y?.amountOut??y?.toAmount,u);b&&T&&s(`vs ${b}`,T,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",u!=null?`$${Ae(u)}`:null,{hero:!0});let l=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",l?l.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),l){let f=l.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,w)=>Number(w.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Ae(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ae(d)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((w,g)=>w+g,0)/f.length;s("AVG ENTRY",`$${Ae(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Ae(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ae(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(l=>Number(l?.priceEth??l?.price??l?.costEth)).filter(l=>Number.isFinite(l)&&l>0);u.length>0&&s("AVG BUY",`${Ae(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ae(o.owners??o.numOwners))}return i}function Pg(e,t,r){let n=Jc[e]||Jc.generic,o=Kc(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=dt(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${dt(u.label)}</span><b>${dt(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
|
|
21
|
+
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let d=`${t}.tmp-${process.pid}`;await Pk(d,Buffer.from(o.export()),{mode:384}),await To(d,384),await Rk(d,t),await To(t,384)};return s=s.then(u,u),s}r?await To(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let d=Vf(String(u.type)),l=String(u.id||"").trim();if(!l)throw new TypeError("artifact id required");let p=ar(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[l,d,f,Po(p)]),await a(),{id:l,type:d,createdAt:f,data:p}},getArtifact(u){c();let d=o.prepare("SELECT * FROM artifacts WHERE id=?");d.bind([String(u)]);let l=d.step()?Ro(d.getAsObject()):null;return d.free(),l},listArtifacts(u){c();let d=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Vf(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),No(d).map(Ro)},async link(u,d){c();let l=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");l.bind([String(u),String(d)]);let p=No(l),f=p.find(g=>g.id===String(u)),m=p.find(g=>g.id===String(d));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!Uk.has(`${f.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${f.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[f.id,m.id]),await a(),{parentId:f.id,childId:m.id}},children(u){c();let d=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),No(d).map(Ro)},parents(u){c();let d=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),No(d).map(Ro)},async putReceipt(u,d){c();let l=this.getArtifact(u);if(!l||l.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=ar(d);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Po(p)]),await a(),p},getReceipt(u){c();let d=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");d.bind([String(u)]);let l=d.step()?JSON.parse(d.getAsObject().receipt_json):null;return d.free(),l},async close(){i||(await a(),o.close(),i=!0)}}}var fa,qk,Uk,Bk,Fk,Gf=v(()=>{da();fa=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),qk=new Set(fa),Uk=new Set(fa.slice(0,-1).map((e,t)=>`${e}:${fa[t+1]}`)),Bk=pa(process.env.ORACLE_CONFIG_DIR||pa($k(),".config","oracle"),"workspace"),Fk=pa(Bk,"artifacts.sqlite")});import{createHash as Kf}from"node:crypto";function Mk(e){return Dk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ma(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ma).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ma(e[t])}`).join(",")}}`}function jk(e){return Kf("sha256").update(String(e)).digest("hex")}function Xf(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let r of t.searchParams.keys())if(Mk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Yf(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function Hk(e={}){let t=Xf(e.url??e.sourceUrl),r=Yf(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(ar({url:t,fetchedAt:r,contentHash:n}))}function Qf(e={}){let t=Xf(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Yf(e.fetchedAt),s=jk(r);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(Hk),c=ar({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Kf("sha256").update(ma(c)).digest("hex")}`,...c})}var Dk,Jf=v(()=>{da();Dk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Zf(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Qr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ya(e,t){return t>0?Qr(e/t*100):null}function ga(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function Wk(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Pt(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Zf(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||Vk.has(n.toUpperCase())})}function Gk(e){let t=[],r=ga(e);for(let n of e.assets||e.holdings||[])Pt(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Pt(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Pt(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Pt(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Pt(t,a,{...i,venue:"Hyperliquid spot"});let s=Zf(n.perps?.accountValueUsd);s!=null&&Pt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Pt(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function Kk(e,t){let r=ga(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ha(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:Qr(i),percentOfKnown:ya(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function em(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=Wk(t.labels??t.addressBook??e.labels??e.addressBook),o={...zk,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((S,R)=>{if(!S||typeof S!="object")return;let I=Kk(S,R);s.has(I)?a+=1:(s.add(I),i.push(S))});let c=i.flatMap(Gk),u=c.filter(S=>S.usdValue!=null),d=c.filter(S=>S.usdValue==null),l=i.reduce((S,R)=>S+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Qr(u.reduce((S,R)=>S+R.usdValue,0)),f=d.length+l,m=ha(u,"chain",p),g=ha(u,"venue",p),h=ha(u,"symbol",p);for(let S of m)S.chain=S.name;for(let S of g)S.venue=S.name;for(let S of h)S.asset=S.name,S.symbol=S.name;let w=Qr(u.filter(S=>S.stablecoin).reduce((S,R)=>S+R.usdValue,0)),E=c.filter(S=>S.kind==="nft"),_=i.reduce((S,R)=>S+Number(R.valuation?.nftUnvaluedItems||0),0),x=E.filter(S=>S.usdValue==null).length+_,O=E.filter(S=>S.usdValue!=null).length,A=h[0]||null,b=A?A.percentOfKnown>=o.assetHighPct?"high":A.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",y=[];f&&y.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&y.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&y.push(`${a} duplicate address/chain snapshot(s) were ignored.`),A&&b!=="low"&&y.push(`Asset concentration is ${b}: ${A.name} is ${A.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&y.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),g[0]?.percentOfKnown>=o.venueHighPct&&y.push(`Venue concentration is high: ${g[0].name} is ${g[0].percentOfKnown}% of known value.`);let k=i.map(ga).filter(Boolean).map(S=>{let R=n.get(String(S).toLowerCase());return{address:S,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1),label:f===0&&i.length&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:g,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:b,topAsset:A?.name??null,topAssetPercent:A?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:ya(w,p),high:p>0&&ya(w,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||_?x?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:x,knownUsd:Qr(E.filter(S=>S.usdValue!=null).reduce((S,R)=>S+R.usdValue,0))},addresses:k,warnings:[...new Set(y)]}}var zk,Vk,tm=v(()=>{zk=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),Vk=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function rm(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function im(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function Xk(e){return Number.isFinite(Number(im(e)))}function nm(e){return pe(im(e),0)}function Yk(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=sm(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>Xk(o))?r.sort((o,i)=>nm(o.row)-nm(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function sm(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Lo(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function $o(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Me(o))continue;let i=t==="fill"?sm(o):Lo(o);r.has(i)?(n+=1,t!=="fill"&&rm(o)>rm(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function Qk(e){let t=new Map;for(let r of e){let n=[Lo(r),`${ce(r.chain??r.chainId)}|${ce(Me(r))}`,`*|${ce(Me(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function Jk(e,t){return t.get(Lo(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function Zk(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(om(n)),ce(Me(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ce(n.side)==="sell"){let u=Math.min(s,i.quantity),d=i.quantity?i.cost/i.quantity:pe(n.costBasisUsd)/(s||1);r+=u*(a-d)-c,i.quantity-=u,i.cost-=u*d}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:De(r),lots:t}}function am(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=$o(e.balances||[],"balance"),i=$o(e.positions||[],"position"),s=$o(e.fills||[],"fill"),a=$o(e.prices||[],"price"),c=Qk(a.rows),u=[],d=0,l=0;for(let k of[...o.rows,...i.rows]){let S=Jk(k,c),R=pe(k.quantity??k.amount??k.size),I=S?pe(S.priceUsd??S.price,NaN):pe(k.priceUsd,NaN);if(!Number.isFinite(I)){l+=1;continue}let P=R*I,q=pe(S?.asOf??k.priceAsOf,0),j=r-q>n;j&&(d+=Math.abs(P)),u.push({...k,quantity:R,priceUsd:I,valueUsd:P,stale:j,kind:i.rows.includes(k)?"position":"balance"})}let p=u.filter(k=>k.kind==="balance").reduce((k,S)=>k+S.valueUsd,0),f=u.filter(k=>k.kind==="position"),m=f.reduce((k,S)=>k+S.valueUsd,0),g=f.reduce((k,S)=>k+Math.abs(S.valueUsd),0),h=p+m,w=pe(e.equityUsd,h),E=Zk(Yk(e.fills||[])).realizedPnlUsd,_=f.reduce((k,S)=>{let R=pe(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return k+S.quantity*(S.priceUsd-R)},0),x=new Map;for(let k of u)x.set(ce(Me(k)),(x.get(ce(Me(k)))||0)+Math.abs(k.valueUsd));let O=[...x.values()].reduce((k,S)=>k+S,0),A=[...x].map(([k,S])=>({asset:k,exposureUsd:De(S),percent:O?De(S/O*100):null})).sort((k,S)=>S.exposureUsd-k.exposureUsd||k.asset.localeCompare(S.asset)),b=u.reduce((k,S)=>k+Math.abs(S.valueUsd),0),y=em({snapshots:[{assets:u.map(k=>({symbol:Me(k),usdValue:Math.abs(k.valueUsd),chain:k.chain,venue:k.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:E,unrealizedUsd:De(_),totalUsd:De(E+_)},exposure:{grossUsd:De(g),netUsd:De(h),leverage:w>0?De(g/w):null,equityUsd:De(w)},concentration:A,priceCoverage:{pricedItems:u.length,unpricedItems:l,staleItems:u.filter(k=>k.stale).length,staleValueUsd:De(d),stalePercent:b?De(d/b*100):null,ttlMs:n},risk:y})}var pe,De,ce,Me,om,Lo,cm=v(()=>{tm();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ce=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Me=e=>e.asset??e.symbol??e.coin,om=e=>e.address??e.owner??e.account,Lo=e=>[ce(e.chain??e.chainId),ce(om(e)),ce(Me(e)),ce(e.source)].join("|")});var l2,d2,p2,um=v(()=>{l2=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),d2=Object.freeze(["read","simulate"]),p2=1440*60});function lm(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return eA.test(t)||tA.includes(r)}function $t(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=nA.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of rA)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Jr(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&lm(o))throw new Jr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");$t(o,`${t}[key]`,r),$t(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())$t(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>$t(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(lm(o))throw new Jr(`${t}.${o}`,"forbidden-key-name");$t(i,`${t}.${o}`,r,o)}return e}var Jr,eA,tA,rA,nA,dm=v(()=>{um();Jr=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},eA=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,tA=Object.freeze(["privkey","wif","xprv","seed"]);rA=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),nA=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as oA}from"node:crypto";function wa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(wa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wa(e[t])}`).join(",")}}`}function iA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function qo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))qo(t)}return e}function xa(e,t="fact"){try{$t(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function mm(e){return oA("sha256").update(wa(e)).digest("hex")}function hm({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:iA(r)};return qo({...s,hash:mm(s)})}function Uo({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");xa(t,"intent");let n=hm({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return qo({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function ym(e,t,r,n={}){if(Ea(e),!(pm[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);xa(r,t);let i=n.external===!0||n.externallySupplied===!0;if(fm.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=hm({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return qo({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ea(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(mm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(xa(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!pm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(fm.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var ba,pm,fm,Sa=v(()=>{dm();ba=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),pm=Object.freeze(Object.fromEntries(ba.map((e,t)=>[e,Object.freeze(t+1<ba.length?[ba[t+1]]:[])]))),fm=new Set(["signed","broadcast"])});function gm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return sA[t]??t}function aA(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${gm(e)}:${t}`)}function Ce(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Bo(r)})}function cA(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(e.walletWinRate??e.winRate);Ce(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Ce(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function uA(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Ce(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Ce(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Ce(t,"liquidity_lock",o==null?null:o?.12:-.28)}function lA(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(e.sales??e.saleCount);Ce(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Ce(t,"sales_depth",n===null?null:fe(n/50)*.18)}function dA(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(e.fundingRate??e.funding);Ce(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Ce(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function pA(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Ce(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Ce(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function mA(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>Ee(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function Fo(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Ee(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=gm(o),a=aA(o,i),c=fA[s],u=[];c&&c(o,u);let d=s==="wallet"?2:s==="pool"?3:2,l=Bo(fe(u.length/d)),p=u.reduce((_,x)=>_+x.value,0),f=mA(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Ce(u,"shadow_markout",m);let g=Bo(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),w=Bo(fe(l*h)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),l<n&&E.push("LOW_COVERAGE","NO_TRADE"),w<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Ee(o.ageHours??o.poolAgeHours)??1/0)<24&&E.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&E.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:g,confidence:w,coverage:l,contributions:u,flags:[...new Set(E)],noTrade:E.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var v2,sA,fe,Ee,Bo,fA,ka=v(()=>{v2=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),sA=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),fe=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Ee=e=>Number.isFinite(Number(e))?Number(e):null,Bo=e=>Math.round(e*1e4)/1e4;fA=Object.freeze({wallet:cA,pool:uA,nft_floor:lA,hl_flow:dA,prediction_market:pA})});function hA(e=[],t=[],r={}){let n=Fo(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function yA(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=Uo({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function bm(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=hA(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(yA(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var wm=v(()=>{ka();Sa()});function xm(e){let t=bA[Number(e)]||[];return new Set([...t,...gA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var gA,bA,Em=v(()=>{gA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],bA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Do(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Aa(e){e&&(e.prepareAttempted=!0)}function va(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function SA(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...xm(o)]:[];return new Set([...n,...i])}function kA(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function AA(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function vA(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function IA(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function _A(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of wA)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of xA)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,AA(e)){let o=vA(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=EA.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=SA(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(kA(e)){let o=IA(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):tt;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>tt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>tt?(r.push(`slippage ${o} exceeds cap ${Math.min(i,tt)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function Ia(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=_A(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var wA,xA,EA,Sm=v(()=>{Em();Re();wA=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),xA=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),EA=/^0x[a-fA-F0-9]{40}$/});var Am={};M(Am,{DESK_TOOLS:()=>CA,runDeskTool:()=>NA});function TA(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>OA)throw new TypeError("tool arguments exceed size limit")}function Je(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function NA(e,t,r={}){if(TA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>km)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Qf)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||am)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Uo,o=r.advanceTradeLifecycle||ym,i=r.assertTradeLifecycle||Ea;if(t.action==="create")return Je(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Je(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Aa(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Ia(t.lifecycle,s?.fact||{});if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Do(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Je(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Aa(r.loopVerifier);let a=Ia(t.lifecycle,t.fact);if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Je(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||bm)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Fo)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||Wf,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Je(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Je(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Je(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Je(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var OA,km,Mo,Lt,Zr,CA,vm=v(()=>{Gf();Jf();cm();Sa();ka();wm();Sm();OA=128*1024,km=5e4,Mo={type:"string",minLength:1,maxLength:256},Lt={type:"object",additionalProperties:!0},Zr=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),CA=Object.freeze([Zr("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Mo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Lt,parentId:Mo,childId:Mo},required:["action"],additionalProperties:!1}),Zr("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:km},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Zr("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Lt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Zr("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Mo,intent:Lt,lifecycle:Lt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Lt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Zr("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Lt},markouts:{type:"array",maxItems:100,items:Lt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var Im={};M(Im,{deployGloballyEnabled:()=>PA,executeGloballyEnabled:()=>RA,mevExecuteEnabled:()=>$A});function RA(){return nn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function PA(){return nn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function $A(){return nn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var _m=v(()=>{on()});on();import Om from"node:fs";import _a from"node:process";import{fileURLToPath as LA}from"node:url";import{createInterface as Hm}from"node:readline";var ze=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),zm=/^[A-Za-z0-9_-]{1,64}$/;function sn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function de(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function Vm(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Wm(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ze.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!zm.test(o)||r.has(o))continue;r.add(o);let i=n.inputSchema&&typeof n.inputSchema=="object"&&!Array.isArray(n.inputSchema)?{...n.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...n,name:o,inputSchema:i})}return t}function Gm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Km(e,t,r){let n;try{return await Promise.race([e,new Promise((o,i)=>{n=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{r?.()}catch{}},t)})])}finally{clearTimeout(n)}}function Xm(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function dr(e,t,r="arguments",n=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(n>12)return`${r} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${r} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${r} must equal the required constant`;if(t.type){let o=Xm(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${r} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${r} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${r} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${r} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${r} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=dr(e[i],t.items,`${r}[${i}]`,n+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${r} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${r}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${r}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=dr(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Yo(e,t={}){let r=Wm(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=Gm(t.callTimeoutMs),c=!1;return async function(d){let l=d?.id??null;if(!Vm(d))return de(l,-32600,"invalid request");if(d.method==="initialize")return c=!0,sn(l,{protocolVersion:d.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(d.method==="notifications/initialized")return null;if(d.method==="ping")return sn(l,{});if(!c)return de(l,-32002,"server not initialized");if(d.method==="tools/list")return sn(l,{tools:r});if(d.method==="tools/call"){let p=d.params?.name,f=d.params?.arguments??{};if(typeof p!="string"||!n.has(p))return de(l,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return de(l,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return de(l,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>ze.maxArgumentBytes)return de(l,-32602,"tool arguments exceeded the size limit");let g=dr(f,o.get(p)?.inputSchema);if(g)return de(l,-32602,g);try{let h=new AbortController,w=await Km(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return sn(l,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return de(l,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.message.replace(/\s+/g," ").trim():"",E=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(w),_=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!_&&w.length<=200?de(l,-32e3,`tool call failed: ${w}`):de(l,-32e3,"tool call failed")}}return de(l,-32601,"method not found")}}function Ua(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||ze.maxRequestBytes,64),ze.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||ze.maxResponseBytes,256),ze.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||ze.maxConcurrentCalls,1),ze.maxConcurrentCalls),a=s*8,c=Yo(e,t),u={closed:!1,inflight:0},d=Hm({input:r,terminal:!1,crlfDelay:1/0}),l=0,p=[],f=!1,m=!1;function g(){if(u.closed||u.readerClosed)return;let x=u.inflight>=s||p.length>0||m;x&&!f?(f=!0,d.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),d.resume())}function h(x){if(!x||u.closed)return;let O=JSON.stringify(x);Buffer.byteLength(O)>i&&(O=JSON.stringify(de(x.id,-32003,"response exceeded the size limit"))),n.write(`${O}
|
|
22
|
+
`)===!1&&!m&&(m=!0,g(),n.once("drain",()=>{m=!1,E()}))}function w(x){u.inflight+=1,g(),Promise.resolve(c(x)).then(h).catch(()=>h(de(x?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,E()})}function E(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)w(p.shift());g()}function _(){u.closed||(h(de(null,-32700,"request exceeded the size limit")),u.closed=!0,d.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",x=>{if(u.closed)return;let O=String(x).split(`
|
|
23
|
+
`);for(let A=0;A<O.length;A+=1){if(l+=Buffer.byteLength(O[A]),l>o){_();return}A<O.length-1&&(l=0)}}),d.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){_();return}let O;try{O=JSON.parse(x)}catch{h(de(null,-32700,"parse error"));return}if(p.length>=a){h(de(O?.id,-32e3,"server busy"));return}p.push(O),E()}),d.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ba=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),Ym=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function ct(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Se(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function pr(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Se(o)}return`${r} raw`}return Se(e)}var Qm=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Jm(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Qm[String(e||"").toUpperCase()]}function Fa(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((l,p)=>l+(Number(p.amountUSD)||0),0)||null,d=(c.feeCosts||[]).reduce((l,p)=>l+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:d,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let i=[],s=(c,u,d={})=>{u==null||u===""||i.push({label:c,value:String(u),...d})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Jm(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let d=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,l=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=pr(d,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??pr(l,u),{hero:!0}),s("GROSS OUT",d!==void 0&&l!==void 0&&String(d)!==String(l)?pr(l,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Se(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Se(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",pr(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&l!==void 0){let w=Number(l),E=Number(m);Number.isFinite(w)&&Number.isFinite(E)&&w>0&&E>0&&E<=w&&s("SLIPPAGE",`${((1-E/w)*1e4).toFixed(0)} bps max`)}let g=c.meta?.fee??c.poolFee;g!=null&&s("POOL FEE",`${Number(g)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Se(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let h=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(w=>w!==a).slice(0,3):[];for(let w of h){let E=w?.provider||w?.venue||w?.source,_=pr(w?.netOut??w?.amountOut??w?.toAmount,u);E&&_&&s(`vs ${E}`,_,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",u!=null?`$${Se(u)}`:null,{hero:!0});let d=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",d?d.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),d){let f=d.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,g)=>Number(g.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Se(m.knownUsd)}`,{dim:!0})}let l=o.avgEntryUsd??o.avgCostUsd;if(l!==void 0)s("AVG ENTRY",`$${Se(l)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((g,h)=>g+h,0)/f.length;s("AVG ENTRY",`$${Se(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Se(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Se(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(d=>Number(d?.priceEth??d?.price??d?.costEth)).filter(d=>Number.isFinite(d)&&d>0);u.length>0&&s("AVG BUY",`${Se(u.reduce((d,l)=>d+l,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Se(o.owners??o.numOwners))}return i}function Zm(e,t,r){let n=Ba[e]||Ba.generic,o=Fa(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=ct(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${ct(u.label)}</span><b>${ct(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
|
|
30
24
|
:root{color-scheme:dark}
|
|
31
25
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
32
26
|
body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
@@ -62,9 +56,9 @@ summary::before{content:"\u25B8 "}details[open] summary::before{content:"\u25BE
|
|
|
62
56
|
pre{margin-top:8px;font-size:10px;color:#9FB8D2;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-all}
|
|
63
57
|
.card:active{transform:scale(.985);transition:transform .1s}
|
|
64
58
|
</style></head><body><div class="card">
|
|
65
|
-
<div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${
|
|
66
|
-
${i?`<div class="hero">${
|
|
59
|
+
<div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${ct(n.title)}</span></div>
|
|
60
|
+
${i?`<div class="hero">${ct(i.value)}</div><div class="herolabel">${ct(i.label)}</div>`:""}
|
|
67
61
|
${c}
|
|
68
|
-
<details><summary>details \xB7 ${
|
|
69
|
-
<div class="foot"><span>${
|
|
70
|
-
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Yc(e,t){let r=Cg[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Kc(r,t).some(i=>i.hero))return null;let o=Pg(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}var Oc=_t("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787").replace(/\/$/,""),sg={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},Ar={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:sg,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:sg,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Q1=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Use this to discover what public APIs are available before calling data_call. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_call",description:"Generic escape hatch: call any provider/op from the catalog. provider+op are required; args is a free-form object matching that op. Read-only. Use data_catalog first to see valid provider/op pairs.",inputSchema:{type:"object",required:["provider","op"],properties:{provider:{type:"string",description:"provider id, e.g. defillama, dexscreener, lifi, evm-rpc"},op:{type:"string",description:"op name for that provider, e.g. protocols, search, quote"},args:{type:"object",description:"op arguments (free-form)"}}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:Ar,conversionGasEvidence:Ar,gasPriceEvidence:Ar,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:Ar,conversionGasEvidence:Ar,gasPriceEvidence:Ar,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",required:["collectionIds"],properties:{collectionIds:{type:"string"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"address_book_remember",description:"Remember a wallet address with a label. Call this whenever someone states their address or an agent/counterparty wallet is discovered, so it survives the conversation. Stores labels only \u2014 never private keys, seeds, or passphrases.",inputSchema:{type:"object",required:["address","label"],properties:{address:{type:"string",description:"0x address"},label:{type:"string",description:"short name, e.g. research-agent"},who:{type:"string",description:"person or entity the wallet belongs to"},role:{type:"string",description:"agent | owner | person | counterparty | venue"},chainIds:{type:"array",items:{type:"number"}},notes:{type:"string"}}}},{name:"address_book_list",description:"List remembered wallets (owner, agent, people, counterparties). Read-only. Check this before sending or bridging to a person.",inputSchema:{type:"object",properties:{q:{type:"string",description:"search across label, who, address, notes"},role:{type:"string"},who:{type:"string"}}}},{name:"address_book_lookup",description:"Look up one 0x address in the durable address book. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"address_book_forget",description:"Remove a remembered address, optionally only one label for it.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},label:{type:"string"}}}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker","recipient"],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","amount","taker"],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"vault_status",description:"Local vault/signer posture on this machine (exists, armed, disarmed). Never returns key material. Never signs.",inputSchema:{type:"object",properties:{}}},{name:"signer_status",description:"Ping the loopback local signer. Reports running/armed. Never signs or broadcasts.",inputSchema:{type:"object",properties:{}}},{name:"signer_pending",description:"List pending local-signer artifacts waiting for Allow/Deny. Read-only. Does not approve, deny, sign, or broadcast. Fill stays on Telegram Allow or oracle signer /ack.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback local signer. Does not sign or broadcast. Requires oracle signer running on 127.0.0.1.",inputSchema:{type:"object",required:["artifact"],properties:{artifact:{type:"object"}}}},{name:"signer_ack",description:"Fill one pending artifact through the armed loopback signer. Same path as Telegram Allow. Fails closed if the signer is not running or is disarmed. MCP never holds keys.",inputSchema:{type:"object",properties:{id:{type:"string",description:"pending id (8-hex) or digest prefix"},digest:{type:"string"}}}},{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",inputSchema:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}}}},{name:"skill_list",description:"List packaged + local Oracle skills (same roster the native harness uses).",inputSchema:{type:"object",properties:{}}},{name:"skill_load",description:"Load full SKILL.md content by name. Read-only.",inputSchema:{type:"object",required:["name"],properties:{name:{type:"string"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],ag=String(Tc.env.ORACLE_DEFAULT_ADDRESS||Tc.env.MAD_OPERATOR_ADDRESS||"").trim(),Z1={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||ag||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||ag;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Cc(e,{method:t="GET",body:r}={}){let n=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0}),o=await n.json().catch(()=>({}));if(!n.ok)throw new Error(o.error||`HTTP ${n.status}`);return o}async function cg(e,t,r={}){try{return await Cc(`${Oc}/data/call`,{method:"POST",body:{provider:e,op:t,args:r}})}catch(n){let o=typeof n?.message=="string"?n.message:"";if(o&&!/^HTTP \d+$/.test(o))return{error:o,provider:e,op:t};throw n}}async function eI(e,t={}){let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:o}=await Promise.resolve().then(()=>(dl(),ll));return o(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()})}if(e==="rfq_quote"){let{normalizeRfqIntent:o}=await Promise.resolve().then(()=>(ys(),vl)),{requestRfqQuotes:i}=await Promise.resolve().then(()=>(Nd(),Cd)),s=o({...t,sources:t.sources??t.allowedSources});return i(s,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:o,bestBridgeRoute:i}=await Promise.resolve().then(()=>(hr(),np));return e==="best_swap_route"?o(t):i(t)}if(e==="prepare_best_route"){let{prepareBestRoute:o}=await Promise.resolve().then(()=>(ip(),op));return o(t)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:o}=await Promise.resolve().then(()=>(ap(),sp));return o(t)}if(e==="twap_simulate"){let{simulateTwap:o}=await Promise.resolve().then(()=>(dp(),lp));return o({...t,amount:t.amount??t.amountIn})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:o}=await Promise.resolve().then(()=>(rf(),tf));return o(t)}if(e==="perps_markets"){let o=String(t.venue||"all").toLowerCase(),i={};if(o==="all"||o==="dydx"){let{dydxMarkets:s}=await Promise.resolve().then(()=>(of(),nf));i.dydx=await s()}if(o==="all"||o==="drift"){let{driftMarkets:s}=await Promise.resolve().then(()=>(cf(),af));i.drift=await s()}if(o==="all"||o==="vertex"){let{vertexMarkets:s}=await Promise.resolve().then(()=>(lf(),uf));i.vertex=await s()}return i}if(e==="dex_quote"){let o=String(t.dex||"").toLowerCase();if(o==="pancakeswap"){let{pancakeQuote:i}=await Promise.resolve().then(()=>(pf(),df));return i(t)}if(o==="sushiswap"){let{sushiQuote:i}=await Promise.resolve().then(()=>(hf(),mf));return i(t)}if(o==="raydium"){let{raydiumQuote:i}=await Promise.resolve().then(()=>(wf(),gf));return i(t)}return{error:`unknown dex: ${o} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:o}=await Promise.resolve().then(()=>(bf(),yf));return{aevo:await o()}}if(e==="lending_markets"){let{compoundMarkets:o}=await Promise.resolve().then(()=>(Sf(),xf));return{compound:await o()}}if(e==="yield_vaults"){let[{yearnVaults:o},{convexPools:i}]=await Promise.all([Promise.resolve().then(()=>(Af(),Ef)),Promise.resolve().then(()=>(kf(),vf))]);return{yearn:await o(),convex:await i()}}if(e==="equity_venues"){let{equityVenues:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o())}if(e==="equity_quote"){let{bestEquityRoute:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let o=await Promise.resolve().then(()=>(Jo(),Go));return o.registerBuiltinScanners?.(),o.scannerCoverage()}if(e==="scan_token"){let o=await Promise.resolve().then(()=>(Jo(),Go));o.registerBuiltinScanners?.();let i=o.getScanner(Number(t.chainId));if(!i)throw new Error(`no scanner registered for chainId ${t.chainId}`);let s=await i.resolveToken(t.token),a=i.supports?.("resolvePools")?await i.resolvePools(t.token).catch(()=>null):null,c=i.supports?.("scoreRisk")?await i.scoreRisk({token:t.token}).catch(()=>null):null;return{chainId:Number(t.chainId),token:s,pools:a,risk:c}}if(e==="wallet_balances"){let o=await Promise.resolve().then(()=>(Jo(),Go));o.registerBuiltinScanners?.();let i=o.getScanner(Number(t.chainId));if(!i)throw new Error(`no scanner registered for chainId ${t.chainId}`);let s=await i.nativeBalance(t.address),a=t.token?await i.tokenBalance(t.address,t.token).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:s,token:a}}if(e==="address_book_remember")return Vc({address:t.address,label:t.label,who:t.who,role:t.role,chainIds:t.chainIds,notes:t.notes,source:"oracle-data-mcp"});if(e==="address_book_list")return Hc({q:t.q,role:t.role,who:t.who});if(e==="address_book_lookup")return zc(t.address);if(e==="address_book_forget")return Wc(t.address,t.label||null);if(e==="vault_status"){let{vaultStatus:o}=await Promise.resolve().then(()=>(zt(),Ht));return{ok:!0,...o(),execution:!1}}if(e==="signer_status"){let{signerStatus:o}=await Promise.resolve().then(()=>(zt(),Ht));return{...await o(),execution:!1}}if(e==="signer_pending"){let{signerPending:o}=await Promise.resolve().then(()=>(zt(),Ht));return o()}if(e==="watch_list"){let{listWatches:o}=await Promise.resolve().then(()=>(Ko(),Fa));return{ok:!0,watches:o(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:o}=await Promise.resolve().then(()=>(Ko(),Fa));return{ok:!0,watch:o(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:o}=await Promise.resolve().then(()=>(Pa(),ym));return{ok:!0,...o(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:o}=await Promise.resolve().then(()=>(lh(),uh));return o({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0})}if(e==="signer_queue"){let{signerQueue:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.artifact)}if(e==="signer_ack"){let{signerAck:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.id||t.digest)}if(e==="signer_deny"){let{signerDeny:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.id||t.digest)}if(e==="skill_list"){let{listSkills:o}=await Promise.resolve().then(()=>(lc(),uc));return{ok:!0,skills:o().map(i=>({name:i.name,description:i.description,size:i.size}))}}if(e==="skill_load"){let{loadSkill:o}=await Promise.resolve().then(()=>(lc(),uc)),i=o(t.name);return i?{ok:!0,name:t.name,content:i}:{ok:!1,error:`unknown skill: ${t.name}`}}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:o}=await Promise.resolve().then(()=>(rg(),tg));return o(e,t)}if(e==="mev_status"){let{executeGloballyEnabled:o,mevExecuteEnabled:i}=await Promise.resolve().then(()=>(og(),ng));return{ok:!0,observer:!0,executeGloballyEnabled:o()===!0,mevExecuteEnabled:i()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:o}=await Promise.resolve().then(()=>($s(),cd));return{ok:!0,chains:Object.entries(o).map(([i,s])=>({id:i,chainId:s.chainId,name:s.name,evm:s.evm===!0}))}}if(e==="data_catalog")return Cc(`${Oc}/data/catalog`);if(e==="data_health")return Cc(`${Oc}/data/health`);if(e==="data_call"){if(!t.provider||!t.op)throw new Error("provider and op are required");return cg(t.provider,t.op,t.args||{})}let n=Z1[e];if(n){let{provider:o,op:i,args:s}=n(t);return cg(o,i,s)}throw new Error(`Unknown tool: ${e}`)}function tI(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:n,...o}=e;return{content:[{type:"image",data:n,mimeType:e.mimeType},{type:"text",text:JSON.stringify(o,null,2)}]}}let r=[{type:"text",text:JSON.stringify(e,null,2)}];try{let n=Yc(t,e);n&&r.push(n)}catch{}return{content:r}}var ug=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Q1,async call(e,t){return tI(await eI(e,t),e)}});function rI(){return Gc(ug)}function nI(){let e=Tc.argv[1];if(!e)return!1;try{return ig.realpathSync(e)===ig.realpathSync(X1(import.meta.url))}catch{return!1}}nI()&&rI();var B5=_i(ug);export{eI as callTool,B5 as handle,rI as startStdioLoop,Q1 as tools};
|
|
62
|
+
<details><summary>details \xB7 ${ct(t)}</summary><pre>${a}</pre></details>
|
|
63
|
+
<div class="foot"><span>${ct(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
|
|
64
|
+
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Da(e,t){let r=Ym[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Fa(r,t).some(i=>i.hero))return null;let o=Zm(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Qo();function ja(e){let t=String(e||"").replace(/[^a-z0-9]/gi,"").toLowerCase();return/authorization|cookie|password|credential|privatekey|mnemonic|seedphrase|apikey|accesstoken|refreshtoken|clientsecret|signertoken|bearer/.test(t)||t.endsWith("secret")?!0:t.endsWith("token")&&!new Set(["tokenin","tokenout","tokenid","tokens"]).has(t)}var fh=[/\bsk-[A-Za-z0-9_-]{10,}\b/g,/\bsk_(?:live|test)_[A-Za-z0-9_-]{10,}\b/g,/\b(?:ghp_|github_pat_|gho_|ghs_|xox[baprs]-|AIza|AKIA|pplx-|hf_|xai-|gsk_|npm_|tvly-)[A-Za-z0-9_-]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,/\bBearer\s+[^\s,"'}]+/gi,/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi];function an(e){let t=String(e??"");for(let r of fh)r.lastIndex=0,t=t.replace(r,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(r,n,o)=>ja(n)?`${n}${o}[REDACTED]`:r),mh(wt(t,{force:!0}))}function mh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Ma(t);return r.ok?r.href:t})}function fr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(ja(n))return"[REDACTED]";if(typeof e=="string"){let i=an(e);return i.length<=2e4?i:`${i.slice(0,2e4)}\u2026[truncated]`}if(e==null||typeof e=="boolean"||typeof e=="number")return e;if(t>=12)return"[max-depth]";if(typeof e!="object")return wt(String(e),{force:!0}).slice(0,240);if(r.has(e))return"[circular]";if(r.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>fr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=fr(s,{depth:t+1,seen:r,key:i});return o}function qA(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let r=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!r||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var Oa=qA(Xo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),UA=2*1024*1024;async function BA(e,t=UA){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Cm={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},cr={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Nm=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],Tm=String(_a.env.ORACLE_DEFAULT_ADDRESS||_a.env.MAD_OPERATOR_ADDRESS||"").trim(),FA=Object.freeze(["data_call","address_book_remember","address_book_list","address_book_lookup","address_book_forget","vault_status","signer_status","signer_pending","signer_queue","signer_ack","signer_deny","skill_list","skill_load"]),DA=new Set(Nm.map(e=>e.name));for(let e of FA)if(DA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var MA={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||Tm||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||Tm;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Ca(e,{method:t="GET",body:r,signal:n}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0,signal:n}),i=await BA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function jA(e,t,r={},n={}){try{return await Ca(`${Oa}/data/call`,{method:"POST",body:{provider:e,op:t,args:r},signal:n.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function Rm(e,t={},r={}){let n={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(n){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(nu(),ru));return i(n.operation,{...t,...n.action?{action:n.action}:{},nowMs:t.nowMs??Date.now()},{signal:r.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(zi(),yu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Nl(),Tl)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:r.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(tr(),nd));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(id(),od));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(ad(),sd));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(dd(),ld));return i({...t,amount:t.amount??t.amountIn},{signal:r.signal,...r.quoteFn?{quoteFn:r.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(rp(),tp));return i(t,r)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(op(),np));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(ap(),sp));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(up(),cp));s.vertex=await a(r)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(dp(),lp));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(mp(),fp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(yp(),hp));return s(t,r)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(bp(),gp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(xp(),wp));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Sp(),Ep)),Promise.resolve().then(()=>(Ap(),kp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Oo(),_o));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,r),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,r).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,r).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,r),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},r).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(kf(),Sf));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(jf(),Mf));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(vm(),Am));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(_m(),Im));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(cs(),cl));return{ok:!0,chains:Object.entries(i).map(([s,a])=>({id:s,chainId:a.chainId,name:a.name,evm:a.evm===!0}))}}if(e==="data_catalog")return Ca(`${Oa}/data/catalog`,{signal:r.signal});if(e==="data_health")return Ca(`${Oa}/data/health`,{signal:r.signal});let o=MA[e];if(o){let{provider:i,op:s,args:a}=o(t);return jA(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Pm(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=an(JSON.stringify(fr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=fr(e),o=an(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Da(t,e):null;s&&i.push(s)}catch{}return{content:i}}var $m=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Nm,async call(e,t,r={}){return Pm(await Rm(e,t,r),e)}});function HA(){return Ua($m)}function zA(){let e=_a.argv[1];if(!e)return!1;try{return Om.realpathSync(e)===Om.realpathSync(LA(import.meta.url))}catch{return!1}}zA()&&HA();function VA({timeoutMs:e,callToolOptions:t={}}={}){return Yo({...$m,async call(r,n,o={}){return Pm(await Rm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var X2=VA();export{FA as PUBLIC_MCP_FORBIDDEN_TOOLS,Rm as callTool,VA as createPublicMcpHandler,Pm as formatMcpResult,X2 as handle,Ca as httpJson,BA as readBoundedJsonResponse,qA as resolveDataUrl,HA as startStdioLoop,Nm as tools};
|