@oracle-agent/oracle 0.28.29 → 0.28.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +13 -13
- package/dist/bin/oracle-data-mcp.mjs +15 -21
- package/dist/bin/oracle-gateway.mjs +36 -36
- 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 +9 -9
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/cli/commands/chat.mjs +132 -132
- 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 +132 -132
- package/dist/cli/commands/resolve.mjs +6 -6
- package/dist/cli/commands/snipe.mjs +8 -8
- package/dist/cli/commands/strategy.mjs +3 -3
- package/dist/cli/commands/swap.mjs +10 -10
- package/dist/data/desk-data.mjs +17 -17
- package/dist/data/names.mjs +2 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +22 -22
- package/dist/local-signer/runtime.mjs +7 -7
- 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 Tm=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 j=(e,t)=>{for(var r in t)Tm(e,r,{get:t[r],enumerable:!0})};import{homedir as jo}from"node:os";import{join as Ho}from"node:path";function zo(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 tn(e,t,r=!1){return String(zo(e,t,r?"1":"")).trim()==="1"}var Ta,Nm,AA,rn=v(()=>{Ta=process.env.ORACLE_PUBLIC_DESKTOP==="1",Nm=Ta?process.env.ORACLE_CONFIG_DIR||Ho(jo(),".config","oracle"):Ho(jo(),".config","oracle"),AA=Ta?Nm:Ho(jo(),".config","mad-desk")});function eh(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function th(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||zm))return r;let n=t.fileRead?th:eh;r=r.replace(Gm,"[REDACTED_PRIVATE_KEY]"),r=r.replace(Wm,"[REDACTED_EVM_KEY]"),r=r.replace(Km,o=>n(o));for(let o of Vm)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(Xm,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(Ym,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(Qm,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function qa(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();Zm.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var Hm,zm,Vm,Wm,Gm,Km,Xm,Ym,Qm,Jm,Zm,Wo=v(()=>{Hm=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),zm=["1","true","yes","on"].includes(Hm),Vm=[/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],Wm=/\b0x[a-fA-F0-9]{64}\b/g,Gm=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Km=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Xm=/\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,Ym=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,Qm=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Jm=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"]),Zm=new Set([...Jm].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import xt from"node:net";import oh from"node:dns";function sn(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 Go(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 Ko(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=sn(e);if(!t)return!1;let r=sn("::ffff:0:0");return Go(t,r,96)?Ko([...t.slice(12)].join(".")):Go(t,sn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Go(t,sn(o),i)):!1}return!1}function sh(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(ih.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xt.isIP(r);return n!==0&&!Ko(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Xo(e,{lookupFn:t=oh.promises.lookup}={}){let r=sh(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=>!Ko(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Yo({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=ah((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 ah(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[Qo]=Object.freeze({pin:t}),e}function Jo(e){return typeof e=="function"&&typeof e[Qo]?.pin=="function"}function Ua(e,t,r){if(!Jo(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Qo].pin(t,r)}var ih,Qo,Ba=v(()=>{ih=new Set(["localhost","metadata.google.internal","metadata.goog"]);Qo=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as ch}from"node:crypto";function fh(e){let t=String(e||"").toLowerCase();return za.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function mh(e){let t={};for(let[r,n]of Object.entries(e||{}))fh(r)||(t[r]=n);return t}function hh(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 yh(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function gh(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([...za,...i])].sort().map(d=>`${d}=${o[d]??""}`).join(`
|
|
3
|
+
`),c=ch("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function bh(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Da):Math.min(250*2**e,Da)+Math.floor(Math.random()*100)}function pr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ei(e,t,r){return pr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function fr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function xh(e){return e?e.byteLength??e.length??0:0}async function ja(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&&(fr(e),!n))throw ei(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 ei(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+=xh(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 ei(r,`streamed ${c} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Ha(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Sh(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,S=s?{lookupFn:s}:{};if(c&&!a&&!Jo(w))throw pr(`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 Xo(x,S);if(!A.ok)throw pr(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 Yo({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw pr(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 Ua(w,b,A.addresses);return A};try{let x=String(e),O={...n||{}};c&&await _(x);for(let A=0;A<=Ma;A+=1){let b=await w(x,{method:r,headers:O,body:o,signal:g,redirect:"manual"});if(dh.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let $=await ja(b,u??ph,{url:x,truncate:!0}),L=new Error(`HTTP ${b.status} ${r} ${x} redirected non-idempotent request`);throw L.status=b.status,L.body=Ha($)??$.slice(0,300),L}if(A===Ma)throw fr(b),new Error(`HTTP redirect loop for ${e}`);let E=b.headers?.get?.("location"),R;try{R=hh(E,x)}catch($){throw fr(b),$}let I=!yh(R,x);if(fr(b),I&&(O=mh(O)),c)await _(R,{status:b.status});else if(I){let $=await Xo(R,S);if(!$.ok){let L=new Error(`HTTP redirect from ${x} ${$.error}`);throw L.status=b.status,L.retryable=!1,L}a&&$.addresses?.length&&(h||(h=await Yo(d?{importUndici:d}:{})),h&&(h.pin(new URL(R).hostname,$.addresses),w=h.fetch))}x=R;continue}if(typeof l=="function")try{await l(b,{url:x})}catch(E){throw fr(b),pr(E?.message||String(E))}let y=await ja(b,u,{url:x,onOversize:()=>f.abort()}),k=Ha(y);if(!b.ok){let E=new Error(`HTTP ${b.status} ${r} ${x}`);throw E.status=b.status,E.retryAfter=b.headers?.get?.("retry-after")??null,E.body=k??y.slice(0,300),E}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):lh,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 Sh(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,E=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?E.has(y)||uh.has(y)&&Fa.has(o):!k&&Fa.has(o);if(A===a||!R)throw b;let I=bh(A,b?.retryAfter);f?await new Promise(($,L)=>{let M=setTimeout($,I);f.addEventListener("abort",()=>{clearTimeout(M),L(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await wh(I)}}throw O};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let S=gh(o,e,i,{untrustedUrl:d,maxResponseBytes:g}),_=Zo.get(S);if(_)return _;let x=h().finally(()=>Zo.delete(S));return Zo.set(S,x),x}async function an(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 uh,Fa,lh,Da,za,dh,Ma,ph,Zo,wh,W=v(()=>{Ba();uh=new Set([408,425,429,500,502,503,504]),Fa=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),lh=2,Da=4e3,za=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],dh=new Set([301,302,303,307,308]),Ma=3,ph=64*1024;Zo=new Map;wh=e=>new Promise(t=>setTimeout(t,e))});function Ah({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"?kh:Eh}async function ti(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Ah(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Va(e={}){return ti({type:"meta"},e)}async function Wa({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 ti(i,o)}async function Ga({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return ti({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Eh,kh,ri=v(()=>{W();Eh="https://api.hyperliquid.xyz/info",kh="https://api.hyperliquid-testnet.xyz/info"});import{createHash as vh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Lt(e){return typeof e=="number"&&Number.isFinite(e)}function ii(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ii(t);return Object.freeze(e)}for(let t of Object.keys(e))ii(e[t]);return Object.freeze(e)}function St(e){if(Array.isArray(e))return e.map(St);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=St(e[r]);return t}return e}function ni(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 Ka(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function _h(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Oh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Ch(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 Ya(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Ih.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 St({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>St(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 Qa(e){return vh("sha256").update(JSON.stringify(Ya(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 oi(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(!Lt(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 Th(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(!Lt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");oi(e.train,"train");let u=oi(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Lt(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`),S=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||S>=_||_>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=oi({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(Lt(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(!Lt(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 Ja(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=Ya(e),n=St({id:e.id,...r});if(JSON.stringify(St(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Qa(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Th(e,t),e}function si({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(!Lt(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=mr(t),d=t.length,l=(B=[],H={})=>Xa({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,S;try{w=ct(a,g,r),S=ct(a,h,r)}catch(B){return l([{type:"backtest_error",message:String(B.message||B)}])}let _={metrics:ni(w),costs:Ka(w),tradeCount:w.metrics.tradeCount},x={metrics:ni(S),costs:Ka(S),tradeCount:S.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),Jr;try{Jr=ct(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 Zr=ni(Jr),en=Ch(Zr,a.risk,i);A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:en,reason:en?"pass":"fail_metrics",metrics:Zr})}let y=A.filter(B=>B.passed).length,k=A.length===0?0:y/A.length,E={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=_h(x.costs),I=Oh(S);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let $=s.some(B=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(B.type)),L=s.some(B=>B.type==="overfit"),M="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)&&!L&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?M="pass_live_eligible":!$&&x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(M="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):L&&x.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?M="fail":x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!$?M="pass_paper_only":M="fail",x.metrics.netPnlUsd<0&&(M=M==="pass_live_eligible"?"fail":M==="pass_paper_only"?"pass_paper_only":"fail",M="fail"),Xa({status:M,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:x,walkForward:E,flags:s})}function Xa({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=Qa(u),ii(St(JSON.parse(JSON.stringify(u))))}var Ih,ai=v(()=>{At();Et();cn();Ih=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as Nh,createHmac as Rh,timingSafeEqual as WA}from"node:crypto";function ci(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ci).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ci(e[r])}`).join(",")}}`}function Za(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function ec(e=process.env){return Za(process.env)||Za(e)}function Lh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Uh(e){let t=Lh(e);return Nh("sha256").update(ci(t)).digest("hex")}function Bh(e,t=ec()){return t?Rh("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+Ph:Number(i),d=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||d<=0||d>qh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:$h},f=Uh(p),m=ec(n),g=m?Bh(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var $h,Ph,qh,ge=v(()=>{$h=2,Ph=300*1e3,qh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function hr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Dh(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function li(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>li(r,`${t}[${n}]`));return}if(hr(e))for(let[r,n]of Object.entries(e)){let o=Dh(r);if(Fh.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);li(n,`${t}.${r}`)}}function ui(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function tc({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(li({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!hr(e))throw new Error("handoff: strategy required");if(!hr(t))throw new Error("handoff: evidence required");if(!hr(r))throw new Error("handoff: shadow required");if(!hr(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(Ja(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(!ui(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(!ui(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(!ui(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:yr,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 Fh,rc=v(()=>{At();ai();Et();ge();Fh=["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 gr(e){if(Array.isArray(e))for(let t of e)gr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))gr(t);return Object.freeze(e)}function jh(e){let t=Mh[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function Hh(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 gr([...r.values()].sort((n,o)=>n.t-o.t))}function zh(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 Vh({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 Ga({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 zh(o,r)}function Wh(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 nc(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=jh(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([Wa({coin:r,interval:n,startTime:a,endTime:i},t),Vh({coin:r,startTime:a,endTime:i},t)]),d=Hh(c,{endTime:i}),l=gr(Wh(d,u,o));return gr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:l})}var Mh,oc=v(()=>{ri();Mh=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 Xh(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))Kh.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"||!Gh.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 Yh(e={}){let t=await Va(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 Gh,Kh,ic,sc=v(()=>{ri();rc();oc();Gh=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Kh=new Set(["coin","interval"]);ic=Object.freeze({id:"hyperliquid",validateMarket:Xh,fetchBars:nc,listMarkets:Yh,prepareIntent(e){return tc(e)}})});function Jh(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 Qh.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 di(e){return typeof e!="string"?null:Zh.get(e)??null}function pi(e){let t=di(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Qh,ac,Zh,s1,fi=v(()=>{sc();Qh=Object.freeze(["id","validateMarket","prepareIntent"]);ac=[ic].map(Jh),Zh=new Map(ac.map(e=>[e.id,e])),s1=Object.freeze([...ac])});import{createHash as e0}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 hc(e){return Number.isInteger(e)&&e>0}function bi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)bi(t);return Object.freeze(e)}for(let t of Object.keys(e))bi(e[t]);return Object.freeze(e)}function wi(e){if(Array.isArray(e))return e.map(wi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=wi(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function ut(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 wc(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 gi(e,t,r,n){if(Ie(e)){if(ut(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(hc)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return hc(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function yc(e,t,r,n){return Ie(e)?(ut(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 un(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 u0(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 un(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 l0(e,t){if(!Ie(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>pc)return C(t,"parameters",`too many parameters (max ${pc})`),null;let n={};for(let o of r){if(!gc.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}ut(i,uc,s,t);for(let l of uc)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&&(wc(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 d0(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"||!dc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),ut(e,c0,o,n),null;switch(ut(e,dc[e.type],o,n),(typeof e.id!="string"||!bc.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"||!t0.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=yc(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!r0.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=gi(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=gi(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=gi(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?s0.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=yc(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?a0.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"||!n0.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"||!o0.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"||!i0.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 p0(e,t,r){if(!Ie(e))return C(t,"risk","must be a plain object"),null;ut(e,lc,"risk",t);for(let p of lc)(!(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 xi(e,t={}){let r=[];if(!Ie(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};ut(e,cc,"",r);for(let l of cc)(!(l in e)||e[l]==null)&&C(r,l,"required field is missing");e.version!==mi&&C(r,"version",`must be ${mi}`),(typeof e.id!="string"||!gc.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>mc)&&C(r,"name",`must be a non-empty string max ${mc}`);let n=di(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=l0(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>fc)C(r,"nodes",`too many nodes (max ${fc})`);else{s=[];for(let l=0;l<e.nodes.length;l++){let p=d0(e.nodes[l],l,i||{},r);p&&(typeof p.id=="string"&&bc.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 un(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 un(p)){let g=a.get(m);g&&hi.has(g.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of un(p)){let g=a.get(m);g&&!hi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}u0(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!Ie(e.rules))C(r,"rules","must be a plain object");else{ut(e.rules,yi,"rules",r);for(let l of yi)l in e.rules||C(r,`rules.${l}`,"required field is missing");c={};for(let l of yi){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);hi.has(f.type)||C(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=p}}let u=p0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let d=bi({version:mi,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=xi(e,t);if(!r.ok)throw new Dt(r.errors);return r.strategy}function f0(e){let t=me(e);return JSON.stringify(wi(t))}function Ut(e){let t=f0(e);return e0("sha256").update(t,"utf8").digest("hex")}function br(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(!wc(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 mi,gc,bc,t0,r0,n0,o0,i0,s0,a0,hi,cc,uc,yi,lc,c0,dc,pc,fc,mc,Dt,Et=v(()=>{fi();mi=1,gc=/^[a-z0-9][a-z0-9._-]{0,63}$/,bc=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,t0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),r0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),n0=new Set(["gt","gte","lt","lte","eq"]),o0=new Set(["and","or","not"]),i0=new Set(["above","below"]),s0=new Set(["line","signal","histogram"]),a0=new Set(["upper","middle","lower"]),hi=new Set(["compare","logic","cross"]),cc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),uc=new Set(["value","min","max","step"]),yi=new Set(["entryLong","entryShort","exitLong","exitShort"]),lc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),c0=new Set(["id","type"]),dc={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"])},pc=16,fc=128,mc=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 wr(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 lt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function m0(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 Sc(e,t){wr(e),lt(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 ln(e,t){wr(e),lt(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 Ec(e,t){wr(e),lt(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]=xc(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]=xc(i,s)}return r}function xc(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function kc(e,t={}){wr(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(lt(r),lt(n),lt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=ln(e,r),s=ln(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 Ac(e,t={}){wr(e);let r=t.period,n=t.stdDev;if(lt(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 vc(e,t){m0(e),lt(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 Ic=v(()=>{});import{createHash as h0}from"node:crypto";var Si,y0,g0,b0,_c,Oc=v(()=>{Si=2,y0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",g0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",b0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",_c=h0("sha256").update(JSON.stringify({version:Si,compilerSourceHash:y0,indicatorsSourceHash:g0,schemaSourceHash:b0})).digest("hex")});function Ne(e){return typeof e=="number"&&Number.isFinite(e)}function S0(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 E0(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!==x0[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=w0[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=vc(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=Sc(d,c);else if(s.indicator==="ema")a=ln(d,c);else if(s.indicator==="rsi")a=Ec(d,c);else if(s.indicator==="macd")a=kc(d,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Ac(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=br(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(S0(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 S=f.get(w);g[w]=S[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){E0(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:yr,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:p})}var yr,kt,w0,x0,At=v(()=>{Et();Ic();Oc();yr=Si,kt=_c,w0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),x0=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 k0}from"node:crypto";function v0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function Ei(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ei(t);return Object.freeze(e)}for(let t of Object.keys(e))Ei(e[t]);return Object.freeze(e)}function dn(e){if(Array.isArray(e))return e.map(dn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=dn(e[r]);return t}return e}function ki(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)=>ki(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))ki(n,`${t}.${r}`)}}function Tc(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 mr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Tc(e),k0("sha256").update(JSON.stringify(dn(e)),"utf8").digest("hex")}function I0(e){if(e==null&&(e={}),!v0(e))throw new TypeError("options must be a plain object");let t={...A0},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 pn(e){return e/1e4}function _0(e,t,r){let n=pn(r);return t==="long"?e*(1+n):e*(1-n)}function O0(e,t,r){let n=pn(r);return t==="long"?e*(1-n):e*(1+n)}function Cc(e,t,r){let n=Math.abs(e)*pn(t),o=Math.abs(e)*pn(r);return{taker:n,builder:o,total:n+o}}function C0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function T0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function N0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function R0(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 $0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function P0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function q0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function xr(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 L0(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 U0(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 ct(e,t,r={}){let n=I0(r);Tc(t);let o=mr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(xr(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,S=[],_=[],x=[],O=[],A=[],b=null,y=0,k=null,E=p,R=!1,I=0,$=0,L=[],M=new Array(t.length).fill(0);function X(T){L.push(T)}function B(T){let D=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,D-M[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,P){let ee=P.o,z=C0(p,s);if(!(z>0)||!(ee>0))return;let te=_0(ee,D,u),Q=z/te,se=B(T),ar=te*se;if(Q>se){x.push({kind:"entry",barIndex:T,time:P.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:ar,reason:"volume_participation"});return}M[T]+=Q;let He=Math.abs(te-ee)*Q,Ze=Cc(z,d,l);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,w+=z,b={lifecycleEpoch:++$,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:Q,notionalUsd:z,stop:T0(te,D,s.stopLossPct),take:N0(te,D,s.takeProfitPct),liq:R0(te,D,s.maxLeverage,d+l),entryFees:Ze.taker,entryBuilderFees:Ze.builder,entrySlippageUsd:He,fundingAccrued:0}}function K(T,D,P,ee){if(!b)return!1;let z=b.side,te=D,Q=te;P!=="liquidation"&&ee&&(Q=O0(te,z,u));let se=b.qty,ar=se*Q;if(P!=="liquidation"){let Ca=B(T),Cm=Q*Ca;if(se>Ca)return x.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ar,maxFillNotionalUsd:Cm,reason:"volume_participation",triggerReason:P}),!1;M[T]+=se}let He=Cc(ar,d,l),Ze=P==="liquidation"?0:Math.abs(Q-te)*se,cr,Mo;z==="long"?(cr=(te-b.entryReferencePrice)*se,Mo=(Q-b.entryPrice)*se):(cr=(b.entryReferencePrice-te)*se,Mo=(b.entryPrice-Q)*se),p+=Mo,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,w+=ar;let Om={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:Q,exitReason:P,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:cr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:cr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return S.push(Om),P==="liquidation"&&_.push({barIndex:T,time:t[T].t,side:z,price:Q,tradeIndex:S.length-1}),b=null,$+=1,I=T+1+(s.cooldownBars||0),!0}function je(T,D,P,ee){let z=T+1;if(z>=t.length)return;L.some(Q=>Q.kind==="exit"&&Q.side===D&&Q.fillBar===z&&Q.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:P,epoch:ee})}function Jr(T){let D=L.filter(P=>P.fillBar===T);for(let P=L.length-1;P>=0;P--)L[P].fillBar===T&&L.splice(P,1);D.sort((P,ee)=>{let z=te=>te.kind==="exit"?0:1;return z(P)-z(ee)});for(let P of D)if(P.kind==="exit"){if(!b||b.side!==P.side||b.lifecycleEpoch!==P.epoch)continue;let ee=P.reason||"rule";K(T,t[T].o,ee,!0)||je(T,P.side,ee,P.epoch)}else if(P.kind==="entry"){if(b||P.epoch!==$||T<I)continue;ie(T,P.side,t[T])}}function Zr(T){if(!b)return;let D=t[T],P=D.fundingPaymentRate;if(P==null||!We(P)||P===0)return;let ee=Math.abs(b.qty*D.c),z=P*ee;b.side==="long"?(p-=z,b.fundingAccrued+=z,g+=z):(p+=z,b.fundingAccrued-=z,g-=z)}function en(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Aa(T){if(!b)return;let D=t[T],P=b.side,ee=q0(D,P,b.liq),z=$0(D,P,b.stop),te=P0(D,P,b.take),Q=se=>P==="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,P,"stop_loss",b.lifecycleEpoch);return}if(z){K(T,Q(b.stop),"stop_loss",!0)||je(T,P,"stop_loss",b.lifecycleEpoch);return}te&&(K(T,b.take,"take_profit",!0)||je(T,P,"take_profit",b.lifecycleEpoch))}for(let T=0;T<t.length;T++){let D=Math.floor(t[T].t/864e5);D!==k&&(k=D,E=H(t[T].o),R=!1),en(T),Jr(T),Aa(T),Zr(T),!R&&H(t[T].c)<=E*(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 P=a[T].signals,ee=T+c;if(b)(b.side==="long"&&P.exitLong===!0||b.side==="short"&&P.exitShort===!0)&&ee<t.length&&(L.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=P.entryLong===!0,Q=P.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:$})}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 va=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 P=H(t[T].c);va={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:P},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 Ia=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Am=Ia/n.initialEquityUsd*100,_a=0,Uo=0,Bo=0;for(let T of S)T.netPnlUsd>0?(_a+=1,Uo+=T.netPnlUsd):T.netPnlUsd<0&&(Bo+=-T.netPnlUsd);let Fo=S.length,vm=Fo===0?0:_a/Fo,Do=0;Bo>0?Do=Uo/Bo:Uo>0&&(Do=1e12);let Im={netPnlUsd:Ia,netPnlPct:Am,maxDrawdownPct:U0(A),winRate:vm,profitFactor:Do,tradeCount:Fo,sharpe:L0(A),turnoverUsd:w,exposurePct:y/t.length*100},_m={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Oa={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:yr,config:_m,trades:S,equityCurve:A,metrics:Im,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:_,missedFills:x,openPositionAtEnd:va,flags:O};return ki(Oa),Ei(dn(Oa))}var A0,cn=v(()=>{At();Et();A0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as B0}from"node:crypto";function W0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ai(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ai(t);return Object.freeze(e)}for(let t of Object.keys(e))Ai(e[t]);return Object.freeze(e)}function G0(e){return String(e).trim().replace(/\s+/g," ")}function K0(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function X0(e){for(let r of D0)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 Y0(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 F0.has(r)?r:null}function Q0(e){let t={...j0},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 J0(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 Z0(e){let t=B0("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 ey(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 ty(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 ry(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 ny(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 Nc(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 oy({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:Nc(a.fast),ema_right_period:Nc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function iy({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 sy({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 Rc(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(!W0(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=V0;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<H0||n>z0)throw new ue("expiresInMs must be between 1h and 30d")}if(M0.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=G0(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(J0(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=K0(o),s=X0(o),a=Y0(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=Q0(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=Z0(o),l=`Draft ${s} ${i}`.slice(0,100),p=ey(o),f=ty(o),m=ry(o),g=[p,f,m].filter(Boolean);if(g.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!ny(o,g[0]))throw new ue(`unsupported or ambiguous prompt. ${jt}`);let h,w=g[0],S={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:d,name:l,spec:w};w.kind==="ema_cross"?h=oy(S):w.kind==="rsi"?h=iy(S):h=sy(S);let _=xi(h,{nowMs:r});if(!_.ok)throw new ue(`draft failed validation: ${_.errors.map(x=>x.message).join("; ")}`);return Ai(me(h,{nowMs:r}))}var ue,F0,D0,M0,jt,j0,H0,z0,V0,$c=v(()=>{Et();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},F0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),D0=new Set(["BTC","ETH","SOL","HYPE"]),M0=/\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.",j0=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),H0=36e5,z0=30*864e5,V0=864e5});import{createHash as ay}from"node:crypto";function Lc(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 Uc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ii(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ii(t);return Object.freeze(e)}for(let t of Object.keys(e))Ii(e[t]);return Object.freeze(e)}function Sr(e){if(Array.isArray(e))return e.map(Sr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Sr(e[r]);return t}return e}function fn(e){return JSON.stringify(Sr(e))}function cy(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 uy(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=fn(n),s=fn(o);return i<s?-1:i>s?1:0}),r}function vi(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=fn(r),a=fn(o);return s<a}function Bc(e,t,r={}){if(!Uc(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Lc(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>Pc)throw new TypeError(`maxTrials must be an integer 1..${Pc}`);o=x}let i=r.objective??"netPnlUsd";if(!qc.has(i))throw new TypeError(`objective must be one of ${[...qc].join("|")}`);let s=r.backtestOptions??{};if(!Uc(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(Lc(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=cy(a.parameters[x]);if(O.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=O,d*=O.length}let l=uy(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=br(a,x),A=ct(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||vi(i,b,x,m.metrics,m.parameters))&&(m=y)}f.sort((x,O)=>vi(i,x.metrics,x.parameters,O.metrics,O.parameters)?-1:vi(i,O.metrics,O.parameters,x.metrics,x.parameters)?1:0);let h={...m.parameters},w=br(a,h),S={strategyHash:Ut(a),compilerHash:kt,trainBarsHash:mr(t),backtestConfig:g,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:w},_={id:ay("sha256").update(JSON.stringify(Sr(S)),"utf8").digest("hex"),...S};return Ii(Sr(JSON.parse(JSON.stringify(_))))}var Pc,qc,Fc=v(()=>{At();Et();cn();Pc=256,qc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import mn from"node:path";function hn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function dy(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(hn(e))for(let[r,n]of Object.entries(e)){let o=dy(r);if(ly.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function py(e){if(typeof e!="string"||!e||!mn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Dc(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 fy(){return{version:Oi,runners:[]}}function Mc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!hn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Oi)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,mn.basename(t)),{version:Oi,runners:r.runners.map(n=>Ge(n))}}function jc(e,t){Ht(t,"store");let r=mn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=mn.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 Hc(e={}){let t=e.path;if(py(t),Dc(t),et.existsSync(t)?Mc(et.readFileSync(t,"utf8"),t):jc(t,fy()),_i.has(t))return _i.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 Dc(t),Mc(et.readFileSync(t,"utf8"),t)}function a(m){jc(t,m)}function c(m){if(!hn(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 S=Ge(h.runners[w]),_=g(S);if(!hn(_)||_.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(S=>S.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 _i.set(t,f),f}var Oi,ly,_i,zc=v(()=>{Oi=1,ly=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];_i=new Map});import{createHash as Ni}from"node:crypto";function Ci(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ti(e){return Array.isArray(e)?e.map(Ti):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Ti(e[t])])):e}function Wc(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Ni("sha256").update(JSON.stringify(Ti(e))).digest("hex")}function my(e,t,r,n,o){return Ni("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function hy(e,t,r,n){return Ni("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function yy(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Vc(e){return e==="entryLong"||e==="entryShort"}function Ri({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Hc({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,S)=>w.createdAt-S.createdAt||w.id.localeCompare(S.id))[0];if(p)return Ci(p);let f=t(),m=hy(f,d.strategyHash,d.compilerHash,l),g=r.get(m);if(g)return Ci(g);let h={id:m,strategy:Ci(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 $=u[I].t;(g==null||$>g)&&h.push(I)}if(h.length===0)return l;let w=new Map(l.intendedOrders.map(I=>[I.id,I])),S=new Set(l.fills.map(I=>I.orderId)),_=new Map(l.missedFills.map(I=>[I.orderId,I])),x=(I,$)=>`${I}|${$}`,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:$,signalIndex:L}){let M=yy(I),X=my(l.id,l.strategyHash,$,M,I);if(w.has(X))return w.get(X);let B=L+1,H=B<u.length,ie={id:X,action:I,type:I,side:M,signalBarT:$,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return w.set(X,ie),l.intendedOrders.push(ie),ie}function E(I,$,L){if(S.has(I.id))return;let M={orderId:I.id,action:Vc(I.action)?"entry":"exit",side:I.side,price:$.o,barT:$.t,signalBarT:I.signalBarT,barIndex:L};if(l.fills.push(M),S.add(I.id),I.status="filled",I.fillBarT=$.t,_.has(I.id)&&(_.delete(I.id),l.missedFills=l.missedFills.filter(X=>X.orderId!==I.id)),Vc(I.action)){A={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:$.t,entryPrice:$.o,entryBarIndex:L};for(let X of d){let B=x(I.id,X);if(O.has(B))continue;let H={orderId:I.id,horizon:X,entryBarT:$.t,entryPrice:$.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=$.t}function R(I){if(S.has(I.id)||_.has(I.id))return;let $={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,$),l.missedFills.push($),I.status="missed"}for(let I of l.intendedOrders){if(I.status==="filled"||S.has(I.id))continue;let $=m.get(I.signalBarT);if($==null)continue;let L=$+1;L<u.length&&(g==null||u[L].t>g)&&E(I,u[L],L)}for(let I of h){let $=u[I],L=f[I].signals,M=A,X=H=>{if(A||b>0&&(y==null||$.t>=y))return;let K=k({action:H,signalBarT:$.t,signalIndex:I}),je=I+1;je<u.length?E(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:$.t,signalIndex:I}),K=I+1;K<u.length?E(ie,u[K],K):R(ie)};M?(L.exitLong&&B("exitLong"),L.exitShort&&B("exitShort")):L.entryLong&&L.entryShort||(L.entryLong&&X("entryLong"),L.entryShort&&X("entryShort")),b>0&&y!=null&&$.t>=y&&(b-=1,b===0&&(y=null)),l.cursor=$.t,l.lastProcessedBarIndex=I}for(let I of l.markouts){if(I.status!=="pending")continue;let $=l.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!$)continue;let L=m.get($.barT);if(L==null)continue;let M=L+I.horizon;if(M<u.length){I.close=u[M].c,I.barT=u[M].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 Gc=v(()=>{At();zc()});var Yc={};j(Yc,{runStrategyOperation:()=>Ay});import gy from"node:os";import by from"node:path";function Er(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function xy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Pi(e){if(Array.isArray(e)){for(let t of e)Pi(t);return}if(Er(e))for(let[t,r]of Object.entries(e)){if(wy.some(n=>xy(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Pi(r)}}function Sy(e){if(!Er(e))throw new TypeError("strategy input must be a plain object");return Pi(e),e}function Ey(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 $i(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=pi(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 qi(e,t){let r=e.backtestOptions??{};if(!Er(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Kc(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Er(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:qi(e,n)}}function Xc(){return by.join(gy.homedir(),".oracle","strategy-shadow.json")}function ky(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 Ay(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Sy(t),o=Ey(n,r);if(e==="draft")return{strategy:Rc(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 $i(i.strategy,n,r,o);xr(i,s);let a=si(Kc(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ct(i.strategy,s,qi(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await $i(i.strategy,n,r,o);xr(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(!Er(l))throw new TypeError("options must be a plain object");let p=Bc(i.strategy,d,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:qi(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:si(Kc(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ri({storePath:r.storePath??Xc(),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 $i(a.strategy,n,r,o);return xr(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=pi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ri({storePath:r.storePath??Xc(),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??ky(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Wc(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 wy,Qc=v(()=>{cn();At();ai();$c();Fc();Gc();fi();wy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var lu={};j(lu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>ou,DEFAULT_SAME_CHAIN_SOURCES:()=>nu,NATIVE_TOKEN:()=>Li,canonicalJson:()=>su,hashFirmQuote:()=>uu,hashRfqIntent:()=>cu,normalizeFirmQuote:()=>Bi,normalizeRfqIntent:()=>Ty,sha256Hex:()=>kr});import{createHash as vy}from"node:crypto";import{getAddress as ru,isAddress as Ui}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Zc(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function yn(e,t){let r=String(e??"").trim();return(!Iy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function _y(e,t){return e==null||e===""?null:yn(e,t)}function eu(e,t){let r=String(e??"").trim();return r.toLowerCase()===Li.toLowerCase()?Li:(Ui(r)||re(t,"must be an EVM address or native token sentinel"),ru(r))}function iu(e,t){let r=String(e??"").trim();return Ui(r)||re(t,"must be an EVM address"),ru(r)}function Oy(e,t){return e==null||e===""?null:iu(e,t)}function tu(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 Cy(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 su(e){return JSON.stringify(zt(e))}function kr(e){return`0x${vy("sha256").update(su(e)).digest("hex")}`}function au(e,t){let r={...e};for(let n of t)delete r[n];return r}function cu(e){return kr(au(e,["intentHash"]))}function uu(e){return kr(au(e,["firmQuoteHash"]))}function Ty(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=Zc(e.fromChainId??e.fromChain,"fromChainId"),i=Zc(e.toChainId??e.toChain,"toChainId"),a=o===i?nu:ou,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:eu(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:eu(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:yn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:iu(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Cy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:_y(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:tu(e.allowedSources,"allowedSources",a),allowedRouters:tu(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):kr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=cu(c),Object.freeze(c)}function Ny(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!Jc.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Jc.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!Ui(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 Bi(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=yn(t.amountOut??t.buyAmount,"amountOut"),a=yn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=Ny(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=Oy(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=kr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=uu(l),Object.freeze(l)}var Li,nu,ou,Jc,Iy,Fi=v(()=>{Li="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",nu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),ou=Object.freeze(["lifi"]),Jc=/^0x[0-9a-fA-F]{64}$/,Iy=/^\d+$/});import{readFileSync as Ry}from"node:fs";import{homedir as $y}from"node:os";import{join as gn}from"node:path";function Py(){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=$y();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||gn(t,".config","oracle")).trim();return[e,gn(r,"exec.env")].filter(Boolean)}return[e,gn(t,".config","oracle","exec.env"),gn(t,".config","mad-desk","exec.env")].filter(Boolean)}function du(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Py())try{let i=Ry(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 pu=v(()=>{});var fu=v(()=>{});import{createHash as qy,createHmac as hu,timingSafeEqual as Ly}from"node:crypto";function bn(e){return Array.isArray(e)?`[${e.map(bn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${bn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function yu(e,{required:t=!1}={}){try{return du(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Mi(e){let{signature:t,...r}=e;return r}function gu(e,{secret:t}={}){let r=yu(t);return r?{...e,signature:hu("sha256",r).update(bn(Mi(e))).digest("hex")}:e}function Uy(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 qy("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=yu(o);if(i){let f=hu("sha256",i).update(bn(Mi(e))).digest("hex");if(!By(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=Dy(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 gu({...Mi(e),calldataHash:Uy(n)},{secret:o})}function By(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:Ly(r,n)}function Di(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Fy(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=Di(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(Di(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Di(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),d=Fy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,d),capBps:d,executable:u<=d}}function ji({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=mu,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)||mu)),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 gu({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 Dy(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=ji({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,mu,Re=v(()=>{pu();fu();tt=100,mu=2e4});function Hi(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:dt}var dt,wn=v(()=>{dt="0x000000000000000000000000000000000000dEaD"});import{Contract as My,JsonRpcProvider as jy}from"ethers";function Ky(e){return Gy.test(String(e||""))}async function bu(e,{contract:t=Hy,rpc:r=Vy,chainId:n=zy,balanceOf:o}={}){if(!Ky(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new jy(r,n,{staticNetwork:!0}),s=new My(t,Wy,i);return BigInt(await s.balanceOf(e))}var Hy,zy,Vy,Wy,Gy,wu=v(()=>{Hy="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",zy=999,Vy="https://rpc.hyperliquid.xyz/evm",Wy=["function balanceOf(address owner) view returns (uint256)"],Gy=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Xy,readFileSync as Yy,lstatSync as Qy}from"node:fs";import{homedir as xu}from"node:os";import{join as zi}from"node:path";function eg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Su,t)?Su[t]:Zy}function ig(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Eu])return String(e[Eu]);let t=e.ORACLE_CONFIG_DIR||zi(xu(),".config","oracle");return zi(t,"fee-recipient")}return zi(xu(),".config","oracle","fee-recipient")}function sg(e=process.env){try{let t=ig(e);if(!Xy(t)||Qy(t).isSymbolicLink())return"";let r=Yy(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function ag(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),Jy)}function cg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[rg]||"").trim(),o=String(e[ng]||og).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=eg(t),s=ag(e[tg],{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=sg(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 xn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=cg({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 bu(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function ku(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 Au(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function vu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Jy,Zy,Su,tg,rg,ng,Eu,og,Sn=v(()=>{wu();Jy=100,Zy=5,Su=Object.freeze({swap:5,bridge:5,perps:0,nft:0});tg="ORACLE_INTEGRATOR_FEE_BPS",rg="ORACLE_INTEGRATOR_FEE_RECIPIENT",ng="ORACLE_INTEGRATOR_ID",Eu="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",og="oracle"});var Gi={};j(Gi,{LIFI_API:()=>_u,lifiChains:()=>fg,lifiHealth:()=>dg,lifiPrepare:()=>pg,lifiQuote:()=>It});function Wi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||_u).replace(/\/$/,"")}function lg(e){let t=String(e||Vi).toLowerCase();return t===Vi.toLowerCase()||t===ug}function Iu(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 dg(e={}){let t=await N(`${Wi(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=Vi,toToken:i,fromAmount:s,fromAddress:a=dt}=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 xn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Au(d)))c.set(h,w);let l=await N(`${Wi(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 pg(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(!lg(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:Iu(a,"approval token"),spender:Iu(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 fg(e={}){return N(`${Wi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var _u,Vi,ug,Ar=v(()=>{W();Re();wn();ge();Sn();_u="https://li.quest/v1";Vi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",ug="0x0000000000000000000000000000000000000000"});var Tu={};j(Tu,{PARASWAP_API:()=>Ou,paraswapHealth:()=>hg,paraswapPrepare:()=>mg,paraswapPrice:()=>Wt,paraswapTokens:()=>Cu});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 Cu(e={},t={}){let r=Number(e.chainId||1);return N(`${Ki(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 xn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(vu(o)))n.set(a,c);let i=await N(`${Ki(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 mg(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(`${Ki(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 hg(e={}){let t=await Cu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Ou,Ki,En=v(()=>{W();Re();ge();Sn();Ou="https://api.paraswap.io",Ki=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Ou).replace(/\/$/,"")});function kn({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:Ru(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([Ru(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[Nu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Nu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Ru(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function An(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 Nu,Xi=v(()=>{Nu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Bu={};j(Bu,{ZEROX_API:()=>$u,zeroxHealth:()=>yg,zeroxPrepare:()=>gg,zeroxPrice:()=>Uu,zeroxQuote:()=>Gt});function Pu(e={}){return kn({provider:"zerox",defaultUrl:$u,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function qu(e={}){return Pu(e).baseUrl}function vn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Lu(e={}){return An({"0x-version":"v2",accept:"application/json"},{"0x-api-key":vn(e)},Pu(e).trusted)}async function yg(e={}){if(!vn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Uu({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 Uu(e={},t={}){if(!vn(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(`${qu(t)}/swap/allowance-holder/price?${a}`,{headers:Lu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!vn(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(`${qu(t)}/swap/allowance-holder/quote?${c}`,{headers:Lu(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 gg(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 $u,In=v(()=>{W();Re();Xi();ge();$u="https://api.0x.org"});var _v,Fu=v(()=>{_v=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Xu={};j(Xu,{COW_CANCEL_TYPES:()=>zu,COW_HOSTS:()=>Qi,COW_ORDER_TYPES:()=>_n,COW_SETTLEMENT:()=>Mu,COW_VAULT_RELAYER:()=>ju,cowCancelOrders:()=>Cg,cowChains:()=>Rg,cowHealth:()=>Eg,cowOrder:()=>Ku,cowOrderStatus:()=>Gu,cowOrderUid:()=>Ag,cowPrepareCancel:()=>_g,cowPrepareOrder:()=>kg,cowQuote:()=>_t,cowSignCancel:()=>Og,cowSignOrder:()=>vg,cowSubmitSignedOrder:()=>Ig,cowVerifyOrderFill:()=>Ng});import{TypedDataEncoder as Du,getAddress as vr,isAddress as bg}from"ethers";function On(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Qi[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function wg(e,t="v1",r={}){let n=On(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function pt(e,t){let r=String(e||"").trim();if(!bg(r))throw new Error(`cowswap: ${t} must be an address`);return vr(r).toLowerCase()}function Kt(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 Vu(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 Wu(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 xg({digest:e,owner:t,validTo:r}={}){let n=Vu(e,"order digest").slice(2),o=pt(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 Ji(e){let t=Mu[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:vr(t)}}function Sg(e={},t,r){let n=pt(e.sellToken,"sellToken"),o=pt(e.buyToken,"buyToken"),i=pt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Vu(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Kt(e.sellAmount,"sellAmount"),buyAmount:Kt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Kt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Eg(e={}){try{let t=await _t({chainId:1,sellToken:Yi[1],buyToken:Hu[1],sellAmountBeforeFee:"1000000000000000",from:dt},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=Hi(e.from||e.owner),o=e.sellToken||Yi[r],i=e.buyToken||Hu[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=Yi[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(`${On(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=pt(Hi(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Sg(o?.quote||o,r,n),s=Ji(r),a={domain:s,types:_n,primaryType:"Order",message:i},c=Du.hash(s,_n,i),u=ju[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:vr(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:vr(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:vr(u).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Gu(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(`${On(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ku(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(`${On(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Ag(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||Du.hash(Ji(r),_n,n),i=e.owner||e.from||e.signer||n.receiver;return xg({digest:o,owner:i,validTo:n.validTo})}async function vg(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 Ig(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 _g(e={}){let t=Number(e.chainId??1),r=pt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>Wu(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Ji(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:zu,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function Og(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function Cg(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function Tg(e={}){return Kt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function Ng(e={},t={}){let r=Number(e.chainId??1),n=Wu(e.uid||e.orderUid),o=t.order||await Ku({chainId:r,uid:n},t),i=t.status||o.status||await Gu({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${wg(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?pt(e.expectedOwner,"expectedOwner"):null;if(c&&pt(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(Tg(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Kt(o.executedBuyAmount,"executedBuyAmount")));let d=e.minBuyAmount!=null?BigInt(Kt(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 Rg(){return Object.keys(Qi).map(Number)}var Qi,Mu,ju,Yi,Hu,_n,zu,Cn=v(()=>{W();Re();Fu();wn();ge();Qi={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"},Mu=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),ju=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Yi={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Hu={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},_n=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"}]}),zu=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var Qu={};j(Qu,{CHAINS:()=>Tn,chainById:()=>es,isSupportedChain:()=>Yu,registerChain:()=>$g,rpcUrlFor:()=>ts});function es(e){return Zi.get(Number(e))||null}function $g({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 Tn[e]=o,Zi.set(o.chainId,o),o}function ts(e,t=process.env){let r=es(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function Yu(e){return Zi.has(Number(e))}var Tn,Zi,rs=v(()=>{Tn={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}},Zi=new Map(Object.values(Tn).map(e=>[e.chainId,e]))});import{Interface as Pg,getAddress as qg}from"ethers";function Ir(e,t){try{return qg(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Ug(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=ts(e,r);return n||Lg[Number(e)]||null}function Fg(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Bg.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||"");Fg(o);let i=Ug(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 Rn(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function Ju(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Zu(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 el(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Ir(e.token||e.tokenAddress,"token"),o=Ir(e.owner,"owner"),i=Ir(e.spender,"spender"),s=Nn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=Nn.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 tl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Ir(e.token||e.tokenAddress,"token"),o=Ir(e.account||e.owner||e.address,"account"),i=Nn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=Nn.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 Nn,Lg,Bg,nt=v(()=>{W();rs();Nn=new Pg(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Lg={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"};Bg=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function rl(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 $n(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=rl(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)||Dg.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 nl(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&rl(e,r[0]).address||null}var Dg,ns=v(()=>{Dg=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function zg(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 Vg(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Wg(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Mg).replace(/\/$/,"")}async function Pn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Wg(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ol({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await _r({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function _r({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(jg[Number(e)]||e),s=new Set(Hg(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Pn(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=`${$e(f?.chainId)}:${$e(f?.dexId)}:${$e(f?.pairAddress)}`;u.has(m)||(u.add(m),d.push(f))}return d.filter(p=>$e(p?.chainId)===i).filter(p=>zg(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:Vg(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function il(e,{chainSlug:t="solana",stables:r=Gg}={},n={}){let o=await Pn(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=$n(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Mg,jg,$e,Hg,Gg,Or=v(()=>{W();ns();Mg="https://api.dexscreener.com",jg=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(),Hg=e=>Array.isArray(e)?e:e==null?[]:[e];Gg=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var ml={};j(ml,{PANCAKE_FEE_TIERS:()=>qn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>ul,UNI_V3_VENUES:()=>pl,uniV3Chains:()=>eb,uniV3EthUsdc:()=>fl,uniV3Health:()=>Zg,uniV3PrepareExactIn:()=>Jg,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>Qg});import{Interface as al,getAddress as Cr,isAddress as cl}from"ethers";function is(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=pl[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 os(e,t){let r=be[Number(t)];if(!e||e===ll||e===dl||/^eth$/i.test(String(e)))return Cr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Cr(r.weth);if(/^usdc$/i.test(n))return Cr(r.usdc);if(!cl(n))throw new Error(`invalid token address: ${e}`);return Cr(n)}function Xg(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 Yg(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}=is(e.chainId??8453,e.venue),s=os(e.tokenIn||"WETH",r),a=os(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:ul,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=Ln.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=Ln.decodeFunctionResult("quoteExactInputSingle",y),E={fee:A,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};l.push(E),(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E)}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 _r({chainId:r,tokenA:s,tokenB:a,dexIds:Xg(e.venue)},t).catch(()=>[]):[],m={};for(let A of f.slice(0,8))if(!(!A.pairAddress||!cl(A.pairAddress)))try{let b=await Y(r,"eth_call",[{to:A.pairAddress,data:Kg},"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,E)=>m[E.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,S=f[0]??null,_=w??S,x=e.liquidityUsd??w?.liquidityUsd??S?.liquidityUsd??null,O=e.liquidityUsd!=null?"caller":w?"pool":S?"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 Qg(e={},t={}){let{chainId:r,quoter:n,router:o}=is(e.chainId??8453),i=(e.tokens||[]).map(p=>os(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=Yg(i,s),u=Ln.encodeFunctionData("quoteExactInput",[c,a]),d=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),l=Ln.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 fl(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 Jg(e={},t={}){let r=Number(e.chainId??8453),n=is(r,e.venue),o=Cr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===ll||i===dl||/^eth$/i.test(i),a=await Ot(e,t),c=sl.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=sl.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 Zg(e={}){let t=Number(e.chainId??8453);try{let r=await fl({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 eb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,ul,Kg,Ln,sl,ll,dl,qn,pl,Un=v(()=>{nt();Or();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"}},ul=[100,500,3e3,1e4],Kg="0xddca3f43",Ln=new al(["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)"]),sl=new al(["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)"]),ll="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dl="0x0000000000000000000000000000000000000000",qn=[100,500,2500,1e4],pl={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var wl={};j(wl,{executeRfqCandidates:()=>gl,rankRfqQuotes:()=>bl,requestRfqQuotes:()=>nb,sourceCandidates:()=>yl});function Tr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function hl(e,t){return String(e?.[t]??"").trim()}function Nr(e,t){return Object.freeze({source:e,run:t})}function yl(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 Tr(e,"lifi")&&s.push(Nr("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 tb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Tr(e,"paraswap")&&s.push(Nr("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}}})),Tr(e,"0x")&&(hl(r,"ZEROX_API_KEY")||hl(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Nr("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}}})),Tr(e,"cow")&&s.push(Nr("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}}})),Tr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Nr("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 tb(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 gl(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(Bi(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 bl(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 nb(e,t={}){let r=yl(e,t),{quotes:n,failed:o}=await gl(e,r,t),i=bl(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 xl=v(()=>{Ar();En();In();Cn();Un();Fi()});function Sl(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}ob.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))Xt.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 El(e){let{ok:t,errors:r,warnings:n}=Sl(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=Xt.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:Xt.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Xt)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 Bn(e){let t=El(e);return Yt.set(t.chainId,t),t}function ss(e){return Yt.get(Number(e))||null}function kl(){return[...Yt.values()]}function ib(){Yt.clear()}function sb(){let e={};for(let t of Yt.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:Yt.size,capabilities:[...Xt],chains:e}}var Xt,U,q,ob,Yt,ft=v(()=>{Xt=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"}),q=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),ob=/^0x[0-9a-fA-F]{40}$/;Yt=new Map});function Al(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:Pe.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Rr(r);if(p==null||p<=0n)return{source:t,quality:Pe.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Pe.NO_GAS:Pe.FULL,amountOut:p.toString(),minOut:Rr(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 Il(e,t,{divisor:r=1000n}={}){let n=Rr(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=Rr(i),c=Rr(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 _l(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 as(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!==Pe.FAILED),c=e.filter(y=>y.quality===Pe.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),E=0n,R=!1,I=!1,$=BigInt(y.oracleFeeBps??0),L=$>0n?k*$/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&&(E=BigInt(Math.floor(K)),R=!0)}else B===0&&(R=!0)}let M=E+L,X=k>M?k-M:0n;return{...y,grossOut:k.toString(),netOut:X.toString(),costInDest:E.toString(),oracleFeeInDest:L.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=[],S=f.slice().sort((y,k)=>BigInt(k.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,k)=>{let E=h(y.netOut)<=m?0:1,R=h(k.netOut)<=m?0:1;if(n&&m>0&&E!==R)return E-R;if(n&&m>0){let I=y.liquidityUsd??-1,$=k.liquidityUsd??-1;if(I!==$)return $-I}return BigInt(k.netOut)>BigInt(y.netOut)?1:-1}),n&&m>0&&S&&f[0]&&f[0].source!==S.source&&w.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${S.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 Fn(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"?Al({source:s,error:String(o.reason?.message||o.reason)}):Al({source:s,...o.value})})}var Pe,vl,Rr,cs=v(()=>{ft();Pe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),vl={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"},Rr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Ol(e={}){return kn({provider:"oneinch",defaultUrl:ab,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function cb(e={}){return Ol(e).baseUrl}function Cl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function ub(e={}){let t=Cl(e);return An({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Ol(e).trusted)}async function Tl(e={},t={}){if(!Cl(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(`${cb(t)}/${r}/quote?${s}`,{headers:ub(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 ab,Nl=v(()=>{W();Re();Xi();ge();ab="https://api.1inch.dev/swap/v6.0"});var Pl={};j(Pl,{UNI_V4_CHAINS:()=>qe,UNI_V4_FEE_TIERS:()=>ds,computeV4PoolId:()=>jn,decodeV4HookPermissions:()=>fs,uniV4Chains:()=>Eb,uniV4Health:()=>kb,uniV4InspectHook:()=>wb,uniV4PrepareExactIn:()=>Sb,uniV4QuoteExactIn:()=>Hn,uniV4QuoteExactOut:()=>xb});import{AbiCoder as lb,Interface as us,getAddress as Ke,isAddress as ls,keccak256 as db}from"ethers";function fs(e){let t=Lr(e),r=Number(BigInt(t)&fb),n=Object.fromEntries(Rl.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(Rl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function qr(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 Lr(e){if(e==null||e==="")return ye;let t=String(e);if(!ls(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function Qt(e,t){let r=qe[Number(t)];if(Pr(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(!ls(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function Pr(e){let t=String(e||"").trim().toLowerCase();return!t||t===gb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function jn({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=Lr(o);return db($r.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function ms({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:Lr(o)},zeroForOne:u}}function bb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=fs(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 wb(e={},t={}){let r=qr(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=Qt(e.tokenIn||"WETH",r.chainId),o=Qt(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=Lr(e.hooks),{poolKey:c}=ms({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=jn(c),d=t.rpcCall||Y,l=Dn.encodeFunctionData("getSlot0",[u]),p=Dn.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=Dn.decodeFunctionResult("getSlot0",f),w=Dn.decodeFunctionResult("getLiquidity",m)[0],S=h[0],_=S>0n,x=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,O=!!(i&ps),A=bb({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:S.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:fs(a)}),risk:A})}async function Hn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=qr(e.chainId??8453),s=Qt(e.tokenIn||"WETH",r),a=Qt(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}]:[...ds],d=e.hooks||ye,l=[],p=null;for(let b of u){let{poolKey:y,zeroForOne:k}=ms({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:d}),E=Mn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!R||R==="0x"){l.push({...b,ok:!1,error:"empty result"});continue}let I=Mn.decodeFunctionResult("quoteExactInputSingle",R),$={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:k,poolId:jn({...y})};l.push($),(!p||BigInt($.amountOut)>BigInt(p.amountOut))&&(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 _r({chainId:r,tokenA:s,tokenB:a,dexIds:$l},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(E=>E.ok&&Number((b-BigInt(E.amountOut))*10000n/b)<=h).filter(E=>g(E)?.liquidityUsd!=null).sort((E,R)=>g(R).liquidityUsd-g(E).liquidityUsd)[0];k&&k.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:k.fee,chosenPoolUsd:g(k).liquidityUsd,bandBps:h},p=k)}let S=g(p),_=f[0]??null,x=S??_,O=e.liquidityUsd??S?.liquidityUsd??_?.liquidityUsd??null,A=e.liquidityUsd!=null?"caller":S?"pool":_?"pair":null;return ae({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:O,liquiditySource:x,liquidityAttribution:A,liquidityPick:w,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ls(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&&!Pr(e.tokenIn)&&!Pr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&ps)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function xb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=qr(e.chainId??8453),s=Qt(e.tokenIn||"WETH",r),a=Qt(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}]:[...ds],d=e.hooks||ye,l=[],p=null;for(let m of u){let{poolKey:g,zeroForOne:h}=ms({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:d}),w=Mn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:w},"latest"],t);if(!S||S==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let _=Mn.decodeFunctionResult("quoteExactOutputSingle",S),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:_[0].toString(),gasEstimate:_[1].toString(),poolKey:g,zeroForOne:h,poolId:jn({...g})};l.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(S){l.push({...m,ok:!1,error:String(S.message||S).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 ol({chainId:r,tokenA:s,tokenB:a,dexIds:$l},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:l,best:!0,executionReady:!1,prepareReady:!1}}async function Sb(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=qr(n);if(Lr(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)&ps)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(Pr(e.tokenIn)||Pr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Hn(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=$r.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=$r.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),g=$r.encode(["address","uint256"],[u.tokenOut,d]),h=$r.encode(["bytes","bytes[]"],[hb,[f,m,g]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=pb.encodeFunctionData("execute",[mb,[h],S]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:S,quote:{...u,amountOutMinimum:d.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:yb,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 Eb(){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 kb(e={}){let t=qr(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 $r,ye,qe,ds,Mn,pb,Dn,Rl,fb,ps,mb,hb,yb,gb,$l,hs=v(()=>{nt();Or();Re();ge();$r=lb.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"}},ds=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Mn=new us(["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)"]),pb=new us(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Dn=new us(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Rl=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,ps=8388608;mb="0x10",hb="0x060c0f",yb="0x000000000022D473030F116dDEE9F6B43aC78BA3",gb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";$l=["uniswap-v4","uniswapv4"]});function Ib(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Ab).replace(/\/$/,"")}function _b(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||vb).replace(/\/$/,"")}async function zn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${Ib(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ql(e={}){return N(`${_b(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var Ab,vb,ys=v(()=>{W();Ab="https://coins.llama.fi",vb="https://api.llama.fi"});var Vn={};j(Vn,{ACROSS_API:()=>Ll,HOP_API:()=>Ul,RELAY_API:()=>Bl,acrossHealth:()=>Cb,acrossSuggestedFees:()=>Fl,hopHealth:()=>Tb,hopQuote:()=>Dl,relayHealth:()=>Nb,relayPrepare:()=>Rb,relayQuote:()=>gs});async function Cb(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Fl({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 Fl(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||Ll).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Tb(e={}){try{let t=await Dl({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 Dl(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||Ul).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||Ob[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 Nb(e={}){try{let t=await gs({user:dt,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 gs(e={},t={}){let{user:r=dt,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||Bl).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 Rb(e={},t={}){let r=await gs(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 Ll,Ul,Bl,Ob,Wn=v(()=>{W();Re();wn();ge();Ll="https://across.to/api",Ul="https://api.hop.exchange/v1",Bl="https://api.relay.link",Ob={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Gn(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 jl(e,t={}){let r=vl[Number(e)];if(!r)return null;try{let n=await zn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function $b(e={}){try{let t=await ql({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function Pb(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Ml[r]||[r]),n.push(...Ml[mt(e)]||[e]),n}function qb(e,t,r={}){let n=Array.isArray(e)?e:[],o=Pb(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 bs({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:Gn(f?.gasCosts),feeUsd:Gn(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 Tl({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}}}}),qe[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let p=await Hn({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 Hl({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(d,l={})=>(c||=$b(s),qb(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:Gn(l?.gasCosts),feeUsd:Gn(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(()=>(Wn(),Vn)),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(()=>(Wn(),Vn)),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,Ml,zl=v(()=>{Ar();En();In();Nl();Cn();Un();hs();ys();cs();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Ml=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 Wl={};j(Wl,{QUALITY:()=>Pe,bestBridgeRoute:()=>Ur,bestSwapRoute:()=>Jt,formatComparisonNote:()=>Kn});async function Vl(e,t,r){let n=Lb[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await zn([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 Jt(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=jl(r,t),a=Vl(r,o,t),c=Ju(r,t).catch(()=>null),u=bs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[d,l,p]=await Promise.all([Fn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=as(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,S=await Il(async _=>{let x=bs({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(A=>A.source===h);return x.length?(await Fn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(S){let _=_l(m,{[h]:S},{maxImpactPct:g});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:d.filter(x=>x.quality!==Pe.FAILED).length,note:Kn(_,u.length),priceImpact:{[h]:Number(S.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!==Pe.FAILED).length,note:Kn(m,u.length)}}async function Ur(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=Vl(n,i,t),c=Hl({...e,opts:t}),[u,d]=await Promise.all([Fn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=as(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!==Pe.FAILED).length,note:Kn(l,c.length)}}function Ub(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${ku(t)}`:""}function Kn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=Ub(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 Lb,Zt=v(()=>{cs();zl();Sn();ys();nt();Lb={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Gl={};j(Gl,{ARTIFACT:()=>ot,prepareBestRoute:()=>Hb,supportedPreparers:()=>Fb});function Fb(){return Object.keys(Xn)}async function Hb(e,t={}){if(jb.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(!Mb.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Db.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 Jt(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=Xn[o];if(!s){let h=n.routes.find(w=>Xn[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):"",S=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(S),x=!_&&/not enough|insufficient|balance/i.test(S),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: ${S}`):x?(A="taker-not-funded",O=`${o} refused to build the transaction: ${S}. 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: ${S}`);let b=n.routes.find(y=>Xn[y.source]&&y.source!==o);return{ok:!1,reason:O,failureKind:A,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??Bb,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===ot.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...d?[d]:[],...n.warnings||[],...a.artifactKind===ot.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 ot,Bb,Xn,Db,Mb,jb,Kl=v(()=>{Zt();ge();ot=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),Bb=100,Xn={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Un(),ml)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:ot.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(()=>(hs(),Pl)),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:ot.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(()=>(Ar(),Gi)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:ot.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(()=>(En(),Tu)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:ot.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(()=>(In(),Bu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:ot.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(()=>(Cn(),Xu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:ot.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"}}};Db=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Mb=/^0x[0-9a-fA-F]{40}$/,jb=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var Xl={};j(Xl,{prepareBestBridgeRoute:()=>Kb,supportedBridgePreparers:()=>Gb});function Gb(){return Object.keys(Yn)}async function Kb(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(!zb.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Vb.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 Ur(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=Yn[s];if(!c){let h=i.routes.find(w=>Yn[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):"",S=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(S),x=!_&&/not enough|insufficient|balance/i.test(S),O=i.routes.find(A=>Yn[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: ${S}`:x?`${s} refused to build: ${S}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${S}`,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??Wb,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 zb,Vb,Wb,Yn,Yl=v(()=>{Zt();ge();zb=/^0x[0-9a-fA-F]{40}$/,Vb=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Wb=100,Yn={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Wn(),Vn)),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(()=>(Ar(),Gi)),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 Zl={};j(Zl,{buildTwapSchedule:()=>Jl,normalizeTwapParams:()=>Ql,prepareTwapChunk:()=>ew,simulateTwap:()=>tw});function Ql(e={}){let t=Math.max(Xb,Math.min(Yb,Number(e.splits)||Jb)),r=Math.max(.1,Number(e.windowHours)||Zb),n=Math.max(Qb,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 Jl(e){let t=Ql(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 ew(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 Jt({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 tw(e,{quoteFn:t=Jt,...r}={}){let n=Jl(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 Xb,Yb,Qb,Jb,Zb,ed=v(()=>{Zt();ge();Xb=2,Yb=100,Qb=60,Jb=10,Zb=6});async function nd({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(!td.has(Number(e))||!td.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(`${rd}/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 od(){try{return{ok:!0,chainCount:(await N(`${rd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var rd,td,id=v(()=>{W();ge();rd="https://dln.debridge.finance/v1.0",td=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function ad({active:e=!0}={},t={}){let r=Date.now();if(er.size&&r-sd<rw)return[...er.values()];try{let n=await N(`${ws}/exchange/currencies?active=${e?"true":"false"}`,t);er.clear();for(let o of n??[])er.set(String(o.ticker).toLowerCase(),o);return sd=r,n??[]}catch(n){return er.size?[...er.values()]:{error:String(n.message||n).slice(0,200)}}}async function nw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${ws}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function ow(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(`${ws}/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 cd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await nw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await ow(e,t,s,{flow:n},o);if(a.error)return a;let c=await ad({},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 ud(){try{let e=await ad();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 ws,er,sd,rw,ld=v(()=>{W();ws="https://api.changenow.io/v2",er=new Map,sd=0,rw=6e5});async function dd({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(`${iw}/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 iw,pd=v(()=>{W();iw="https://api.squidrouter.com/v1"});async function fd({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(`${sw}/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 sw,md=v(()=>{W();sw="https://api.stargate.finance"});async function hd({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(`${aw}/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 aw,yd=v(()=>{W();aw="https://midgard.ninerealms.com/v2"});async function gd({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(`${cw}/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 cw,bd=v(()=>{W();cw="https://api.socket.tech/v2"});async function wd({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(`${uw}/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 uw,xd=v(()=>{W();uw="https://api.connext.network"});async function Sd({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(`${lw}/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 lw,Ed=v(()=>{W();lw="https://api.portalbridge.com/v1"});function dw(e,t){return`0x${Ss.getAmountsOut}`+_e(e)+_e(64)+_e(t.length)+t.map(Br).join("")}function pw(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 xs(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>Es)throw new Error(`slippageBps ${r} exceeds the ${Es} 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 kd(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:dw(i,s)},"latest"],a);return pw(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=xs(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=xs(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:q.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:q.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:q.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:q.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:q.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=q.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(g=q.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(g=q.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=xs(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)),S=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,_=S?`0x${Ss.swapExactETHForTokens}`+_e(h)+_e(128)+Br(a)+_e(w)+_e(m.length)+m.map(Br).join(""):`0x${Ss.swapExactTokensForTokens}`+_e(s)+_e(h)+_e(160)+Br(a)+_e(w)+_e(m.length)+m.map(Br).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:S?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Es,deadline:w.toString()},requires:S?[]:[{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 Ss,_e,Br,Es,Ad=v(()=>{nt();ft();Ss={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},_e=e=>BigInt(e).toString(16).padStart(64,"0"),Br=e=>e.slice(2).toLowerCase().padStart(64,"0");Es=100});function hw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>As)throw new Error(`slippageBps ${r} exceeds the ${As} 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 ks(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function _d(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},d){let l=`0x${vd.quoteExactInputSingle}`+Fr(s)+Fr(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 mw){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=ks(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(!Id.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=ks(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:q.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:q.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:q.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)),E=q.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return k<5e3?(E=q.FAIL,R=`round trip vs dollar book returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(E=q.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:E,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:q.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)),E=q.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return k<5e3?(E=q.FAIL,R=`dollar-book round trip returns only ${(k/100).toFixed(2)}%`):k<9e3&&(E=q.CAUTION,R=`dollar-book round trip returns ${(k/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:E,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:q.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,S=Number(w*10000n/BigInt(s)),_=q.PASS,x="round trip completes with expected fee/impact loss";return S<5e3?(_=q.FAIL,x=`round trip returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(_=q.CAUTION,x=`round trip returns ${(S/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:S,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=ks(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(!Id.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=hw(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${vd.exactInputSingle}`+Fr(i)+Fr(s)+Ct(m)+Fr(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:As,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 mw,vd,Ct,Fr,Id,As,Od=v(()=>{nt();ft();mw=[100,500,3e3,1e4],vd={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Fr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Id=/^0x[0-9a-fA-F]{40}$/,As=100});function Cd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Td(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 yw(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 Rn(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await Zu(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 tl({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,Qn.decimals,o).catch(()=>null),r(n,Qn.symbol,o).catch(()=>null),r(n,Qn.name,o).catch(()=>null),r(n,Qn.totalSupply,o).catch(()=>null)]),u=Cd(i?.result??i),d=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Td(s?.result??s),name:Td(a?.result??a),totalSupply:(Cd(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 Pn(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=$n(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:nl(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=q.PASS,a=d=>{let l={[q.PASS]:0,[q.CAUTION]:1,[q.UNKNOWN]:2,[q.FAIL]:3};l[d]>l[s]&&(s=d)},c=await this.resolveToken(n,o);c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:q.UNKNOWN,detail:c.warning}),a(q.UNKNOWN)):i.push({check:"erc20-metadata",result:q.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:q.UNKNOWN,detail:u.reason}),a(q.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:q.FAIL,detail:"no pool with liquidity found"}),a(q.FAIL);else{let d=u.pools[0],l=d.liquidityUsd??0;l<5e3?(i.push({check:"liquidity",result:q.CAUTION,detail:`top pool only $${l}`}),a(q.CAUTION)):i.push({check:"liquidity",result:q.PASS,detail:`$${l} on ${d.dex}`}),d.createdAt&&Date.now()-d.createdAt<24*3600*1e3&&(i.push({check:"age",result:q.CAUTION,detail:"pool under 24h old"}),a(q.CAUTION))}if(typeof this.sellSimulation=="function"){let d=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:q.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:q.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(q.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 vs(e){let r={...yw(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,_d({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,kd({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 Qn,Nd=v(()=>{nt();Or();ft();Ad();Od();ns();Qn={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Jn(){return Dr.map(e=>Bn(vs(e)))}function Rd(e){return Bn(vs(e))}var Dr,Zn=v(()=>{Nd();ft();Dr=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 Bd,getAddress as gw,id as Fd}from"ethers";function tr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function Os(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function eo(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 Pw(e,t){try{return gw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function qw(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Ud(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Lw({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>Ow)return"stale"}return"scoped"}function Uw(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 Bw(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(tr(r)){let a=Os(qd,o,Cw);if(a)return a.value}let s=(async()=>{let a=async l=>{try{let p=$d.encodeFunctionData(l,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:$d.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 tr(r)&&eo(qd,o,d,Rw),d})();return n?.set(o,s),s}async function Fw(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||ww,1),xw),o=await Rn(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:[bw,qw(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}:${Ud(d)}`,{token:u,spender:Ud(d)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function Dw(e){return(vw[e]||[]).flatMap(r=>Ew.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function Mw(e,t,r={}){let n=[],o="direct-probe",i=null,s=Dw(e),a=_s(e),c=tr(r)&&Os(Is,e,Tw)?.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 Fw(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},tr(r)&&eo(Is,e,!0,64)}catch{if(tr(r)&&eo(Is,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 an(n,r.concurrency||4,async f=>{try{let m=await el({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 Bw(e,f.token,r,u),w=g>=_w,S=Sw[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:S,allowance:g.toString(),allowanceDisplay:Uw(g,h.decimals,w),unlimited:w,lastActivityAt:null,risk:Lw({unlimited:w,spenderLabel:S,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await Hw(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:_s(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 jw(e,t,r,n,o){try{let i=Pd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Pd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function _s(e){return(Aw[e]||[]).flatMap(r=>kw.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function Hw(e,t,r){let n=_s(e);return n.length===0?[]:(await an(n,r.concurrency||4,async i=>await jw(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 Dd(e={},t={}){let r=Pw(e.owner||e.address,"owner"),n=new Map(Dr.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=tr(t)&&!e.refresh;if(s){let f=Os(Ld,i,Nw);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await an(o,e.concurrency||3,f=>Mw(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&&eo(Ld,i,p,$w),{...p,cached:!1,cachedAgeMs:0}}var $d,Pd,bw,__,ww,xw,Sw,Ew,kw,Aw,vw,Iw,_w,Ow,Cw,Tw,Nw,Rw,$w,qd,Is,Ld,Md=v(()=>{Zn();W();nt();$d=new Bd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Pd=new Bd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),bw=Fd("Approval(address,address,uint256)"),__=Fd("ApprovalForAll(address,address,bool)"),ww=1e4,xw=2e5,Sw=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)"}),Ew=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"}]),kw=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"}]),Aw=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"}]}),vw=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}]}),Iw=(1n<<256n)-1n,_w=Iw/2n,Ow=4320*60*60*1e3,Cw=360*60*1e3,Tw=600*1e3,Nw=45*1e3,Rw=512,$w=128,qd=new Map,Is=new Map,Ld=new Map});var zd={};j(zd,{aggregateBridgeQuotes:()=>jd,bridgeAggregatorHealth:()=>Vw,checkRevokeNeeded:()=>Hd,scanBridgeRoutes:()=>zw});async function jd(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=nd({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=Ur({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=dd({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,E)=>k+(Number(E.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),w=fd({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)),S=hd({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 cd({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=gd({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=wd({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=Sd({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,S,x,O,A,_]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,k)=>{let E=Number(y.amountOut??0),R=Number(k.amountOut??0);return E!==R?R-E: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 Hd({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Dd({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 zw(e={},t={}){let[r,n]=await Promise.all([jd(e,t),Hd({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 Vw(){let[e,t]=await Promise.all([od().catch(r=>({ok:!1,error:r.message})),ud().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var Z_,Vd=v(()=>{Zt();id();ld();pd();md();yd();bd();xd();Ed();Md();Z_=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Wd={};j(Wd,{DYDX_API:()=>to,dydxHealth:()=>Kw,dydxMarkets:()=>Ww,dydxOrderbook:()=>Gw});async function Ww(e=50,t={}){try{return((await N(`${to}/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 Gw(e){try{let t=await N(`${to}/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 Kw(){try{return{ok:!0,serverTime:(await N(`${to}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var to,Gd=v(()=>{W();to="https://api.dydx.exchange"});var Xd={};j(Xd,{DRIFT_API:()=>Kd,driftHealth:()=>Yw,driftMarkets:()=>Xw});async function Xw(e={}){try{return((await N(`${Kd}/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 Yw(){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 Kd,Yd=v(()=>{W();Kd="https://dlob.drift.trade"});var Qd={};j(Qd,{VERTEX_API:()=>ro,vertexHealth:()=>Zw,vertexMarkets:()=>Qw,vertexOrderbook:()=>Jw});async function Qw(e={}){try{return((await N(`${ro}/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 Jw(e){try{let r=(await N(`${ro}/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 Zw(){try{return{ok:!0,status:(await N(`${ro}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ro,Jd=v(()=>{W();ro="https://gateway.prod.vertexprotocol.com/v2"});var Zd={};j(Zd,{pancakeHealth:()=>rx,pancakeQuote:()=>tx});async function tx({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(`${ex}/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 rx(){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 ex,ep=v(()=>{W();ex="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var rp={};j(rp,{sushiHealth:()=>ix,sushiQuote:()=>ox});async function ox({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(`${nx(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 ix(){try{return{ok:!0,chains:Object.keys(tp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var nx,tp,np=v(()=>{W();nx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${tp[e]||"ethereum"}`,tp={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 op={};j(op,{raydiumHealth:()=>cx,raydiumQuote:()=>ax});async function ax({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(`${sx}/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 cx(){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 sx,ip=v(()=>{W();sx="https://quote-api.jup.ag/v6"});var sp={};j(sp,{AEVO_API:()=>Cs,aevoHealth:()=>lx,aevoMarkets:()=>ux});async function ux(e={}){try{return(await N(`${Cs}/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 lx(){try{return{ok:(await N(`${Cs}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cs,ap=v(()=>{W();Cs="https://api.aevo.xyz"});var cp={};j(cp,{compoundHealth:()=>fx,compoundMarkets:()=>px});async function px(e={}){try{return((await N(`${dx}/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 dx,up=v(()=>{W();dx="https://api.compound.finance/api/v2"});var lp={};j(lp,{yearnHealth:()=>yx,yearnVaults:()=>hx});async function hx(e={}){try{return(await N(`${mx}/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 yx(){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 mx,dp=v(()=>{W();mx="https://api.yearn.fi/v1"});var pp={};j(pp,{convexHealth:()=>wx,convexPools:()=>bx});async function bx(e={}){try{return(await N(`${gx}/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 wx(){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 gx,fp=v(()=>{W();gx="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 no(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 Le(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 Mr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*no(t-e.scale),t):Ye(e.mantissa/no(e.scale-t),t)}function Ts(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Mr(e,r),Mr(t,r),r]}function yt(e,t){let[r,n,o]=Ts(e,t);return Ye(r.mantissa+n.mantissa,o)}function jr(e,t){let[r,n,o]=Ts(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*no(t.scale+r),o=t.mantissa*no(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=Ts(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var lO,Oe=v(()=>{lO=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as hp,readFileSync as xx}from"node:fs";import{dirname as mp,join as Ns}from"node:path";import{fileURLToPath as Sx}from"node:url";function Ex(e){let t=mp(Sx(e));for(let r=0;r<8;r+=1){let n=Ns(t,"package.json");if(hp(n))try{let i=JSON.parse(xx(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=mp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function yp(e,t){let r=Ex(t),n=Ns(r,e);return hp(n)?n:Ns(r,"dist","assets",e)}var gp=v(()=>{});import{readFileSync as kx,existsSync as Ax}from"node:fs";import{fileURLToPath as vx}from"node:url";import{dirname as Ix,join as wp}from"node:path";function Ox(){try{let e=yp("equities-fixtures",import.meta.url);if(e&&Ax(e))return e}catch{}return _x}function Tx(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){Tx(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 Nx(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 Rx(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 $x(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 Px(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 qx(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 Lx(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 Ux(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 Bx(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 Fx(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 Dx(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 jx(e,t){let r=xp[t],n=wp(e,r),o;try{o=kx(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 Mx[t](i,r),i}function Sp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Sp(t)}return e}function Rs({fixtureDir:e=Cx}={}){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(xp))t[r]=jx(e,r);return Sp(t)}function it(){return bp??=Rs(),bp}function ve(){return it().venues}function Ep(){return it().universe}function kp(){return it().oracles}function Ap(){return it().nyseHolidays}function vp(){return it().dstTransitions}function oo(){return it().rhPoolState}function Ip(){return it().solanaXstocks}function _p(){return it().tonXstocks}function Op(){return it().hip3L2Books}var _x,Cx,xp,Mx,bp,Be=v(()=>{gp();_x=wp(Ix(vx(import.meta.url)),"fixtures");Cx=Ox(),xp=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"});Mx=Object.freeze({venues:Nx,universe:Rx,oracles:$x,nyseHolidays:Px,dstTransitions:qx,equityDexPools:Lx,rhPoolState:Ux,solanaXstocks:Fx,tonXstocks:Dx,hip3L2Books:Bx})});function Vx(){let e=vp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ps,endMs:n.endUtc*Ps}));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 Lp(){return Tp??=Vx(),Tp}function Wx(){return $s===void 0&&($s=new Set(Ap().holidayDayIndex)),$s}function Up(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function Gx(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Lp();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 Kx(e){for(let t of Lp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function Xx(e){return Kx(e)?zx:Hx}function Yx(e){let t=e+Xx(e),r=Math.floor(t/Cp),n=t-r*Cp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Np),msIntoDay:n,weekday:o.getUTCDay()}}function Qx({dayIndex:e,weekday:t}){return t===0||t===6?!1:!Wx().has(e)}function Jx(e){return e<Rp?"dark":e<$p?"extended":e<Pp?"core":e<qp?"extended":"dark"}function Hr(e){Up(e,"sessionState"),Gx(e,"sessionState");let t=Yx(e);return Qx(t)?Jx(t.minuteOfDay):"dark"}function Ls(e){return Up(e,"isDark"),Hr(e)==="dark"}var Ps,Np,qs,Cp,Hx,zx,Rp,$p,Pp,qp,EO,kO,Tp,$s,io=v(()=>{Be();Ps=1e3,Np=60*Ps,qs=60*Np,Cp=24*qs,Hx=-5*qs,zx=-4*qs,Rp=240,$p=570,Pp=960,qp=1200,EO=Object.freeze([Rp,$p,Pp,qp]),kO=Object.freeze(["core","extended","dark"])});function ao(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function tS(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function rS(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function Bp(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function co(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??Zx,o=t.oracleFreshnessMs??eS,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(tS(c)){i?s.push(Object.freeze({...c,staleData:!0})):ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(rS(c)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.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(Bp(c,r,n)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.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=Hr(r),d=u==="core"?o:o*2;if(Bp(c,r,d)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var so,Zx,eS,Us=v(()=>{Oe();io();so=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),Zx=12e4,eS=6e5});function nS(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(nS(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 Mp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){Mp(e)||Z(t,"must be an object")}function jp(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function rr(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function zr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Fs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function Bs(e,t,r=!1){e===null&&r||(Mp(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 uo(e,t,r=!1){e===null&&r||Rt(e,t)}function Dp(e,t){Rt(e,t),rr(e.venue,`${t}.venue`),rr(e.reason,`${t}.reason`),lS.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&rr(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Fp,"costAccounted","capturedAt","blockOrSeq","raw"])jp(e,r,"quote");rr(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"),zr(e.instrument,oS,"quote.instrument"),zr(e.tier,iS,"quote.tier"),rr(e.symbolRaw,"quote.symbolRaw"),rr(e.symbol,"quote.symbol"),zr(e.side,sS,"quote.side"),Bs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of uS)Object.hasOwn(e,r)&&(Bs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of Fp)Bs(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"),Fs(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 lo(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])jp(e,t,"rankResult");return zr(e.rankedOn,aS,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>uo(t,`rankResult.ranked[${r}]`)),uo(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)=>uo(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"),Fs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Fs(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)=>Dp(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Dp(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),zr(e.instrumentMix,cS,"rankResult.instrumentMix"),uo(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var oS,iS,sS,aS,cS,uS,Fp,lS,st=v(()=>{oS=new Set(["spot","perp"]),iS=new Set(["read-only","quote-only","prepare","intent"]),sS=new Set(["buy","sell"]),aS=new Set(["net-of-cost","gross"]),cS=new Set(["homogeneous","heterogeneous"]),uS=["bid","ask","mid","mark"],Fp=["fees","gasEstimate","priceImpact","fundingHourly"],lS=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Hp(){return ve().venues.arcus}function mS(){return Object.keys(Hp().markets).sort()}function hS({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=Hp().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:dS,chain:pS,instrument:"perp",tier:fS,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:po,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 fo({side:e="buy",sizeUsd:t=null}={}){return mS().map(r=>hS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var dS,pS,fS,po,Ds=v(()=>{Be();Nt();Oe();st();dS="arcus_perp",pS="robinhood-4663",fS="quote-only",po="0.00000480324074074"});function Ms(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 Vp(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=yS(n,t),c=t-a,u=F(po),d=Ms(i,c),l=Ms(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:Le(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:po,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=Ms(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Le(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function yS(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)Ls(e+o*zp)&&(r+=1);return t>n&&Ls(e+n*zp)&&(r+=t-n),r}var zp,DO,Wp=v(()=>{Oe();Ds();io();zp=36e5,DO=24*365});function gS(e){return e.mid??e.mark??e.ask??e.bid??null}function bS(e){let t=gS(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 wS(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 xS(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=jr(t.net,e.net);return Ue(Ae(r,we(10000n,0)),t.net,4)}function mo(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=co(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=bS(b);if(y===null)continue;let k=null;if(u&&b.instrument==="perp"&&(k=Vp(b,c,{nowMs:r}),k.carryBps!==null)){let E=yt(F("1"),Ue(k.carryBps,we(10000n,0),12));y.net=Ae(y.net,E),y.costAccounted=!1}d.push(wS(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:xS(f,m[0]),S=d.find(b=>b.tier==="prepare")??null,_=Hr(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=SS(d));let A={rankedOn:h,ranked:g,winner:f,runnersUp:m,improvementBps:w===null?null:Number(Le(w)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:S,carry:f?.carry??null,breakEvenHorizonHours:O};return lo(A)}function SS(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=jr(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(Le(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var js=v(()=>{Us();Wp();io();Oe();st()});function Hs(){return oo()}function _S(e){return{mantissa:e*e*10n**BigInt(nr)/vS,scale:nr}}function OS(e){let t=_S(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),nr);return o.mantissa===0n?null:Ue(F("1"),o,nr)}return Ue(Ae(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),nr)}function CS(e){let t=kp(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function TS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,NS(r,t),nr)}function NS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Mr(e,r).mantissa+Mr(t,r).mantissa,scale:r}}function RS(e){let t=Hs(),r=IS[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function zs(){return Object.keys(Hs().pools).sort()}function or({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=Hs(),o=n.pools[e];if(!o)return null;let i=OS(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"):TS(s,a),d=RS(o.version),f={venue:ES,chain:kS,instrument:"spot",tier:AS,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=CS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Le(Ue(Ae(jr(i,m),we(10000n,0)),m,4))),xe(f)}function Gp({side:e="buy",sizeUsd:t=null}={}){return zs().map(r=>or({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ES,kS,AS,vS,nr,IS,Vs=v(()=>{Be();Nt();Oe();st();ES="rh_uniswap",kS=4663,AS="prepare",vS=1n<<192n,nr=18,IS=Object.freeze({v3:180000n,v4:240000n})});function ho(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=or({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>Kp)throw new Error(`quote is stale (${a}ms old, bound ${Kp}ms); re-quote before preparing`);let u=oo().pools[t],d=u.version==="v4"?PS:$S,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 Kp,$S,PS,Ws=v(()=>{Vs();Be();Kp=12e4,$S="0x0000000000000000000000000000000000000000",PS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Vr(){return ve().venues.hyperliquid_hip3}function Xp(){return Object.keys(Vr().dexs).sort()}function BS(){let e=[];for(let[t,r]of Object.entries(Vr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function FS(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=Vr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Vr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function DS(e,t){try{return Op().books[`${e}:${t}`]??null}catch{return null}}function MS(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(Le(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 jS(e,t,r,n){let o=MS(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Le(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 Yp({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=DS(e,t),l=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(d){let h=jS(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:qS,chain:LS,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 Qp({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=FS(e);return n.length===0||n.length>1?null:Yp({...n[0],side:t,size:r})}function yo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of BS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Vr().dexs[i][s];n.push(Yp({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var qS,LS,US,Jp=v(()=>{Be();Nt();Oe();st();qS="hyperliquid_hip3",LS="hyperliquid",US="quote-only"});function Zp(){return ve().venues.arcus_spot}function WS(){return Object.keys(Zp().pairs).sort()}function GS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=Zp().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:zS,instrument:"spot",tier:VS,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 go({side:e="buy",sizeUsd:t=null}={}){return WS().map(r=>GS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var HS,zS,VS,ef=v(()=>{Be();Nt();Oe();st();HS="arcus_spot",zS="robinhood-4663",VS="quote-only"});function bo(){return Ip()}function Gs(){return Object.keys(bo().tokens).sort()}function QS(e){let t=bo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function JS(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 Ks({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=bo().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=QS(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"):JS(u,d),p=!1;d.mantissa===0n&&(a.liquidityUsd??0)>=tf&&(p=!1);let f={venue:KS,chain:XS,instrument:"spot",tier:YS,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:p,capturedAt:bo().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)<tf}};return xe(f)}function rf({side:e="buy",sizeUsd:t=null}={}){return Gs().map(r=>Ks({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var KS,XS,YS,tf,nf=v(()=>{Be();Nt();Oe();st();KS="solana_xstocks",XS="solana",YS="quote-only",tf=25e3});function wo(){return _p()}function Xs(){return Object.keys(wo().tokens).sort()}function oE(e){let t=wo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function iE(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 Ys({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=wo().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=oE(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"):iE(u,d),f={venue:ZS,chain:eE,instrument:"spot",tier:tE,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:wo().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)<rE,impactSizeFractionHint:nE}};return xe(f)}function of({side:e="buy",sizeUsd:t=null}={}){return Xs().map(r=>Ys({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ZS,eE,tE,rE,nE,sf=v(()=>{Be();Nt();Oe();st();ZS="ton_stonfi",eE="ton",tE="quote-only",rE=25e3,nE=.01});var xo={};j(xo,{bestEquityRoute:()=>sE,collectEquityQuotes:()=>cf,equityVenues:()=>aE,getUniverse:()=>Ep,getVenues:()=>ve,loadFixtures:()=>Rs,prepareEquity:()=>ho,prepareEquityRoute:()=>cE,rankEquityQuotes:()=>mo,toJsonSafe:()=>uE,validateQuote:()=>xe,validateRankResult:()=>lo});function Qs(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function cf(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Qs(t),o=[],i=Qp({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of yo({ticker:r,sizeUsd:n}))o.push(u);for(let u of fo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of go({sizeUsd:n}))u.symbol===r&&o.push(u);let s=or({symbol:r,sizeUsd:n});s&&o.push(s);let a=Ks({symbol:r,sizeUsd:n});a&&o.push(a);let c=Ys({symbol:r,sizeUsd:n});return c&&o.push(c),o}function sE(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Qs(e.sizeUsd??e.size??null),n=cf(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=mo(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>af}}function aE(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:yo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:fo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:go().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:zs().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Gs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Xs().length}],t=[...yo(),...fo(),...go(),...Gp(),...rf(),...of()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=co(t,{nowMs:r});return{inventory:e,hip3Dexs:Xp(),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 cE(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=Qs(e.sizeUsd??e.size??null),o=or({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=ho({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>af}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function uE(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var af,So=v(()=>{Oe();js();Ws();Us();Jp();ef();Ds();Vs();nf();sf();Be();js();Ws();st();Be();af=3600*1e3});var Eo={};j(Eo,{CHAIN_CONFIGS:()=>Dr,EVIDENCE:()=>U,RISK:()=>q,SCANNER_CAPABILITIES:()=>Xt,__clearScanners:()=>ib,createScanner:()=>El,getScanner:()=>ss,listScanners:()=>kl,registerBuiltinScanners:()=>Jn,registerCustomChain:()=>Rd,registerScanner:()=>Bn,scannerCoverage:()=>sb,validateScanner:()=>Sl});var ko=v(()=>{ft();Zn()});var ea={};j(ea,{createWatch:()=>mE,listWatches:()=>fE,removeWatch:()=>hE});import Wr from"node:fs";import Js from"node:path";import{randomUUID as lE}from"node:crypto";import{homedir as dE}from"node:os";function pE(e=process.env){return e.ORACLE_CONFIG_DIR||Js.join(dE(),".config","oracle")}function uf(e=process.env){return Js.join(pE(e),"watches.json")}function Zs(e=process.env){let t=uf(e);if(!Wr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Wr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function lf(e,t=process.env){let r=uf(t);Wr.mkdirSync(Js.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Wr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
+
`,{mode:384}),Wr.renameSync(n,r)}function fE(e=process.env){return Zs(e).watches}function mE({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:lE(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Zs(o);return s.watches.push(i),lf(s,o),i}function hE(e,t=process.env){let r=Zs(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(lf({watches:n},t),!0)}var ta=v(()=>{});var df={};j(df,{classifyReceipt:()=>yE});function yE(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 pf=v(()=>{});function SE(e){return!(xE.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function ff(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
8
|
+
`),n=[...new Set((r.match(gE)||[]).map(i=>i.toLowerCase()))].filter(i=>!wE.has(i)),o=[...new Set(r.match(bE)||[])].filter(SE);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function mf(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 gE,bE,wE,xE,hf=v(()=>{gE=/\b0x[a-fA-F0-9]{40}\b/g,bE=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,wE=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),xE=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as EE}from"node:child_process";import yf from"node:fs";import ra from"node:path";function IE(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function wf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function _E(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ra.isAbsolute(t)?yf.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(ra.delimiter)){if(!n)continue;let o=ra.join(n,"xurl");try{if(yf.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 OE(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 CE(e){for(let t of e){let r=String(t);if(bf.includes(r))return r;if(bf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function TE(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=CE(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(!wf(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(!AE.includes(o))if(vE.includes(o)){if(!wf(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 xf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!IE(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=TE(t,n);if(!o.ok)return o;let i=_E(n);if(!i.ok)return i;let a=(r.spawnFn||EE)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||gf,maxBuffer:1024*1024,env:OE(n)});if(a.error){let l=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||gf}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(l,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,kE),{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 gf,kE,AE,vE,bf,ZC,Sf=v(()=>{Wo();gf=45e3,kE=4e4,AE=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),vE=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),bf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);ZC=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 PE(e){return!e||e==="0x"||e===$E}async function Ef(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(NE))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,d=null,l=null;for(let{label:m,slot:g}of RE)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!PE(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 NE,RE,$E,kf=v(()=>{nt();NE=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"}}),RE=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),$E=`0x${"0".repeat(64)}`});function Ao(e,t){let r=String(e||"").trim();if(!qE.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function na(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 Gr(e,t){return e==null||e===""?null:na(e,t)}function UE({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=Ao(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=na(d.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Gr(d.gasLimit??c.gasLimit,"gasLimit"),g=Gr(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)),S=ji({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=ke(S,{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=Gr(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=Gr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=Gr(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 BE(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}Jn();let r=ss(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function FE({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!==q.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==q.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 Af(e={},t={}){let r=Number(e.chainId??LE);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Ao(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Ao(e.tokenIn,"tokenIn"):null,i=e.recipient?Ao(e.recipient,"recipient"):null,s=e.amountIn==null?null:na(e.amountIn,"amountIn"),a=BE(r,t.scanner),c=t.scanContractRisk||Ef,[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=FE({token:u,pools:d,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),w=null,S=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{S=UE({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:!!S,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:S,localSignerBlockedReason:_,signed:S?"pending-local-signer":!1,broadcast:S?"pending-local-signer":!1}}var qE,LE,vf=v(()=>{Zn();ft();Re();kf();qE=/^0x[0-9a-fA-F]{40}$/,LE=4663});var Tf={};j(Tf,{evaluateContracts:()=>Cf,fetchAccountTweets:()=>Of,snipeExecuteEnabled:()=>If,tickTwitterCaWatch:()=>VE,twitterSnipeEmitsCard:()=>WE});function If(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function _f(e){return String(e||"").trim().replace(/^@/,"")}async function Of({handle:e,limit:t=5,xurlFn:r=xf}={},n={}){let o=_f(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:mf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function HE(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Af({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 zE(e,t){let r=await il(e,{chainSlug:"solana",stables:[ME,jE]},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 Cf(e,t={},r={}){let n=Number(t.chainId??DE),o=[];for(let i of e.evm||[])o.push(await HE(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await zE(i,r));return o}async function VE(e={},t={}){let r=_f(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Of({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=ff(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let l=await(t.evaluateFn||Cf)(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:If(t.env||process.env),hits:i,seen:[...n]}}function WE(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var DE,ME,jE,Nf=v(()=>{hf();Sf();vf();Or();rn();DE=4663,ME="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jE="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as GE}from"ethers";function QE(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return YE.has(t.length)&&t.every(r=>GE.en.getWordIndex(r)>=0)}function tk(e){let t=Rf(e);return ek.has(t)||ZE.test(t)}function Rf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function rk(e){let t=Rf(e);return[...KE].some(r=>t.includes(r))}function nk(e,t,r){if(typeof t=="string"){if(XE.some(n=>n.test(t))||QE(t))throw new Kr(r);if(JE.test(t)&&!tk(e))throw new Kr(r)}}function oa(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return nk(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)=>oa(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(rk(o))throw new Kr(i);e[o]!==void 0&&(n[o]=oa(e[o],i,o))}return n}function ir(e){return oa(e)}var KE,XE,YE,JE,ZE,ek,Kr,ia=v(()=>{KE=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),XE=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],YE=new Set([12,15,18,21,24]);JE=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,ZE=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,ek=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Kr=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 ok,chmod as vo,readFile as ik,rename as sk,writeFile as ak}from"node:fs/promises";import{homedir as ck}from"node:os";import{dirname as $f,join as sa}from"node:path";import uk from"sql.js";function Oo(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Oo).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Oo(e[t])}`).join(",")}}`}function Pf(e){if(!lk.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function Io(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function _o(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function qf(e={}){let t=e.path||fk;await ok($f(t),{recursive:!0,mode:448}),await vo($f(t),448);let r;try{r=await ik(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await uk(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 ak(d,Buffer.from(o.export()),{mode:384}),await vo(d,384),await sk(d,t),await vo(t,384)};return s=s.then(u,u),s}r?await vo(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=Pf(String(u.type)),l=String(u.id||"").trim();if(!l)throw new TypeError("artifact id required");let p=ir(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,Oo(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()?_o(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"):(Pf(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),Io(d).map(_o)},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=Io(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(!dk.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)]),Io(d).map(_o)},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)]),Io(d).map(_o)},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=ir(d);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Oo(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 aa,lk,dk,pk,fk,Lf=v(()=>{ia();aa=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),lk=new Set(aa),dk=new Set(aa.slice(0,-1).map((e,t)=>`${e}:${aa[t+1]}`)),pk=sa(process.env.ORACLE_CONFIG_DIR||sa(ck(),".config","oracle"),"workspace"),fk=sa(pk,"artifacts.sqlite")});import{createHash as Uf}from"node:crypto";function hk(e){return mk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ca(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ca).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ca(e[t])}`).join(",")}}`}function yk(e){return Uf("sha256").update(String(e)).digest("hex")}function Bf(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(hk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Ff(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 gk(e={}){let t=Bf(e.url??e.sourceUrl),r=Ff(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(ir({url:t,fetchedAt:r,contentHash:n}))}function Df(e={}){let t=Bf(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=Ff(e.fetchedAt),s=yk(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(gk),c=ir({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Uf("sha256").update(ca(c)).digest("hex")}`,...c})}var mk,Mf=v(()=>{ia();mk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function jf(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Xr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function la(e,t){return t>0?Xr(e/t*100):null}function da(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function xk(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 $t(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=jf(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||wk.has(n.toUpperCase())})}function Sk(e){let t=[],r=da(e);for(let n of e.assets||e.holdings||[])$t(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)&&$t(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])$t(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])$t(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])$t(t,a,{...i,venue:"Hyperliquid spot"});let s=jf(n.perps?.accountValueUsd);s!=null&&$t(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])$t(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function Ek(e,t){let r=da(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ua(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:Xr(i),percentOfKnown:la(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Hf(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=xk(t.labels??t.addressBook??e.labels??e.addressBook),o={...bk,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((E,R)=>{if(!E||typeof E!="object")return;let I=Ek(E,R);s.has(I)?a+=1:(s.add(I),i.push(E))});let c=i.flatMap(Sk),u=c.filter(E=>E.usdValue!=null),d=c.filter(E=>E.usdValue==null),l=i.reduce((E,R)=>E+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Xr(u.reduce((E,R)=>E+R.usdValue,0)),f=d.length+l,m=ua(u,"chain",p),g=ua(u,"venue",p),h=ua(u,"symbol",p);for(let E of m)E.chain=E.name;for(let E of g)E.venue=E.name;for(let E of h)E.asset=E.name,E.symbol=E.name;let w=Xr(u.filter(E=>E.stablecoin).reduce((E,R)=>E+R.usdValue,0)),S=c.filter(E=>E.kind==="nft"),_=i.reduce((E,R)=>E+Number(R.valuation?.nftUnvaluedItems||0),0),x=S.filter(E=>E.usdValue==null).length+_,O=S.filter(E=>E.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(da).filter(Boolean).map(E=>{let R=n.get(String(E).toLowerCase());return{address:E,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(E=>E.valuation?.complete!==!1&&E.coverage?.complete!==!1),label:f===0&&i.length&&i.every(E=>E.valuation?.complete!==!1&&E.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:la(w,p),high:p>0&&la(w,p)>=o.stablecoinHighPct},nftCoverage:{status:S.length||_?x?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:x,knownUsd:Xr(S.filter(E=>E.usdValue!=null).reduce((E,R)=>E+R.usdValue,0))},addresses:k,warnings:[...new Set(y)]}}var bk,wk,zf=v(()=>{bk=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),wk=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function Vf(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function Kf(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function kk(e){return Number.isFinite(Number(Kf(e)))}function Wf(e){return pe(Kf(e),0)}function Ak(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=Xf(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>kk(o))?r.sort((o,i)=>Wf(o.row)-Wf(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function Xf(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[To(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function Co(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"?Xf(o):To(o);r.has(i)?(n+=1,t!=="fill"&&Vf(o)>Vf(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 vk(e){let t=new Map;for(let r of e){let n=[To(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 Ik(e,t){return t.get(To(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function _k(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(Gf(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 Yf(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=Co(e.balances||[],"balance"),i=Co(e.positions||[],"position"),s=Co(e.fills||[],"fill"),a=Co(e.prices||[],"price"),c=vk(a.rows),u=[],d=0,l=0;for(let k of[...o.rows,...i.rows]){let E=Ik(k,c),R=pe(k.quantity??k.amount??k.size),I=E?pe(E.priceUsd??E.price,NaN):pe(k.priceUsd,NaN);if(!Number.isFinite(I)){l+=1;continue}let $=R*I,L=pe(E?.asOf??k.priceAsOf,0),M=r-L>n;M&&(d+=Math.abs($)),u.push({...k,quantity:R,priceUsd:I,valueUsd:$,stale:M,kind:i.rows.includes(k)?"position":"balance"})}let p=u.filter(k=>k.kind==="balance").reduce((k,E)=>k+E.valueUsd,0),f=u.filter(k=>k.kind==="position"),m=f.reduce((k,E)=>k+E.valueUsd,0),g=f.reduce((k,E)=>k+Math.abs(E.valueUsd),0),h=p+m,w=pe(e.equityUsd,h),S=_k(Ak(e.fills||[])).realizedPnlUsd,_=f.reduce((k,E)=>{let R=pe(E.entryPriceUsd??E.averageEntryPrice??E.costBasisPrice,E.priceUsd);return k+E.quantity*(E.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,E)=>k+E,0),A=[...x].map(([k,E])=>({asset:k,exposureUsd:De(E),percent:O?De(E/O*100):null})).sort((k,E)=>E.exposureUsd-k.exposureUsd||k.asset.localeCompare(E.asset)),b=u.reduce((k,E)=>k+Math.abs(E.valueUsd),0),y=Hf({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:S,unrealizedUsd:De(_),totalUsd:De(S+_)},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,Gf,To,Qf=v(()=>{zf();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,Gf=e=>e.address??e.owner??e.account,To=e=>[ce(e.chain??e.chainId),ce(Gf(e)),ce(Me(e)),ce(e.source)].join("|")});var OT,CT,TT,Jf=v(()=>{OT=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),CT=Object.freeze(["read","simulate"]),TT=1440*60});function Zf(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Ok.test(t)||Ck.includes(r)}function Pt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Nk.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of Tk)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Yr(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"&&Zf(o))throw new Yr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Pt(o,`${t}[key]`,r),Pt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Pt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Pt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Zf(o))throw new Yr(`${t}.${o}`,"forbidden-key-name");Pt(i,`${t}.${o}`,r,o)}return e}var Yr,Ok,Ck,Tk,Nk,em=v(()=>{Jf();Yr=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}},Ok=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Ck=Object.freeze(["privkey","wif","xprv","seed"]);Tk=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}]),Nk=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as Rk}from"node:crypto";function fa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${fa(e[t])}`).join(",")}}`}function $k(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function No(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))No(t)}return e}function ma(e,t="fact"){try{Pt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function nm(e){return Rk("sha256").update(fa(e)).digest("hex")}function om({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:$k(r)};return No({...s,hash:nm(s)})}function Ro({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");ma(t,"intent");let n=om({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return No({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function im(e,t,r,n={}){if(ha(e),!(tm[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`);ma(r,t);let i=n.external===!0||n.externallySupplied===!0;if(rm.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=om({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return No({...e,state:t,events:[...e.events,c],headHash:c.hash})}function ha(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(nm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(ma(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&&!tm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(rm.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 pa,tm,rm,ya=v(()=>{em();pa=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),tm=Object.freeze(Object.fromEntries(pa.map((e,t)=>[e,Object.freeze(t+1<pa.length?[pa[t+1]]:[])]))),rm=new Set(["signed","broadcast"])});function sm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return Pk[t]??t}function qk(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${sm(e)}:${t}`)}function Ce(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:$o(r)})}function Lk(e,t){let r=Se(e.repeatBuys??e.repeat_buys??e.buyCount),n=Se(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 Uk(e,t){let r=Se(e.ageHours??e.poolAgeHours),n=Se(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 Bk(e,t){let r=Se(e.floorChange??e.floorChangePct),n=Se(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 Fk(e,t){let r=Se(e.flowImbalance??e.imbalance),n=Se(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 Dk(e,t){let r=Se(e.marketProbability??e.marketPrice??e.probability),n=Se(e.fairProbability??e.referenceProbability??e.fairValue);Ce(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Se(e.liquidityUsd??e.liquidity);Ce(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function jk(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=>Se(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 Po(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Se(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=sm(o),a=qk(o,i),c=Mk[s],u=[];c&&c(o,u);let d=s==="wallet"?2:s==="pool"?3:2,l=$o(fe(u.length/d)),p=u.reduce((_,x)=>_+x.value,0),f=jk(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Ce(u,"shadow_markout",m);let g=$o(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),w=$o(fe(l*h)),S=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||S.push("UNSUPPORTED_SIGNAL_TYPE"),l<n&&S.push("LOW_COVERAGE","NO_TRADE"),w<.5&&S.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Se(o.ageHours??o.poolAgeHours)??1/0)<24&&S.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&S.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:g,confidence:w,coverage:l,contributions:u,flags:[...new Set(S)],noTrade:S.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var HT,Pk,fe,Se,$o,Mk,ga=v(()=>{HT=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Pk=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)),Se=e=>Number.isFinite(Number(e))?Number(e):null,$o=e=>Math.round(e*1e4)/1e4;Mk=Object.freeze({wallet:Lk,pool:Uk,nft_floor:Bk,hl_flow:Fk,prediction_market:Dk})});function Hk(e=[],t=[],r={}){let n=Po(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 zk(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=Ro({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function am(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=Hk(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(zk(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 cm=v(()=>{ga();ya()});function um(e){let t=Wk[Number(e)]||[];return new Set([...t,...Vk].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var Vk,Wk,lm=v(()=>{Vk=["0x000000000022d473030f116ddee9f6b43ac78ba3"],Wk={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 qo(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function ba(e){e&&(e.prepareAttempted=!0)}function wa(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 Yk(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?[...um(o)]:[];return new Set([...n,...i])}function Qk(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 Jk(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function Zk(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 eA(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 tA(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 Gk)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of Kk)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,Jk(e)){let o=Zk(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=Xk.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=Yk(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(Qk(e)){let o=eA(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 xa(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=tA(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var Gk,Kk,Xk,dm=v(()=>{lm();Re();Gk=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),Kk=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Xk=/^0x[a-fA-F0-9]{40}$/});var fm={};j(fm,{DESK_TOOLS:()=>nA,runDeskTool:()=>iA});function oA(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")>rA)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 iA(e,t,r={}){if(oA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>pm)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Df)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Yf)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Ro,o=r.advanceTradeLifecycle||im,i=r.assertTradeLifecycle||ha;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"){ba(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=xa(t.lifecycle,s?.fact||{});if(!a.ok)return wa(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};qo(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else qo(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"){ba(r.loopVerifier);let a=xa(t.lifecycle,t.fact);if(!a.ok)return wa(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"&&qo(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||am)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Po)(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||qf,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 rA,pm,Lo,qt,Qr,nA,mm=v(()=>{Lf();Mf();Qf();ya();ga();cm();dm();rA=128*1024,pm=5e4,Lo={type:"string",minLength:1,maxLength:256},qt={type:"object",additionalProperties:!0},Qr=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),nA=Object.freeze([Qr("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:Lo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:qt,parentId:Lo,childId:Lo},required:["action"],additionalProperties:!1}),Qr("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:pm},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}),Qr("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:qt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Qr("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:Lo,intent:qt,lifecycle:qt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:qt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Qr("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:qt},markouts:{type:"array",maxItems:100,items:qt},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 hm={};j(hm,{deployGloballyEnabled:()=>aA,executeGloballyEnabled:()=>sA,mevExecuteEnabled:()=>cA});function sA(){return tn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function aA(){return tn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function cA(){return tn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var ym=v(()=>{rn()});rn();import gm from"node:fs";import Sa from"node:process";import{fileURLToPath as uA}from"node:url";import{createInterface as Rm}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}),$m=/^[A-Za-z0-9_-]{1,64}$/;function nn(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 Pm(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function qm(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(!$m.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 Lm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Um(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 Bm(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function ur(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=>ur(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=>ur(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=Bm(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=ur(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=ur(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Vo(e,t={}){let r=qm(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=Lm(t.callTimeoutMs),c=!1;return async function(d){let l=d?.id??null;if(!Pm(d))return de(l,-32600,"invalid request");if(d.method==="initialize")return c=!0,nn(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 nn(l,{});if(!c)return de(l,-32002,"server not initialized");if(d.method==="tools/list")return nn(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=ur(f,o.get(p)?.inputSchema);if(g)return de(l,-32602,g);try{let h=new AbortController,w=await Um(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return nn(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():"",S=/\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 S&&!_&&w.length<=200?de(l,-32e3,`tool call failed: ${w}`):de(l,-32e3,"tool call failed")}}return de(l,-32601,"method not found")}}function Na(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=Vo(e,t),u={closed:!1,inflight:0},d=Rm({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,S()}))}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,S()})}function S(){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),S()}),d.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ra=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"}}),Fm=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 at(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Ee(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 lr(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 Ee(o)}return`${r} raw`}return Ee(e)}var Dm=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 Mm(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Dm[String(e||"").toUpperCase()]}function $a(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=Mm(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=lr(d,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??lr(l,u),{hero:!0}),s("GROSS OUT",d!==void 0&&l!==void 0&&String(d)!==String(l)?lr(l,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ee(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ee(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",lr(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),S=Number(m);Number.isFinite(w)&&Number.isFinite(S)&&w>0&&S>0&&S<=w&&s("SLIPPAGE",`${((1-S/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",`$${Ee(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 S=w?.provider||w?.venue||w?.source,_=lr(w?.netOut??w?.amountOut??w?.toAmount,u);S&&_&&s(`vs ${S}`,_,{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?`$${Ee(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),`$${Ee(m.knownUsd)}`,{dim:!0})}let l=o.avgEntryUsd??o.avgCostUsd;if(l!==void 0)s("AVG ENTRY",`$${Ee(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",`$${Ee(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?`$${Ee(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ee(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",`${Ee(u.reduce((d,l)=>d+l,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ee(o.owners??o.numOwners))}return i}function jm(e,t,r){let n=Ra[e]||Ra.generic,o=$a(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=at(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${at(u.label)}</span><b>${at(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">${at(n.title)}</span></div>
|
|
60
|
+
${i?`<div class="hero">${at(i.value)}</div><div class="herolabel">${at(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 ${at(t)}</summary><pre>${a}</pre></details>
|
|
63
|
+
<div class="foot"><span>${at(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
|
|
64
|
+
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Pa(e,t){let r=Fm[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!$a(r,t).some(i=>i.hero))return null;let o=jm(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Wo();function La(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 rh=[/\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 on(e){let t=String(e??"");for(let r of rh)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)=>La(n)?`${n}${o}[REDACTED]`:r),nh(wt(t,{force:!0}))}function nh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=qa(t);return r.ok?r.href:t})}function dr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(La(n))return"[REDACTED]";if(typeof e=="string"){let i=on(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=>dr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=dr(s,{depth:t+1,seen:r,key:i});return o}function lA(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 Ea=lA(zo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),dA=2*1024*1024;async function pA(e,t=dA){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 bm={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"}}},sr={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:bm,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:bm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},xm=[{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:sr,conversionGasEvidence:sr,gasPriceEvidence:sr,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:sr,conversionGasEvidence:sr,gasPriceEvidence:sr,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:{}}}],wm=String(Sa.env.ORACLE_DEFAULT_ADDRESS||Sa.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"]),mA=new Set(xm.map(e=>e.name));for(let e of fA)if(mA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var hA={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||wm||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||wm;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 ka(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 pA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function yA(e,t,r={},n={}){try{return await ka(`${Ea}/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 Sm(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(()=>(Qc(),Yc));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(()=>(Fi(),lu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(xl(),wl)),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(()=>(Zt(),Wl));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(Kl(),Gl));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(Yl(),Xl));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(ed(),Zl));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(()=>(Vd(),zd));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(()=>(Gd(),Wd));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(Yd(),Xd));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(Jd(),Qd));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(()=>(ep(),Zd));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(np(),rp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(ip(),op));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(()=>(ap(),sp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(up(),cp));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(dp(),lp)),Promise.resolve().then(()=>(fp(),pp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(So(),xo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(So(),xo));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(()=>(So(),xo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(ko(),Eo));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(ko(),Eo));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(()=>(ko(),Eo));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(()=>(ta(),ea));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(ta(),ea));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(pf(),df));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Nf(),Tf));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(()=>(mm(),fm));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(ym(),hm));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(()=>(rs(),Qu));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 ka(`${Ea}/data/catalog`,{signal:r.signal});if(e==="data_health")return ka(`${Ea}/data/health`,{signal:r.signal});let o=hA[e];if(o){let{provider:i,op:s,args:a}=o(t);return yA(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Em(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=on(JSON.stringify(dr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=dr(e),o=on(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Pa(t,e):null;s&&i.push(s)}catch{}return{content:i}}var km=Object.freeze({name:"oracle-data-mcp",version:"1",tools:xm,async call(e,t,r={}){return Em(await Sm(e,t,r),e)}});function gA(){return Na(km)}function bA(){let e=Sa.argv[1];if(!e)return!1;try{return gm.realpathSync(e)===gm.realpathSync(uA(import.meta.url))}catch{return!1}}bA()&&gA();function wA({timeoutMs:e,callToolOptions:t={}}={}){return Vo({...km,async call(r,n,o={}){return Em(await Sm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var f2=wA();export{fA as PUBLIC_MCP_FORBIDDEN_TOOLS,Sm as callTool,wA as createPublicMcpHandler,Em as formatMcpResult,f2 as handle,ka as httpJson,pA as readBoundedJsonResponse,lA as resolveDataUrl,gA as startStdioLoop,xm as tools};
|