@oracle-agent/oracle 0.30.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var Mm=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var M=(e,t)=>{for(var r in t)Mm(e,r,{get:t[r],enumerable:!0})};import{homedir as Go}from"node:os";import{join as Ko}from"node:path";function Xo(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function nn(e,t,r=!1){return String(Xo(e,t,r?"1":"")).trim()==="1"}var qa,jm,
|
|
3
|
-
`),c=wh("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Ch(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Wa):Math.min(250*2**e,Wa)+Math.floor(Math.random()*100)}function mr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ii(e,t,r){return mr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function hr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Nh(e){return e?e.byteLength??e.length??0:0}async function Ka(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(hr(e),!n))throw ii(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let l=await e.text(),p=Buffer.byteLength(l,"utf8");if(p>t){if(!n)throw ii(r,`body ${p} bytes`,t);return Buffer.from(l,"utf8").subarray(0,t).toString("utf8")}return l}let a=[],c=0,u=!1;try{for(;;){let{value:l,done:p}=await s.read();if(p)break;if(l&&(a.push(Buffer.from(l)),c+=Nh(l),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw ii(r,`streamed ${c} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Xa(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Rh(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:d,validateResponse:l,signal:p}){let f=new AbortController,m=setTimeout(()=>f.abort(),i),g=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,h=null,w=t,E=s?{lookupFn:s}:{};if(c&&!a&&!ni(w))throw mr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let _=async(x,{status:O=null}={})=>{let A=await ei(x,E);if(!A.ok)throw mr(O==null?`HTTP refused ${x}: ${A.error}`:`HTTP redirect to ${x} ${A.error}`,O==null?{}:{status:O});let b=new URL(x).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await ti({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw mr(O==null?`HTTP refused ${x}: ${y?.message||y}`:`HTTP redirect to ${x} refused: ${y?.message||y}`,O==null?{}:{status:O})}h.pin(b,A.addresses),w=h.fetch}else Ha(w,b,A.addresses);return A};try{let x=String(e),O={...n||{}};c&&await _(x);for(let A=0;A<=Ga;A+=1){let b=await w(x,{method:r,headers:O,body:o,signal:g,redirect:"manual"});if(Sh.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let P=await Ka(b,u??kh,{url:x,truncate:!0}),q=new Error(`HTTP ${b.status} ${r} ${x} redirected non-idempotent request`);throw q.status=b.status,q.body=Xa(P)??P.slice(0,300),q}if(A===Ga)throw hr(b),new Error(`HTTP redirect loop for ${e}`);let S=b.headers?.get?.("location"),R;try{R=Ih(S,x)}catch(P){throw hr(b),P}let I=!_h(R,x);if(hr(b),I&&(O=vh(O)),c)await _(R,{status:b.status});else if(I){let P=await ei(R,E);if(!P.ok){let q=new Error(`HTTP redirect from ${x} ${P.error}`);throw q.status=b.status,q.retryable=!1,q}a&&P.addresses?.length&&(h||(h=await ti(d?{importUndici:d}:{})),h&&(h.pin(new URL(R).hostname,P.addresses),w=h.fetch))}x=R;continue}if(typeof l=="function")try{await l(b,{url:x})}catch(S){throw hr(b),mr(S?.message||String(S))}let y=await Ka(b,u,{url:x,onOversize:()=>f.abort()}),k=Xa(y);if(!b.ok){let S=new Error(`HTTP ${b.status} ${r} ${x}`);throw S.status=b.status,S.retryAfter=b.headers?.get?.("retry-after")??null,S.body=k??y.slice(0,300),S}return k??y}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function N(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):Eh,c=t.lookupFn,u=!t.fetchImpl,d=t.untrustedUrl===!0,l=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),g=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let O;for(let A=0;A<=a;A++){f?.throwIfAborted?.();try{return await Rh(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:d,maxResponseBytes:g,importUndici:l,validateResponse:p,signal:f})}catch(b){O=b;let y=b?.status,k=b?.name==="AbortError"||b?.name==="TimeoutError"||f?.aborted,S=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?S.has(y)||xh.has(y)&&Va.has(o):!k&&Va.has(o);if(A===a||!R)throw b;let I=Ch(A,b?.retryAfter);f?await new Promise((P,q)=>{let j=setTimeout(P,I);f.addEventListener("abort",()=>{clearTimeout(j),q(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Th(I)}}throw O};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let E=Oh(o,e,i,{untrustedUrl:d,maxResponseBytes:g}),_=oi.get(E);if(_)return _;let x=h().finally(()=>oi.delete(E));return oi.set(E,x),x}async function un(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var xh,Va,Eh,Wa,Ya,Sh,Ga,kh,oi,Th,W=v(()=>{za();xh=new Set([408,425,429,500,502,503,504]),Va=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Eh=2,Wa=4e3,Ya=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Sh=new Set([301,302,303,307,308]),Ga=3,kh=64*1024;oi=new Map;Th=e=>new Promise(t=>setTimeout(t,e))});function Lh({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?$h:Ph}async function si(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Lh(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Qa(e={}){return si({type:"meta"},e)}async function Ja({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return si(i,o)}async function Za({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return si({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Ph,$h,ai=v(()=>{W();Ph="https://api.hyperliquid.xyz/info",$h="https://api.hyperliquid-testnet.xyz/info"});import{createHash as qh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){return typeof e=="number"&&Number.isFinite(e)}function li(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)li(t);return Object.freeze(e)}for(let t of Object.keys(e))li(e[t]);return Object.freeze(e)}function Et(e){if(Array.isArray(e))return e.map(Et);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Et(e[r]);return t}return e}function ci(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function ec(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Bh(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Fh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Dh(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function rc(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Uh.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Ve(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Ve(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ve(e.train)||!Ve(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Et({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Et(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function nc(e){return qh("sha256").update(JSON.stringify(rc(e)),"utf8").digest("hex")}function Te(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function ui(e,t){if(!Ve(e)||!Ve(e.metrics))throw new Error(`${t} metrics required`);let r=Te(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!qt(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function Mh(e,{maxDailyLossPct:t}={}){let r=e.split,n=Te(r.trainStartIndex,"split.trainStartIndex"),o=Te(r.trainEndIndex,"split.trainEndIndex"),i=Te(r.trainBarCount,"split.trainBarCount",1),s=Te(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Te(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Te(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!qt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");ui(e.train,"train");let u=ui(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(qt(t)&&u.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let d=e.walkForward,l=d.windows;if(l.length<1||d.windowsRun!==l.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let g=0;g<l.length;g++){let h=l[g];if(!Ve(h)||h.index!==g||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Te(h.trainStartIndex,`walkForward.windows[${g}].trainStartIndex`),E=Te(h.trainEndIndex,`walkForward.windows[${g}].trainEndIndex`),_=Te(h.evalStartIndex,`walkForward.windows[${g}].evalStartIndex`),x=Te(h.evalEndIndex,`walkForward.windows[${g}].evalEndIndex`);if(w!==0||E>=_||_>x||_<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,h.passed){if(p+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let O=ui({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${g}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(qt(t)&&O.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(h.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/l.length;if(!qt(d.passRate)||Math.abs(d.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function oc(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let r=rc(e),n=Et({id:e.id,...r});if(JSON.stringify(Et(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=nc(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Mh(e,t),e}function di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ve(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ve(r))throw new TypeError("backtestOptions must be a plain object");if(!qt(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=me(e),c=Ut(a),u=yr(t),d=t.length,l=(B=[],H={})=>tc({status:"fail",strategy:a,sHash:c,barsHash:u,split:H.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:H.train||null,holdout:H.holdout||null,walkForward:H.walkForward||{windows:[],passRate:0},flags:[...s,...B]});if(d<10)return l([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(d*n),f=p,m=d-f;if(p<5||m<3)return l([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let g=t.slice(0,p),h=t.slice(f),w,E;try{w=ut(a,g,r),E=ut(a,h,r)}catch(B){return l([{type:"backtest_error",message:String(B.message||B)}])}let _={metrics:ci(w),costs:ec(w),tradeCount:w.metrics.tradeCount},x={metrics:ci(E),costs:ec(E),tradeCount:E.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:d-1,holdoutBarCount:m,trainFraction:n},A=[],b=Math.floor(d/(o+1));if(b<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:b});else for(let B=0;B<o;B++){let H=b*(B+1),ie=H,K=Math.min(d,ie+b);if(K-ie<3||H<3){A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let je=t.slice(ie,K),en;try{en=ut(a,je,r)}catch{A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let tn=ci(en),rn=Dh(tn,a.risk,i);A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:rn,reason:rn?"pass":"fail_metrics",metrics:tn})}let y=A.filter(B=>B.passed).length,k=A.length===0?0:y/A.length,S={windows:A,passRate:k,windowsRun:A.length};x.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=Bh(x.costs),I=Fh(E);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(B=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(B.type)),q=s.some(B=>B.type==="overfit"),j="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&k>=.6&&!(I>0&&R>I)&&!q&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?j="pass_live_eligible":!P&&x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(j="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&x.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?j="fail":x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!P?j="pass_paper_only":j="fail",x.metrics.netPnlUsd<0&&(j=j==="pass_live_eligible"?"fail":j==="pass_paper_only"?"pass_paper_only":"fail",j="fail"),tc({status:j,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:x,walkForward:S,flags:s})}function tc({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:kt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=nc(u),li(Et(JSON.parse(JSON.stringify(u))))}var Uh,pi=v(()=>{At();St();ln();Uh=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as jh,createHmac as Hh,timingSafeEqual as b1}from"node:crypto";function fi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${fi(e[r])}`).join(",")}}`}function ic(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function sc(e=process.env){return ic(process.env)||ic(e)}function Gh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Kh(e){let t=Gh(e);return jh("sha256").update(fi(t)).digest("hex")}function Xh(e,t=sc()){return t?Hh("sha256",t).update(String(e)).digest("hex"):""}function J(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+Vh:Number(i),d=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||d<=0||d>Wh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:zh},f=Kh(p),m=sc(n),g=m?Xh(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var zh,Vh,Wh,ge=v(()=>{zh=2,Vh=300*1e3,Wh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function gr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qh(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function hi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>hi(r,`${t}[${n}]`));return}if(gr(e))for(let[r,n]of Object.entries(e)){let o=Qh(r);if(Yh.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);hi(n,`${t}.${r}`)}}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function ac({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(hi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!gr(e))throw new Error("handoff: strategy required");if(!gr(t))throw new Error("handoff: evidence required");if(!gr(r))throw new Error("handoff: shadow required");if(!gr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=me(e,{nowMs:o}),a=he(s);if(oc(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!mi(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!mi(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!mi(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let d={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},l={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:br,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:d},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(l,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Yh,cc=v(()=>{At();pi();St();ge();Yh=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Bt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Ft(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function wr(e){if(Array.isArray(e))for(let t of e)wr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))wr(t);return Object.freeze(e)}function Zh(e){let t=Jh[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function e0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Ft(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=Ft(Number(o.t),`candles[${n}].t`);if(Ft(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Bt(o.o,`candles[${n}].o`),h:Bt(o.h,`candles[${n}].h`),l:Bt(o.l,`candles[${n}].l`),c:Bt(o.c,`candles[${n}].c`),v:Bt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return wr([...r.values()].sort((n,o)=>n.t-o.t))}function t0(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=Ft(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Bt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function r0({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await Za({coin:e,startTime:i,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let d of c){let l=Number(d?.time);Number.isSafeInteger(l)&&l>u&&(u=l)}if(c.length<500||u>=r){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return t0(o,r)}function n0(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function uc(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=Zh(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Ft(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):Ft(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Ja({coin:r,interval:n,startTime:a,endTime:i},t),r0({coin:r,startTime:a,endTime:i},t)]),d=e0(c,{endTime:i}),l=wr(n0(d,u,o));return wr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:l})}var Jh,lc=v(()=>{ai();Jh=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function s0(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let r of Object.keys(e))i0.has(r)||t.push({path:`market.${r}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!o0.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function a0(e={}){let t=await Qa(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var o0,i0,dc,pc=v(()=>{ai();cc();lc();o0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),i0=new Set(["coin","interval"]);dc=Object.freeze({id:"hyperliquid",validateMarket:s0,fetchBars:uc,listMarkets:a0,prepareIntent(e){return ac(e)}})});function u0(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of c0.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function yi(e){return typeof e!="string"?null:l0.get(e)??null}function gi(e){let t=yi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var c0,fc,l0,R1,bi=v(()=>{pc();c0=Object.freeze(["id","validateMarket","prepareIntent"]);fc=[dc].map(u0),l0=new Map(fc.map(e=>[e.id,e])),R1=Object.freeze([...fc])});import{createHash as d0}from"node:crypto";function Ie(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function Ec(e){return Number.isInteger(e)&&e>0}function ki(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ki(t);return Object.freeze(e)}for(let t of Object.keys(e))ki(e[t]);return Object.freeze(e)}function Ai(e){if(Array.isArray(e))return e.map(Ai);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ai(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function lt(e,t,r,n){for(let o of Object.keys(e))t.has(o)||C(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function vc(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Si(e,t,r,n){if(Ie(e)){if(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return C(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return C(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Ie(o)||![o.value,o.min,o.max,o.step].every(Ec)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Ec(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function Sc(e,t,r,n){return Ie(e)?(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(C(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(C(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(C(n,t,"must be a finite number or {param}"),null)}function dn(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function x0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of dn(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function E0(e,t){if(!Ie(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>bc)return C(t,"parameters",`too many parameters (max ${bc})`),null;let n={};for(let o of r){if(!kc.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ie(i)){C(t,s,"must be a plain object");continue}lt(i,hc,s,t);for(let l of hc)l in i||C(t,`${s}.${l}`,"required field is missing");let{value:a,min:c,max:u,step:d}=i;ne(c)||C(t,`${s}.min`,"must be a finite number"),ne(u)||C(t,`${s}.max`,"must be a finite number"),(!ne(d)||d<=0)&&C(t,`${s}.step`,"must be a positive finite number"),ne(a)||C(t,`${s}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&C(t,`${s}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(d)&&d>0&&(vc(a,c,u,d)||C(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:d}}return n}function S0(e,t,r,n){let o=`nodes.${t}`;if(!Ie(e))return C(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!gc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),lt(e,w0,o,n),null;switch(lt(e,gc[e.type],o,n),(typeof e.id!="string"||!Ac.test(e.id))&&C(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!p0.has(e.field))&&C(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Sc(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!f0.has(e.indicator))&&C(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?C(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Si(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?C(n,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))C(n,`${o}.period`,"required field is missing");else{let a=Si(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))C(n,`${o}.${a}`,"required field is missing");else{let c=Si(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?g0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be line|signal|histogram"):C(n,`${o}.output`,"required field is missing"),"period"in e&&C(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(n,`${o}.stdDev`,"required field is missing");else{let a=Sc(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?C(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?b0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be upper|middle|lower"):C(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&C(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!m0.has(e.op))&&C(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!h0.has(e.op))&&C(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?C(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&C(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!y0.has(e.direction))&&C(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function k0(e,t,r){if(!Ie(e))return C(t,"risk","must be a plain object"),null;lt(e,yc,"risk",t);for(let p of yc)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let d=e.maxDailyLossPct;!ne(d)||d<=0||d>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=d;let l=e.expiresAt;return!Number.isInteger(l)||l<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?l<=r.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=l),n}function vi(e,t={}){let r=[];if(!Ie(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};lt(e,mc,"",r);for(let l of mc)(!(l in e)||e[l]==null)&&C(r,l,"required field is missing");e.version!==wi&&C(r,"version",`must be ${wi}`),(typeof e.id!="string"||!kc.test(e.id))&&C(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>xc)&&C(r,"name",`must be a non-empty string max ${xc}`);let n=yi(e.venue);n||C(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ie(e.market)||C(r,"market","must be a plain object");else{let l=n.validateMarket(e.market);if(!l||typeof l.ok!="boolean"||!Array.isArray(l.errors))C(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(l.ok)o=l.market;else for(let p of l.errors)C(r,p.path,p.message)}let i=E0(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))C(r,"nodes","must be an array");else if(e.nodes.length>wc)C(r,"nodes",`too many nodes (max ${wc})`);else{s=[];for(let l=0;l<e.nodes.length;l++){let p=S0(e.nodes[l],l,i||{},r);p&&(typeof p.id=="string"&&Ac.test(p.id)&&(a.has(p.id)?C(r,`nodes.${l}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let l=0;l<s.length;l++){let p=s[l],f=`nodes.${l}`;for(let m of dn(p))a.has(m)||C(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of dn(p)){let g=a.get(m);g&&xi.has(g.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of dn(p)){let g=a.get(m);g&&!xi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}x0(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!Ie(e.rules))C(r,"rules","must be a plain object");else{lt(e.rules,Ei,"rules",r);for(let l of Ei)l in e.rules||C(r,`rules.${l}`,"required field is missing");c={};for(let l of Ei){let p=e.rules[l];if(p===null){c[l]=null;continue}if(typeof p!="string"||!p){C(r,`rules.${l}`,"must be a node id or null"),c[l]=p;continue}if(!a.has(p)){C(r,`rules.${l}`,`unknown node ref "${p}"`),c[l]=p;continue}let f=a.get(p);xi.has(f.type)||C(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=p}}let u=k0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let d=ki({version:wi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:d}}function me(e,t={}){let r=vi(e,t);if(!r.ok)throw new Dt(r.errors);return r.strategy}function A0(e){let t=me(e);return JSON.stringify(Ai(t))}function Ut(e){let t=A0(e);return d0("sha256").update(t,"utf8").digest("hex")}function xr(e,t){if(!Ie(e))throw new Dt([{path:"",message:"strategy must be a plain object"}]);if(!Ie(t))throw new Dt([{path:"overrides",message:"must be a plain object"}]);let r=me(e),n={};for(let[i,s]of Object.entries(r.parameters))n[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,i)){C(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ne(s)){C(o,i,"override must be a finite number");continue}if(!vc(s,a.min,a.max,a.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Dt(o);return me({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var wi,kc,Ac,p0,f0,m0,h0,y0,g0,b0,xi,mc,hc,Ei,yc,w0,gc,bc,wc,xc,Dt,St=v(()=>{bi();wi=1,kc=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ac=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,p0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),f0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),m0=new Set(["gt","gte","lt","lte","eq"]),h0=new Set(["and","or","not"]),y0=new Set(["above","below"]),g0=new Set(["line","signal","histogram"]),b0=new Set(["upper","middle","lower"]),xi=new Set(["compare","logic","cross"]),mc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),hc=new Set(["value","min","max","step"]),Ei=new Set(["entryLong","entryShort","exitLong","exitShort"]),yc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),w0=new Set(["id","type"]),gc={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},bc=16,wc=128,xc=100,Dt=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function Er(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function dt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function v0(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let o=r[n];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function _c(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function pn(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Oc(e,t){Er(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Ic(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,d=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+d)/t,r[a]=Ic(i,s)}return r}function Ic(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Cc(e,t={}){Er(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(dt(r),dt(n),dt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=pn(e,r),s=pn(e,n),a=new Array(e.length).fill(null);for(let l=0;l<e.length;l++)i[l]!=null&&s[l]!=null&&(a[l]=i[l]-s[l]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),d=[];for(let l=0;l<a.length;l++)a[l]!=null&&d.push(l);if(d.length>=o){let l=0;for(let g=0;g<o;g++)l+=a[d[g]];let p=l/o,f=d[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let g=o;g<d.length;g++){let h=d[g];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function Tc(e,t={}){Er(e);let r=t.period,n=t.stdDev;if(dt(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<r)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let d=e[u];if(a+=d,c+=d*d,u>=r){let l=e[u-r];a-=l,c-=l*l}if(u>=r-1){let l=a/r,p=c/r-l*l;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=l,i[u]=l+n*f,s[u]=l-n*f}}return{upper:i,middle:o,lower:s}}function Nc(e,t){v0(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Rc=v(()=>{});import{createHash as I0}from"node:crypto";var Ii,_0,O0,C0,Pc,$c=v(()=>{Ii=2,_0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",O0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",C0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",Pc=I0("sha256").update(JSON.stringify({version:Ii,compilerSourceHash:_0,indicatorsSourceHash:O0,schemaSourceHash:C0})).digest("hex")});function Ne(e){return typeof e=="number"&&Number.isFinite(e)}function R0(e){let t=new Map(e.map(a=>[a.id,a])),r=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Mt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function P0(e,t,r){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let n=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l:u,c:d,v:l}=i;if(!Ne(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",d],["v",l]])if(!Ne(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",d]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(l<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,d,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,d,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==N0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!Ne(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ne(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function vt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=T0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let d=n[u][c];a[u]=d===void 0?null:d}break}case"constant":{let c=Mt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Mt(s.period,r):void 0;if(s.indicator==="atr"){let l=[];for(let p=0;p<=o;p++){let f=n[p];l.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Nc(l,c);break}let d=vt(s.input,t,r,n,o,i).map((l,p)=>{if(l==null||!Ne(l))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return l});if(s.indicator==="sma")a=_c(d,c);else if(s.indicator==="ema")a=pn(d,c);else if(s.indicator==="rsi")a=Oc(d,c);else if(s.indicator==="macd")a=Cc(d,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Tc(d,{period:c,stdDev:Mt(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1);for(let d=0;d<=o;d++){let l=c[d],p=u[d];if(l==null||p==null||!Ne(l)||!Ne(p)){a[d]=!1;continue}switch(s.op){case"gt":a[d]=l>p;break;case"gte":a[d]=l>=p;break;case"lt":a[d]=l<p;break;case"lte":a[d]=l<=p;break;case"eq":a[d]=l===p;break;default:a[d]=!1}}break}case"logic":{let c=s.inputs.map(u=>vt(u,t,r,n,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let d=c[0][u];a[u]=d===!0?!1:d===!1}else if(s.op==="and"){let d=!0;for(let l of c)if(l[u]!==!0){d=!1;break}a[u]=d}else if(s.op==="or"){let d=!1;for(let l of c)if(l[u]===!0){d=!0;break}a[u]=d}else a[u]=!1;break}case"cross":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let d=1;d<=o;d++){let l=c[d-1],p=u[d-1],f=c[d],m=u[d];if(l==null||p==null||f==null||m==null||!Ne(l)||!Ne(p)||!Ne(f)||!Ne(m)){a[d]=!1;continue}s.direction==="above"?a[d]=l<=p&&f>m:a[d]=l>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function he(e,t={}){let r=me(e);t&&Object.keys(t).length&&(r=xr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(R0(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Ut(r);function u(f,m){let g={};for(let w of o){let E=f.get(w);g[w]=E[m]}let h=w=>w!=null&&g[w]===!0;return{values:g,signals:{entryLong:h(r.rules.entryLong),entryShort:h(r.rules.entryShort),exitLong:h(r.rules.exitLong),exitShort:h(r.rules.exitShort)}}}function d(f,m){P0(f,m,r.market.interval);let g=new Map;for(let h of o)vt(h,n,i,f,m,g);return g}function l(f,m){return u(d(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,g=d(f,m);return Object.freeze(f.map((h,w)=>Object.freeze(u(g,w))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:br,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:p})}var br,kt,T0,N0,At=v(()=>{St();Rc();$c();br=Ii,kt=Pc,T0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),N0=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as $0}from"node:crypto";function q0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function _i(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)_i(t);return Object.freeze(e)}for(let t of Object.keys(e))_i(e[t]);return Object.freeze(e)}function fn(e){if(Array.isArray(e))return e.map(fn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=fn(e[r]);return t}return e}function Oi(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((r,n)=>Oi(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Oi(n,`${t}.${r}`)}}function qc(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=n;if(!We(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!We(l))throw new TypeError(`bars[${r}].${d} must be a finite number`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c]])if(!(l>0))throw new TypeError(`bars[${r}].${d} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in n&&n.fundingRate!=null&&!We(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!We(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!We(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function yr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&qc(e),$0("sha256").update(JSON.stringify(fn(e)),"utf8").digest("hex")}function U0(e){if(e==null&&(e={}),!q0(e))throw new TypeError("options must be a plain object");let t={...L0},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!We(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let o=e[n];if(!We(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!We(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function mn(e){return e/1e4}function B0(e,t,r){let n=mn(r);return t==="long"?e*(1+n):e*(1-n)}function F0(e,t,r){let n=mn(r);return t==="long"?e*(1-n):e*(1+n)}function Lc(e,t,r){let n=Math.abs(e)*mn(t),o=Math.abs(e)*mn(r);return{taker:n,builder:o,total:n+o}}function D0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function M0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function j0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function H0(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function z0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function V0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function W0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Sr(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function G0(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function K0(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function ut(e,t,r={}){let n=U0(r);qc(t);let o=yr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(Sr(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,d=n.takerFeeBps,l=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,g=0,h=0,w=0,E=[],_=[],x=[],O=[],A=[],b=null,y=0,k=null,S=p,R=!1,I=0,P=0,q=[],j=new Array(t.length).fill(0);function X(T){q.push(T)}function B(T){let D=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,D-j[T])}function H(T){if(!b)return p;let D=b.side==="long"?(T-b.entryPrice)*b.qty:(b.entryPrice-T)*b.qty;return p+D}function ie(T,D,$){let ee=$.o,z=D0(p,s);if(!(z>0)||!(ee>0))return;let te=B0(ee,D,u),Q=z/te,se=B(T),ur=te*se;if(Q>se){x.push({kind:"entry",barIndex:T,time:$.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:ur,reason:"volume_participation"});return}j[T]+=Q;let He=Math.abs(te-ee)*Q,Ze=Lc(z,d,l);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,w+=z,b={lifecycleEpoch:++P,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:Q,notionalUsd:z,stop:M0(te,D,s.stopLossPct),take:j0(te,D,s.takeProfitPct),liq:H0(te,D,s.maxLeverage,d+l),entryFees:Ze.taker,entryBuilderFees:Ze.builder,entrySlippageUsd:He,fundingAccrued:0}}function K(T,D,$,ee){if(!b)return!1;let z=b.side,te=D,Q=te;$!=="liquidation"&&ee&&(Q=F0(te,z,u));let se=b.qty,ur=se*Q;if($!=="liquidation"){let La=B(T),Dm=Q*La;if(se>La)return x.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ur,maxFillNotionalUsd:Dm,reason:"volume_participation",triggerReason:$}),!1;j[T]+=se}let He=Lc(ur,d,l),Ze=$==="liquidation"?0:Math.abs(Q-te)*se,lr,Wo;z==="long"?(lr=(te-b.entryReferencePrice)*se,Wo=(Q-b.entryPrice)*se):(lr=(b.entryReferencePrice-te)*se,Wo=(b.entryPrice-Q)*se),p+=Wo,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,w+=ur;let Fm={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:Q,exitReason:$,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:lr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:lr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return E.push(Fm),$==="liquidation"&&_.push({barIndex:T,time:t[T].t,side:z,price:Q,tradeIndex:E.length-1}),b=null,P+=1,I=T+1+(s.cooldownBars||0),!0}function je(T,D,$,ee){let z=T+1;if(z>=t.length)return;q.some(Q=>Q.kind==="exit"&&Q.side===D&&Q.fillBar===z&&Q.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:$,epoch:ee})}function en(T){let D=q.filter($=>$.fillBar===T);for(let $=q.length-1;$>=0;$--)q[$].fillBar===T&&q.splice($,1);D.sort(($,ee)=>{let z=te=>te.kind==="exit"?0:1;return z($)-z(ee)});for(let $ of D)if($.kind==="exit"){if(!b||b.side!==$.side||b.lifecycleEpoch!==$.epoch)continue;let ee=$.reason||"rule";K(T,t[T].o,ee,!0)||je(T,$.side,ee,$.epoch)}else if($.kind==="entry"){if(b||$.epoch!==P||T<I)continue;ie(T,$.side,t[T])}}function tn(T){if(!b)return;let D=t[T],$=D.fundingPaymentRate;if($==null||!We($)||$===0)return;let ee=Math.abs(b.qty*D.c),z=$*ee;b.side==="long"?(p-=z,b.fundingAccrued+=z,g+=z):(p+=z,b.fundingAccrued-=z,g-=z)}function rn(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Ta(T){if(!b)return;let D=t[T],$=b.side,ee=W0(D,$,b.liq),z=z0(D,$,b.stop),te=V0(D,$,b.take),Q=se=>$==="long"?Math.min(se,D.o):Math.max(se,D.o);if(ee){K(T,Q(b.liq),"liquidation",!1);return}if(z&&te){K(T,Q(b.stop),"stop_loss",!0)||je(T,$,"stop_loss",b.lifecycleEpoch);return}if(z){K(T,Q(b.stop),"stop_loss",!0)||je(T,$,"stop_loss",b.lifecycleEpoch);return}te&&(K(T,b.take,"take_profit",!0)||je(T,$,"take_profit",b.lifecycleEpoch))}for(let T=0;T<t.length;T++){let D=Math.floor(t[T].t/864e5);D!==k&&(k=D,S=H(t[T].o),R=!1),rn(T),en(T),Ta(T),tn(T),!R&&H(t[T].c)<=S*(1-s.maxDailyLossPct/100)&&(R=!0,O.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=a[T].signals,ee=T+c;if(b)(b.side==="long"&&$.exitLong===!0||b.side==="short"&&$.exitShort===!0)&&ee<t.length&&(q.some(se=>se.kind==="exit"&&se.side===b.side&&se.fillBar===ee&&se.epoch===b.lifecycleEpoch)||X({kind:"exit",side:b.side,signalBar:T,fillBar:ee,reason:"rule",epoch:b.lifecycleEpoch}));else{let te=$.entryLong===!0,Q=$.entryShort===!0;te&&Q?O.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!R&&(te||Q)&&ee<t.length&&T>=I&&X({kind:"entry",side:te?"long":"short",signalBar:T,fillBar:ee,epoch:P})}let z=p;b&&(y+=1,z=H(t[T].c)),A.push({barIndex:T,time:t[T].t,equity:z,positionSide:b?b.side:null})}let Na=null;if(b){let T=t.length-1;if(K(T,t[T].c,"end_of_data",!0))A[T]={barIndex:T,time:t[T].t,equity:p,positionSide:null};else{let $=H(t[T].c);Na={side:b.side,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,qty:b.qty,notionalUsd:b.notionalUsd,markPrice:t[T].c,markedEquityUsd:$},O.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ra=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Lm=Ra/n.initialEquityUsd*100,Pa=0,jo=0,Ho=0;for(let T of E)T.netPnlUsd>0?(Pa+=1,jo+=T.netPnlUsd):T.netPnlUsd<0&&(Ho+=-T.netPnlUsd);let zo=E.length,qm=zo===0?0:Pa/zo,Vo=0;Ho>0?Vo=jo/Ho:jo>0&&(Vo=1e12);let Um={netPnlUsd:Ra,netPnlPct:Lm,maxDrawdownPct:K0(A),winRate:qm,profitFactor:Vo,tradeCount:zo,sharpe:G0(A),turnoverUsd:w,exposurePct:y/t.length*100},Bm={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},$a={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:br,config:Bm,trades:E,equityCurve:A,metrics:Um,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:_,missedFills:x,openPositionAtEnd:Na,flags:O};return Oi($a),_i(fn($a))}var L0,ln=v(()=>{At();St();L0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as X0}from"node:crypto";function ny(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ci(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ci(t);return Object.freeze(e)}for(let t of Object.keys(e))Ci(e[t]);return Object.freeze(e)}function oy(e){return String(e).trim().replace(/\s+/g," ")}function iy(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function sy(e){for(let r of Q0)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function ay(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let r=t[1].toLowerCase();return Y0.has(r)?r:null}function cy(e){let t={...Z0},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function uy(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(r=>(e.match(r)??[]).length>1)}function ly(e){let t=X0("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function dy(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let r=Number(t[1]),n=t[2].toLowerCase(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function py(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function fy(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function my(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Uc(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function hy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let d=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:d,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Uc(a.fast),ema_right_period:Uc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function yy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function gy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bc(e,t={}){if(typeof e!="string")throw new ue("prompt must be a string");if(e.length>1e3)throw new ue("prompt length must be <= 1000");if(!ny(t))throw new ue("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new ue("options.nowMs is required integer epoch ms");let r=t.nowMs,n=ry;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<ey||n>ty)throw new ue("expiresInMs must be between 1h and 30d")}if(J0.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=oy(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(uy(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=iy(o),s=sy(o),a=ay(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=cy(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new ue("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new ue("position size out of range");let u=r+n,d=ly(o),l=`Draft ${s} ${i}`.slice(0,100),p=dy(o),f=py(o),m=fy(o),g=[p,f,m].filter(Boolean);if(g.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!my(o,g[0]))throw new ue(`unsupported or ambiguous prompt. ${jt}`);let h,w=g[0],E={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:d,name:l,spec:w};w.kind==="ema_cross"?h=hy(E):w.kind==="rsi"?h=yy(E):h=gy(E);let _=vi(h,{nowMs:r});if(!_.ok)throw new ue(`draft failed validation: ${_.errors.map(x=>x.message).join("; ")}`);return Ci(me(h,{nowMs:r}))}var ue,Y0,Q0,J0,jt,Z0,ey,ty,ry,Fc=v(()=>{St();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Y0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Q0=new Set(["BTC","ETH","SOL","HYPE"]),J0=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,jt="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",Z0=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),ey=36e5,ty=30*864e5,ry=864e5});import{createHash as by}from"node:crypto";function jc(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function Hc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ni(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ni(t);return Object.freeze(e)}for(let t of Object.keys(e))Ni(e[t]);return Object.freeze(e)}function kr(e){if(Array.isArray(e))return e.map(kr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=kr(e[r]);return t}return e}function hn(e){return JSON.stringify(kr(e))}function wy(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function xy(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=hn(n),s=hn(o);return i<s?-1:i>s?1:0}),r}function Ti(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=hn(r),a=hn(o);return s<a}function zc(e,t,r={}){if(!Hc(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(jc(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Dc)throw new TypeError(`maxTrials must be an integer 1..${Dc}`);o=x}let i=r.objective??"netPnlUsd";if(!Mc.has(i))throw new TypeError(`objective must be one of ${[...Mc].join("|")}`);let s=r.backtestOptions??{};if(!Hc(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(jc(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=me(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},d=1;for(let x of c){let O=wy(a.parameters[x]);if(O.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=O,d*=O.length}let l=xy(c,u);if(l.length===0)throw new Error("parameter grid is empty");let p=l.slice(0,o),f=[],m=null,g=null;for(let x of p){let O=xr(a,x),A=ut(O,t,s);g==null&&(g=A.config);let b={netPnlUsd:A.metrics.netPnlUsd,netPnlPct:A.metrics.netPnlPct,maxDrawdownPct:A.metrics.maxDrawdownPct,winRate:A.metrics.winRate,profitFactor:A.metrics.profitFactor,tradeCount:A.metrics.tradeCount,sharpe:A.metrics.sharpe,turnoverUsd:A.metrics.turnoverUsd},y={parameters:{...x},metrics:b};f.push(y),(!m||Ti(i,b,x,m.metrics,m.parameters))&&(m=y)}f.sort((x,O)=>Ti(i,x.metrics,x.parameters,O.metrics,O.parameters)?-1:Ti(i,O.metrics,O.parameters,x.metrics,x.parameters)?1:0);let h={...m.parameters},w=xr(a,h),E={strategyHash:Ut(a),compilerHash:kt,trainBarsHash:yr(t),backtestConfig:g,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:w},_={id:by("sha256").update(JSON.stringify(kr(E)),"utf8").digest("hex"),...E};return Ni(kr(JSON.parse(JSON.stringify(_))))}var Dc,Mc,Vc=v(()=>{At();St();ln();Dc=256,Mc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import yn from"node:path";function gn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Sy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ht(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ht(r,`${t}[${n}]`));return}if(gn(e))for(let[r,n]of Object.entries(e)){let o=Sy(r);if(Ey.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function ky(e){if(typeof e!="string"||!e||!yn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Wc(e){let t;try{t=et.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function Ay(){return{version:Pi,runners:[]}}function Gc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!gn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Pi)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Ht(r,yn.basename(t)),{version:Pi,runners:r.runners.map(n=>Ge(n))}}function Kc(e,t){Ht(t,"store");let r=yn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=yn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
-
`;try{et.writeFileSync(n,o,{mode:384,flag:"wx"}),et.renameSync(n,e);try{et.chmodSync(e,384)}catch{}}catch(i){try{et.unlinkSync(n)}catch{}throw i}}function Xc(e={}){let t=e.path;if(ky(t),Wc(t),et.existsSync(t)?Gc(et.readFileSync(t,"utf8"),t):Kc(t,Ay()),Ri.has(t))return Ri.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let g=m.fn();r=!1,m.resolve(g),o()}catch(g){r=!1,m.reject(g),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((g,h)=>{n.push({fn:m,resolve:g,reject:h}),queueMicrotask(o)})}function s(){return Wc(t),Gc(et.readFileSync(t,"utf8"),t)}function a(m){Kc(t,m)}function c(m){if(!gn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Ht(m,"record");let g=s();if(g.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=Ge(m);return g.runners.push(h),a(g),Ge(h)}function u(m){let g=s().runners.find(h=>h.id===m);return g?Ge(g):null}function d(){return s().runners.map(m=>Ge(m))}function l(m,g){if(typeof g!="function")throw new Error("shadow-store: updater must be a function");let h=s(),w=h.runners.findIndex(x=>x.id===m);if(w<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=Ge(h.runners[w]),_=g(E);if(!gn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Ht(_,"record"),h.runners[w]=Ge(_),a(h),Ge(h.runners[w])}function p(m){let g=s(),h=g.runners.findIndex(E=>E.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=Ge(g.runners[h]);return w.status!=="stopped"&&(w.status="stopped",g.runners[h]=w,a(g)),Ge(g.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return d()},update(m,g){return i(()=>l(m,g))},stop(m){return i(()=>p(m))}};return Ri.set(t,f),f}var Pi,Ey,Ri,Yc=v(()=>{Pi=1,Ey=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Ri=new Map});import{createHash as qi}from"node:crypto";function $i(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Li(e){return Array.isArray(e)?e.map(Li):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Li(e[t])])):e}function Jc(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return qi("sha256").update(JSON.stringify(Li(e))).digest("hex")}function vy(e,t,r,n,o){return qi("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Iy(e,t,r,n){return qi("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function _y(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Qc(e){return e==="entryLong"||e==="entryShort"}function Ui({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Xc({path:e});function n({strategy:c,evidenceId:u=null}={}){let d=he(c),l=u==null?null:String(u),p=r.list().filter(w=>w.status==="running"&&w.strategyHash===d.strategyHash&&w.compilerHash===d.compilerHash&&w.evidenceId===l).sort((w,E)=>w.createdAt-E.createdAt||w.id.localeCompare(E.id))[0];if(p)return $i(p);let f=t(),m=Iy(f,d.strategyHash,d.compilerHash,l),g=r.get(m);if(g)return $i(g);let h={id:m,strategy:$i(d.strategy),strategyHash:d.strategyHash,compilerHash:d.compilerHash,evidenceId:l,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(h)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.stop(c)}function a(c,u,{markoutHorizons:d=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,l=>{if(l.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return l;let f=he(l.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let g=l.cursor,h=[];for(let I=0;I<u.length;I++){let P=u[I].t;(g==null||P>g)&&h.push(I)}if(h.length===0)return l;let w=new Map(l.intendedOrders.map(I=>[I.id,I])),E=new Set(l.fills.map(I=>I.orderId)),_=new Map(l.missedFills.map(I=>[I.orderId,I])),x=(I,P)=>`${I}|${P}`,O=new Map(l.markouts.map(I=>[x(I.orderId,I.horizon),I])),A=l.position?{...l.position}:null,b=Number.isInteger(l.cooldownBarsRemaining)?Math.max(0,l.cooldownBarsRemaining):0,y=Number.isFinite(l.cooldownStartT)?l.cooldownStartT:null;function k({action:I,signalBarT:P,signalIndex:q}){let j=_y(I),X=vy(l.id,l.strategyHash,P,j,I);if(w.has(X))return w.get(X);let B=q+1,H=B<u.length,ie={id:X,action:I,type:I,side:j,signalBarT:P,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return w.set(X,ie),l.intendedOrders.push(ie),ie}function S(I,P,q){if(E.has(I.id))return;let j={orderId:I.id,action:Qc(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:q};if(l.fills.push(j),E.add(I.id),I.status="filled",I.fillBarT=P.t,_.has(I.id)&&(_.delete(I.id),l.missedFills=l.missedFills.filter(X=>X.orderId!==I.id)),Qc(I.action)){A={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:q};for(let X of d){let B=x(I.id,X);if(O.has(B))continue;let H={orderId:I.id,horizon:X,entryBarT:P.t,entryPrice:P.o,side:A.side,status:"pending",close:null,barT:null};O.set(B,H),l.markouts.push(H)}}else A=null,b=Number(l.strategy?.risk?.cooldownBars)||0,y=P.t}function R(I){if(E.has(I.id)||_.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,P),l.missedFills.push(P),I.status="missed"}for(let I of l.intendedOrders){if(I.status==="filled"||E.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let q=P+1;q<u.length&&(g==null||u[q].t>g)&&S(I,u[q],q)}for(let I of h){let P=u[I],q=f[I].signals,j=A,X=H=>{if(A||b>0&&(y==null||P.t>=y))return;let K=k({action:H,signalBarT:P.t,signalIndex:I}),je=I+1;je<u.length?S(K,u[je],je):R(K)},B=H=>{if(!A||A.side==="long"&&H!=="exitLong"||A.side==="short"&&H!=="exitShort")return;let ie=k({action:H,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?S(ie,u[K],K):R(ie)};j?(q.exitLong&&B("exitLong"),q.exitShort&&B("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&X("entryLong"),q.entryShort&&X("entryShort")),b>0&&y!=null&&P.t>=y&&(b-=1,b===0&&(y=null)),l.cursor=P.t,l.lastProcessedBarIndex=I}for(let I of l.markouts){if(I.status!=="pending")continue;let P=l.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!P)continue;let q=m.get(P.barT);if(q==null)continue;let j=q+I.horizon;if(j<u.length){I.close=u[j].c,I.barT=u[j].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return l.position=A,l.cooldownBarsRemaining=b,l.cooldownStartT=y,l.updatedAt=t(),l})}return{start:n,step:a,list:i,get:o,stop:s}}var Zc=v(()=>{At();Yc()});var ru={};M(ru,{runStrategyOperation:()=>Ly});import Oy from"node:os";import Cy from"node:path";function Ar(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ny(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Fi(e){if(Array.isArray(e)){for(let t of e)Fi(t);return}if(Ar(e))for(let[t,r]of Object.entries(e)){if(Ty.some(n=>Ny(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Fi(r)}}function Ry(e){if(!Ar(e))throw new TypeError("strategy input must be a plain object");return Fi(e),e}function Py(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function Bi(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=gi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);r.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Di(e,t){let r=e.backtestOptions??{};if(!Ar(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function eu(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Ar(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:Di(e,n)}}function tu(){return Cy.join(Oy.homedir(),".oracle","strategy-shadow.json")}function $y(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function Ly(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Ry(t),o=Py(n,r);if(e==="draft")return{strategy:Bc(n.prompt,{nowMs:o})};if(e==="validate"){let i=he(n.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Sr(i,s);let a=di(eu(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ut(i.strategy,s,Di(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Sr(i,s);let a=n.trainFraction,c=n.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let d=s.slice(0,Math.floor(s.length*u)),l=n.options??{};if(!Ar(l))throw new TypeError("options must be a plain object");let p=zc(i.strategy,d,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Di(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:di(eu(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ui({storePath:r.storePath??tu(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await Bi(a.strategy,n,r,o);return Sr(he(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=he(n.strategy),s=gi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ui({storePath:r.storePath??tu(),clock:()=>o}).get(n.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??$y(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Jc(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Ty,nu=v(()=>{ln();At();pi();Fc();Vc();Zc();bi();Ty=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var yu={};M(yu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>lu,DEFAULT_SAME_CHAIN_SOURCES:()=>uu,NATIVE_TOKEN:()=>Mi,canonicalJson:()=>pu,hashFirmQuote:()=>hu,hashRfqIntent:()=>mu,normalizeFirmQuote:()=>Hi,normalizeRfqIntent:()=>My,sha256Hex:()=>vr});import{createHash as qy}from"node:crypto";import{getAddress as cu,isAddress as ji}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function iu(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function bn(e,t){let r=String(e??"").trim();return(!Uy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function By(e,t){return e==null||e===""?null:bn(e,t)}function su(e,t){let r=String(e??"").trim();return r.toLowerCase()===Mi.toLowerCase()?Mi:(ji(r)||re(t,"must be an EVM address or native token sentinel"),cu(r))}function du(e,t){let r=String(e??"").trim();return ji(r)||re(t,"must be an EVM address"),cu(r)}function Fy(e,t){return e==null||e===""?null:du(e,t)}function au(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function Dy(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function zt(e){if(Array.isArray(e))return e.map(zt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=zt(e[r]));return t}return e}function pu(e){return JSON.stringify(zt(e))}function vr(e){return`0x${qy("sha256").update(pu(e)).digest("hex")}`}function fu(e,t){let r={...e};for(let n of t)delete r[n];return r}function mu(e){return vr(fu(e,["intentHash"]))}function hu(e){return vr(fu(e,["firmQuoteHash"]))}function My(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=iu(e.fromChainId??e.fromChain,"fromChainId"),i=iu(e.toChainId??e.toChain,"toChainId"),a=o===i?uu:lu,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:su(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:su(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:bn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:du(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Dy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:By(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:au(e.allowedSources,"allowedSources",a),allowedRouters:au(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?zt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):vr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=mu(c),Object.freeze(c)}function jy(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!ou.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ou.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!ji(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),zt(e)}function Hi(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=bn(t.amountOut??t.buyAmount,"amountOut"),a=bn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=jy(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let d=Fy(t.router??t.settlementRouter??c.to,"router"),l={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:d,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(u),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?zt(t.metadata):{}};return l.quoteId||(l.quoteId=vr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=hu(l),Object.freeze(l)}var Mi,uu,lu,ou,Uy,zi=v(()=>{Mi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",uu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),lu=Object.freeze(["lifi"]),ou=/^0x[0-9a-fA-F]{64}$/,Uy=/^\d+$/});import{readFileSync as Hy}from"node:fs";import{homedir as zy}from"node:os";import{join as wn}from"node:path";function Vy(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=zy();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||wn(t,".config","oracle")).trim();return[e,wn(r,"exec.env")].filter(Boolean)}return[e,wn(t,".config","oracle","exec.env"),wn(t,".config","mad-desk","exec.env")].filter(Boolean)}function gu(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Vy())try{let i=Hy(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var bu=v(()=>{});var wu=v(()=>{});import{createHash as Wy,createHmac as Eu,timingSafeEqual as Gy}from"node:crypto";function xn(e){return Array.isArray(e)?`[${e.map(xn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Su(e,{required:t=!1}={}){try{return gu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Wi(e){let{signature:t,...r}=e;return r}function ku(e,{secret:t}={}){let r=Su(t);return r?{...e,signature:Eu("sha256",r).update(xn(Wi(e))).digest("hex")}:e}function Ky(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return Wy("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ke(e,{chainId:t,venue:r,data:n,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Su(o);if(i){let f=Eu("sha256",i).update(xn(Wi(e))).digest("hex");if(!Xy(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>tt||!Number.isInteger(a)||a<0||a>tt||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let d=c*BigInt(1e4-s),l=d/10000n;if(d%10000n!==0n&&(l+=1n),u<l)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=Qy(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return ku({...Wi(e),calldataHash:Ky(n)},{secret:o})}function Xy(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:Gy(r,n)}function Vi(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Yy(e){let t=e==null?tt:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,tt)}function rt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=Vi(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(Vi(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Vi(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),d=Yy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,d),capBps:d,executable:u<=d}}function Gi({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=xu,secret:d}={}){let l=BigInt(r??0);if(l<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=rt({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||xu)),g=l*BigInt(1e4-p.selectedBps),h=g/10000n;if(g%10000n!==0n&&(h+=1n),h>l&&(h=l),l>0n&&h<=0n)throw new Error(`auto-slippage: quote ${l} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let w=Number((l-h)*10000n/(l===0n?1n:l));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ku({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:l.toString(),minAmountOut:h.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:d})}function Qy(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let d=Gi({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:d,amountOutMinimum:d.minAmountOut}}var tt,xu,Re=v(()=>{bu();wu();tt=100,xu=2e4});function Ki(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:pt}var pt,En=v(()=>{pt="0x000000000000000000000000000000000000dEaD"});import{Contract as Jy,JsonRpcProvider as Zy}from"ethers";function ig(e){return og.test(String(e||""))}async function Au(e,{contract:t=eg,rpc:r=rg,chainId:n=tg,balanceOf:o}={}){if(!ig(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Zy(r,n,{staticNetwork:!0}),s=new Jy(t,ng,i);return BigInt(await s.balanceOf(e))}var eg,tg,rg,ng,og,vu=v(()=>{eg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",tg=999,rg="https://rpc.hyperliquid.xyz/evm",ng=["function balanceOf(address owner) view returns (uint256)"],og=/^0x[a-fA-F0-9]{40}$/});import{existsSync as sg,readFileSync as ag,lstatSync as cg}from"node:fs";import{homedir as Iu}from"node:os";import{join as Xi}from"node:path";function dg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(_u,t)?_u[t]:lg}function yg(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Ou])return String(e[Ou]);let t=e.ORACLE_CONFIG_DIR||Xi(Iu(),".config","oracle");return Xi(t,"fee-recipient")}return Xi(Iu(),".config","oracle","fee-recipient")}function gg(e=process.env){try{let t=yg(e);if(!sg(t)||cg(t).isSymbolicLink())return"";let r=ag(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function bg(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),ug)}function wg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[fg]||"").trim(),o=String(e[mg]||hg).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=dg(t),s=bg(e[pg],{fallback:n?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=gg(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function Sn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=wg({env:t,action:r,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Au(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Cu(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function Tu(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Nu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var ug,lg,_u,pg,fg,mg,Ou,hg,kn=v(()=>{vu();ug=100,lg=5,_u=Object.freeze({swap:5,bridge:5,perps:0,nft:0});pg="ORACLE_INTEGRATOR_FEE_BPS",fg="ORACLE_INTEGRATOR_FEE_RECIPIENT",mg="ORACLE_INTEGRATOR_ID",Ou="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",hg="oracle"});var Ji={};M(Ji,{LIFI_API:()=>Pu,lifiChains:()=>Ag,lifiHealth:()=>Sg,lifiPrepare:()=>kg,lifiQuote:()=>It});function Qi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Pu).replace(/\/$/,"")}function Eg(e){let t=String(e||Yi).toLowerCase();return t===Yi.toLowerCase()||t===xg}function Ru(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function Sg(e={}){let t=await N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function It(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=Yi,toToken:i,fromAmount:s,fromAddress:a=pt}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let d=await Sn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Tu(d)))c.set(h,w);let l=await N(`${Qi(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=l?.estimate?.toAmount||l?.toAmount;if(!p)return{...l,autoSlippagePolicy:u,oracleFee:d};let f=l?.transactionRequest?.to||l?.estimate?.approvalAddress||"lifi",m=ae(l,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),g=l?.estimate?.toAmountMin||l?.toAmountMin;if(g!=null&&BigInt(g)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:d}}async function kg(e={},t={}){let r=await It(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Eg(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:Ru(a,"approval token"),spender:Ru(s,"approval spender"),amount:String(e.fromAmount)}}return J({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Ag(e={}){return N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Pu,Yi,xg,Ir=v(()=>{W();Re();En();ge();kn();Pu="https://li.quest/v1";Yi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",xg="0x0000000000000000000000000000000000000000"});var qu={};M(qu,{PARASWAP_API:()=>$u,paraswapHealth:()=>Ig,paraswapPrepare:()=>vg,paraswapPrice:()=>Wt,paraswapTokens:()=>Lu});function Vt(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Lu(e={},t={}){let r=Number(e.chainId||1);return N(`${Zi(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await Sn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Nu(o)))n.set(a,c);let i=await N(`${Zi(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function vg(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=Vt(e.userAddress,"userAddress"),o=await Wt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Vt(e.receiver,"receiver"));let c=await N(`${Zi(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return J({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:ke(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Ig(e={}){let t=await Lu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var $u,Zi,An=v(()=>{W();Re();ge();kn();$u="https://api.paraswap.io",Zi=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||$u).replace(/\/$/,"")});function vn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Bu(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Bu(t),...r]).has(c)){let d=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!d?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Uu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Uu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Bu(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function In(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var Uu,es=v(()=>{Uu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var zu={};M(zu,{ZEROX_API:()=>Fu,zeroxHealth:()=>_g,zeroxPrepare:()=>Og,zeroxPrice:()=>Hu,zeroxQuote:()=>Gt});function Du(e={}){return vn({provider:"zerox",defaultUrl:Fu,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Mu(e={}){return Du(e).baseUrl}function _n(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function ju(e={}){return In({"0x-version":"v2",accept:"application/json"},{"0x-api-key":_n(e)},Du(e).trusted)}async function _g(e={}){if(!_n(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Hu({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Hu(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),N(`${Mu(t)}/swap/allowance-holder/price?${a}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await N(`${Mu(t)}/swap/allowance-holder/quote?${c}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.buyAmount||u?.grossBuyAmount;return d?ae(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Og(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await Gt(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return J({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Fu,On=v(()=>{W();Re();es();ge();Fu="https://api.0x.org"});var Zv,Vu=v(()=>{Zv=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Cn from"node:fs";import Cg from"node:os";import Xt from"node:path";import{fileURLToPath as Tg}from"node:url";function Wu(){return process.env.ORACLE_FAKE_HOME||Cg.homedir()}function Rg(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Tn(){return Rg()?process.env.ORACLE_CONFIG_DIR||Xt.join(Wu(),".config","oracle"):Xt.join(Wu(),".config","oracle")}function Pg(){return Xt.join(Tn(),"desk.json")}function $g(){return Xt.join(Tn(),"env")}function Kt({force:e=!1}={}){if(Kt._done&&!e)return Kt._result||null;Kt._done=!0;let t={},r=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=$g();if(Cn.existsSync(o))for(let i of Cn.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let o=Pg();if(Cn.existsSync(o)){let i=JSON.parse(Cn.readFileSync(o,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),Kt._result=Object.keys(t).length?t:null,Kt._result}var Ng,iI,Gu=v(()=>{Ng=Xt.dirname(Tg(import.meta.url)),iI=Xt.resolve(Ng,"../..");try{Kt()}catch{}});var Yu={};M(Yu,{armPreparedAction:()=>jg,callSigner:()=>Ku,queueOwnerAction:()=>Xu});import{existsSync as Lg,readFileSync as qg}from"node:fs";import{request as Ug}from"node:http";import Bg from"node:path";function Dg(e=process.env){let t=String(e.ORACLE_SIGNER_URL||Fg).replace(/\/$/,""),r;try{r=new URL(t)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function Mg(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Bg.join(Tn(),"signer","signer-token");return Lg(t)?qg(t,"utf8").trim():null}function Ku(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=Dg(n),s=Mg(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=r?Buffer.from(JSON.stringify(r)):null,d=Ug({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...u?{"content-type":"application/json","content-length":u.length}:{}}},l=>{let p=[];l.on("data",f=>p.push(f)),l.on("end",()=>{let f=Buffer.concat(p).toString("utf8"),m={};try{m=f?JSON.parse(f):{}}catch{m={error:"signer refused"}}a({httpStatus:l.statusCode,...m})})});d.on("timeout",()=>{d.destroy(),a({ok:!1,error:"local signer timed out"})}),d.on("error",()=>a({ok:!1,error:"local signer is not running"})),u&&d.write(u),d.end()})}async function Xu(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Ku("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function jg(e,t=process.env){let r=e?.localSignerEnvelope||e?.envelope;if(!r||r.version!==1||!r.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Xu(r,t)}var Fg,Qu=v(()=>{Gu();Fg="http://127.0.0.1:9462"});var sl={};M(sl,{COW_CANCEL_TYPES:()=>tl,COW_HOSTS:()=>Rn,COW_ORDER_TYPES:()=>Nn,COW_SETTLEMENT:()=>Ju,COW_VAULT_RELAYER:()=>Zu,armCowOrder:()=>Xg,buildArmedCowOrder:()=>os,cowCancelOrders:()=>tb,cowChains:()=>ob,cowHealth:()=>Gg,cowOrder:()=>il,cowOrderStatus:()=>ol,cowOrderUid:()=>Yg,cowPrepareCancel:()=>Zg,cowPrepareOrder:()=>Kg,cowQuote:()=>_t,cowSignCancel:()=>eb,cowSignOrder:()=>Qg,cowSubmitSignedOrder:()=>Jg,cowVerifyOrderFill:()=>nb});import{TypedDataEncoder as rs,getAddress as _r,isAddress as Hg}from"ethers";function Pn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Rn[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function zg(e,t="v1",r={}){let n=Pn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function nt(e,t){let r=String(e||"").trim();if(!Hg(r))throw new Error(`cowswap: ${t} must be an address`);return _r(r).toLowerCase()}function Yt(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function rl(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function nl(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Vg({digest:e,owner:t,validTo:r}={}){let n=rl(e,"order digest").slice(2),o=nt(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function ns(e){let t=Ju[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:_r(t)}}function Wg(e={},t,r){let n=nt(e.sellToken,"sellToken"),o=nt(e.buyToken,"buyToken"),i=nt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=rl(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Yt(e.sellAmount,"sellAmount"),buyAmount:Yt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Yt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Gg(e={}){try{let t=await _t({chainId:1,sellToken:ts[1],buyToken:el[1],sellAmountBeforeFee:"1000000000000000",from:pt},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function _t(e={},t={}){let r=Number(e.chainId??1),n=Ki(e.from||e.owner),o=e.sellToken||ts[r],i=e.buyToken||el[r],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ts[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await N(`${Pn(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Kg(e={},t={}){let r=Number(e.chainId??1),n=nt(Ki(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Wg(o?.quote||o,r,n),s=ns(r),a={domain:s,types:Nn,primaryType:"Order",message:i},c=rs.hash(s,Nn,i),u=Zu[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return J({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:_r(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:os({chainId:r,owner:n,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function os(e={},t={}){let r=e.typedData;if(!r?.domain||!r?.types||!r?.message)throw new Error("cowswap: typedData required to arm");let n=Number(e.chainId??r.domain.chainId),o=Rn[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=nt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=rs.hash(r.domain,r.types,r.message);return Object.freeze({tradeId:`cow:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:n,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:n,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:r.domain,types:r.types,message:r.message,typedData:r})})}async function Xg(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Qu(),Yu)),n=e.localSignerEnvelope||os(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function ol(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${Pn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function il(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${Pn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Yg(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||rs.hash(ns(r),Nn,n),i=e.owner||e.from||e.signer||n.receiver;return Vg({digest:o,owner:i,validTo:n.validTo})}async function Qg(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function Jg(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function Zg(e={}){let t=Number(e.chainId??1),r=nt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>nl(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=ns(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:tl,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function eb(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function tb(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function rb(e={}){return Yt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function nb(e={},t={}){let r=Number(e.chainId??1),n=nl(e.uid||e.orderUid),o=t.order||await il({chainId:r,uid:n},t),i=t.status||o.status||await ol({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${zg(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?nt(e.expectedOwner,"expectedOwner"):null;if(c&&nt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(rb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Yt(o.executedBuyAmount,"executedBuyAmount")));let d=e.minBuyAmount!=null?BigInt(Yt(e.minBuyAmount,"minBuyAmount")):0n,l=u>=d&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:l,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:l?null:"insufficient fill or expired order"}}function ob(){return Object.keys(Rn).map(Number)}var Rn,Ju,Zu,ts,el,Nn,tl,$n=v(()=>{W();Re();Vu();En();ge();Rn={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Ju=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zu=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ts={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},el={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Nn=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),tl=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var cl={};M(cl,{CHAINS:()=>Ln,chainById:()=>ss,isSupportedChain:()=>al,registerChain:()=>ib,rpcUrlFor:()=>as});function ss(e){return is.get(Number(e))||null}function ib({key:e,chainId:t,name:r,rpcEnv:n=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:r||e,rpcEnv:n,evm:!0};return Ln[e]=o,is.set(o.chainId,o),o}function as(e,t=process.env){let r=ss(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function al(e){return is.has(Number(e))}var Ln,is,cs=v(()=>{Ln={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},is=new Map(Object.values(Ln).map(e=>[e.chainId,e]))});import{Interface as sb,getAddress as ab}from"ethers";function Or(e,t){try{return ab(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ub(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=as(e,r);return n||cb[Number(e)]||null}function db(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!lb.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function Y(e,t,r=[],n={}){let o=String(t||"");db(o);let i=ub(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function Un(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ul(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function ll(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function dl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.owner,"owner"),i=Or(e.spender,"spender"),s=qn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=qn.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function pl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.account||e.owner||e.address,"account"),i=qn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=qn.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var qn,cb,lb,ot=v(()=>{W();cs();qn=new sb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);cb={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};lb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function fl(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Bn(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let d=fl(o,c),l=String(d.address||"").toLowerCase(),p=String(d.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,g=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(l)||pb.has(p)?h=300:s&&l===s&&(h=100),g.includes("v4")?h+=20:g.includes("v3")?h+=10:(g.includes("v2")||g.includes("raydium")||g.includes("orca")||g.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:l,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function ml(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&fl(e,r[0]).address||null}var pb,us=v(()=>{pb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function yb(e,t,r){let n=Pe(t),o=Pe(r),i=Pe(e?.baseToken?.address),s=Pe(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function gb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function bb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||fb).replace(/\/$/,"")}async function Fn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${bb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hl({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=Pe(mb[Number(e)]||e),s=new Set(hb(n).filter(Boolean).map(Pe)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Fn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,d=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${Pe(f?.chainId)}:${Pe(f?.dexId)}:${Pe(f?.pairAddress)}`;u.has(m)||(u.add(m),d.push(f))}return d.filter(p=>Pe(p?.chainId)===i).filter(p=>yb(p,t,r)).filter(p=>!s.size||s.has(Pe(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:gb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function yl(e,{chainSlug:t="solana",stables:r=wb}={},n={}){let o=await Fn(e,n),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Bn(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var fb,mb,Pe,hb,wb,Tr=v(()=>{W();us();fb="https://api.dexscreener.com",mb=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Pe=e=>String(e??"").toLowerCase(),hb=e=>Array.isArray(e)?e:e==null?[]:[e];wb=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var vl={};M(vl,{PANCAKE_FEE_TIERS:()=>Dn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>xl,UNI_V3_VENUES:()=>kl,uniV3Chains:()=>Ib,uniV3EthUsdc:()=>Al,uniV3Health:()=>vb,uniV3PrepareExactIn:()=>Ab,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>kb});import{Interface as bl,getAddress as Nr,isAddress as wl}from"ethers";function ds(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=kl[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ls(e,t){let r=be[Number(t)];if(!e||e===El||e===Sl||/^eth$/i.test(String(e)))return Nr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Nr(r.weth);if(/^usdc$/i.test(n))return Nr(r.usdc);if(!wl(n))throw new Error(`invalid token address: ${e}`);return Nr(n)}function Eb(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function Sb(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function Ot(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=ds(e.chainId??8453,e.venue),s=ls(e.tokenIn||"WETH",r),a=ls(e.tokenOut||be[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:xl,d=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],l=[],p=null;for(let A of d){let b=Mn.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let y=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!y||y==="0x"){l.push({fee:A,ok:!1,error:"empty result"});continue}let k=Mn.decodeFunctionResult("quoteExactInputSingle",y),S={fee:A,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};l.push(S),(!p||BigInt(S.amountOut)>BigInt(p.amountOut))&&(p=S)}catch(y){l.push({fee:A,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let A=l.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${A}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:Eb(e.venue)},t).catch(()=>[]):[],m={};for(let A of f.slice(0,8))if(!(!A.pairAddress||!wl(A.pairAddress)))try{let b=await Y(r,"eth_call",[{to:A.pairAddress,data:xb},"latest"],t),y=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(y)||y<=0||y>1e6)continue;(m[y]==null||A.liquidityUsd>m[y].liquidityUsd)&&(m[y]=A)}catch{}let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),h=null;if(e.fee==null&&g>0&&BigInt(p.amountOut)>0n){let A=BigInt(p.amountOut),y=l.filter(k=>k.ok&&Number((A-BigInt(k.amountOut))*10000n/A)<=g).filter(k=>m[k.fee]?.liquidityUsd!=null).sort((k,S)=>m[S.fee].liquidityUsd-m[k.fee].liquidityUsd)[0];y&&y.fee!==p.fee&&(h={priceBestFee:p.fee,chosenFee:y.fee,chosenPoolUsd:m[y.fee].liquidityUsd,bandBps:g},p=y)}let w=m[p.fee]??null,E=f[0]??null,_=w??E,x=e.liquidityUsd??w?.liquidityUsd??E?.liquidityUsd??null,O=e.liquidityUsd!=null?"caller":w?"pool":E?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:_,liquidityAttribution:O,liquidityPick:h,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:l,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function kb(e={},t={}){let{chainId:r,quoter:n,router:o}=ds(e.chainId??8453),i=(e.tokens||[]).map(p=>ls(p,r)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Sb(i,s),u=Mn.encodeFunctionData("quoteExactInput",[c,a]),d=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),l=Mn.decodeFunctionResult("quoteExactInput",d);return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:l[0].toString(),gasEstimate:l[3].toString()},{chainId:r,venue:o,amountOut:l[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Al(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Ot({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Ab(e={},t={}){let r=Number(e.chainId??8453),n=ds(r,e.venue),o=Nr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===El||i===Sl||/^eth$/i.test(i),a=await Ot(e,t),c=gl.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),l=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=gl.encodeFunctionData("multicall",[l,[c]]);return J({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:l,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:ke(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function vb(e={}){let t=Number(e.chainId??8453);try{let r=await Al({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function Ib(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,xl,xb,Mn,gl,El,Sl,Dn,kl,jn=v(()=>{ot();Tr();Re();ge();be={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},xl=[100,500,3e3,1e4],xb="0xddca3f43",Mn=new bl(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),gl=new bl(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),El="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Sl="0x0000000000000000000000000000000000000000",Dn=[100,500,2500,1e4],kl={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Tl={};M(Tl,{executeRfqCandidates:()=>Ol,rankRfqQuotes:()=>Cl,requestRfqQuotes:()=>Cb,sourceCandidates:()=>_l});function Rr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Il(e,t){return String(e?.[t]??"").trim()}function Pr(e,t){return Object.freeze({source:e,run:t})}function _l(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Rr(e,"lifi")&&s.push(Pr("lifi",async()=>{let c=await(n.lifiQuote??It)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),u=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:u?.toAmount??c?.toAmount,minBuyAmount:u?.toAmountMin??c?.toAmountMin??u?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await _b(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Rr(e,"paraswap")&&s.push(Pr("paraswap",async()=>{let c=await(n.paraswapPrice??Wt)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),Rr(e,"0x")&&(Il(r,"ZEROX_API_KEY")||Il(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Pr("0x",async()=>{let c=await(n.zeroxQuote??Gt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Rr(e,"cow")&&s.push(Pr("cow",async()=>{let c=await(n.cowQuote??_t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Rr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Pr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??Ot)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function _b(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Ob(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Ol(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Ob(a,n))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(Hi(e,{...u.value,source:c.source},r))}catch(d){s.push({source:c.source,error:String(d?.message||d)})}}return{quotes:i,failed:s}}function Cl(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Cb(e,t={}){let r=_l(e,t),{quotes:n,failed:o}=await Ol(e,r,t),i=Cl(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Nl=v(()=>{Ir();An();On();$n();jn();zi()});function Rl(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Tb.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||r.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))Qt.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Pl(e){let{ok:t,errors:r,warnings:n}=Rl(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
2
|
+
var Mm=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var M=(e,t)=>{for(var r in t)Mm(e,r,{get:t[r],enumerable:!0})};import{homedir as Go}from"node:os";import{join as Ko}from"node:path";function Xo(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function nn(e,t,r=!1){return String(Xo(e,t,r?"1":"")).trim()==="1"}var qa,jm,ov,on=v(()=>{qa=process.env.ORACLE_PUBLIC_DESKTOP==="1",jm=qa?process.env.ORACLE_CONFIG_DIR||Ko(Go(),".config","oracle"):Ko(Go(),".config","oracle"),ov=qa?jm:Ko(Go(),".config","mad-desk")});function dh(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function ph(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function wt(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||th))return r;let n=t.fileRead?ph:dh;r=r.replace(oh,"[REDACTED_PRIVATE_KEY]"),r=r.replace(nh,"[REDACTED_EVM_KEY]"),r=r.replace(ih,o=>n(o));for(let o of rh)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(sh,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(ah,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(ch,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function Ma(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}(t.username||t.password)&&(t.username="",t.password="");let r=[...t.searchParams.keys()];for(let n of r){let o=String(n).replace(/[^a-z0-9]/gi,"").toLowerCase();lh.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var eh,th,rh,nh,oh,ih,sh,ah,ch,uh,lh,Qo=v(()=>{eh=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),th=["1","true","yes","on"].includes(eh),rh=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],nh=/\b0x[a-fA-F0-9]{64}\b/g,oh=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,ih=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,sh=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,ah=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,ch=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,uh=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),lh=new Set([...uh].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import xt from"node:net";import hh from"node:dns";function cn(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=l=>{if(!l)return[];let d=l.split(":"),p=d.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;d.splice(d.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return d.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:d.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(l=>[l>>8,l&255]))}function Jo(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Zo(e){if(xt.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(xt.isIPv6(e)){let t=cn(e);if(!t)return!1;let r=cn("::ffff:0:0");return Jo(t,r,96)?Zo([...t.slice(12)].join(".")):Jo(t,cn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Jo(t,cn(o),i)):!1}return!1}function gh(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(yh.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xt.isIP(r);return n!==0&&!Zo(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function ei(e,{lookupFn:t=hh.promises.lookup}={}){let r=gh(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:xt.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Zo(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function ti({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let d=await t();r=d.Agent,n=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(xt.isIPv6(p.address)?6:4)})),a=(d,p,f)=>{i.set(o(d),s(typeof p=="string"?[{address:p,family:f}]:p))},c=d=>{let p=o(d);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 ${d} during pinned fetch`);return f},u=new r({connect:{lookup(d,p,f){let m;try{m=c(d)}catch(g){return f(g)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),l=bh((d,p={})=>n(d,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:l,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function bh(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[ri]=Object.freeze({pin:t}),e}function ni(e){return typeof e=="function"&&typeof e[ri]?.pin=="function"}function Ha(e,t,r){if(!ni(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ri].pin(t,r)}var yh,ri,za=v(()=>{yh=new Set(["localhost","metadata.google.internal","metadata.goog"]);ri=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as wh}from"node:crypto";function Ah(e){let t=String(e||"").toLowerCase();return Ya.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function vh(e){let t={};for(let[r,n]of Object.entries(e||{}))Ah(r)||(t[r]=n);return t}function Ih(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function _h(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Oh(e,t,r,n={}){let o={};for(let[l,d]of Object.entries(r||{}))o[l.toLowerCase()]=d;let i=Object.keys(o).filter(l=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(l)),a=[...new Set([...Ya,...i])].sort().map(l=>`${l}=${o[l]??""}`).join(`
|
|
3
|
+
`),c=wh("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Ch(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Wa):Math.min(250*2**e,Wa)+Math.floor(Math.random()*100)}function mr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ii(e,t,r){return mr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function hr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Nh(e){return e?e.byteLength??e.length??0:0}async function Ka(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(hr(e),!n))throw ii(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!n)throw ii(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+=Nh(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 ii(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Xa(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Rh(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d,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,x=t,S=s?{lookupFn:s}:{};if(c&&!a&&!ni(x))throw mr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let O=async(w,{status:_=null}={})=>{let k=await ei(w,S);if(!k.ok)throw mr(_==null?`HTTP refused ${w}: ${k.error}`:`HTTP redirect to ${w} ${k.error}`,_==null?{}:{status:_});let b=new URL(w).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await ti({requireUndici:!0,...l?{importUndici:l}:{}})}catch(y){throw mr(_==null?`HTTP refused ${w}: ${y?.message||y}`:`HTTP redirect to ${w} refused: ${y?.message||y}`,_==null?{}:{status:_})}h.pin(b,k.addresses),x=h.fetch}else Ha(x,b,k.addresses);return k};try{let w=String(e),_={...n||{}};c&&await O(w);for(let k=0;k<=Ga;k+=1){let b=await x(w,{method:r,headers:_,body:o,signal:g,redirect:"manual"});if(Eh.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let $=await Ka(b,u??kh,{url:w,truncate:!0}),q=new Error(`HTTP ${b.status} ${r} ${w} redirected non-idempotent request`);throw q.status=b.status,q.body=Xa($)??$.slice(0,300),q}if(k===Ga)throw hr(b),new Error(`HTTP redirect loop for ${e}`);let E=b.headers?.get?.("location"),R;try{R=Ih(E,w)}catch($){throw hr(b),$}let I=!_h(R,w);if(hr(b),I&&(_=vh(_)),c)await O(R,{status:b.status});else if(I){let $=await ei(R,S);if(!$.ok){let q=new Error(`HTTP redirect from ${w} ${$.error}`);throw q.status=b.status,q.retryable=!1,q}a&&$.addresses?.length&&(h||(h=await ti(l?{importUndici:l}:{})),h&&(h.pin(new URL(R).hostname,$.addresses),x=h.fetch))}w=R;continue}if(typeof d=="function")try{await d(b,{url:w})}catch(E){throw hr(b),mr(E?.message||String(E))}let y=await Ka(b,u,{url:w,onOversize:()=>f.abort()}),A=Xa(y);if(!b.ok){let E=new Error(`HTTP ${b.status} ${r} ${w}`);throw E.status=b.status,E.retryAfter=b.headers?.get?.("retry-after")??null,E.body=A??y.slice(0,300),E}return A??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):Sh,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=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 _;for(let k=0;k<=a;k++){f?.throwIfAborted?.();try{return await Rh(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:g,importUndici:d,validateResponse:p,signal:f})}catch(b){_=b;let y=b?.status,A=b?.name==="AbortError"||b?.name==="TimeoutError"||f?.aborted,E=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?E.has(y)||xh.has(y)&&Va.has(o):!A&&Va.has(o);if(k===a||!R)throw b;let I=Ch(k,b?.retryAfter);f?await new Promise(($,q)=>{let j=setTimeout($,I);f.addEventListener("abort",()=>{clearTimeout(j),q(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Th(I)}}throw _};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let S=Oh(o,e,i,{untrustedUrl:l,maxResponseBytes:g}),O=oi.get(S);if(O)return O;let w=h().finally(()=>oi.delete(S));return oi.set(S,w),w}async function un(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var xh,Va,Sh,Wa,Ya,Eh,Ga,kh,oi,Th,W=v(()=>{za();xh=new Set([408,425,429,500,502,503,504]),Va=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Sh=2,Wa=4e3,Ya=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Eh=new Set([301,302,303,307,308]),Ga=3,kh=64*1024;oi=new Map;Th=e=>new Promise(t=>setTimeout(t,e))});function Lh({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?Ph:$h}async function si(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Lh(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Qa(e={}){return si({type:"meta"},e)}async function Ja({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return si(i,o)}async function Za({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return si({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var $h,Ph,ai=v(()=>{W();$h="https://api.hyperliquid.xyz/info",Ph="https://api.hyperliquid-testnet.xyz/info"});import{createHash as qh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){return typeof e=="number"&&Number.isFinite(e)}function li(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)li(t);return Object.freeze(e)}for(let t of Object.keys(e))li(e[t]);return Object.freeze(e)}function 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 ci(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function ec(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Bh(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Fh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Dh(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function rc(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Uh.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Ve(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Ve(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ve(e.train)||!Ve(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return 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 nc(e){return qh("sha256").update(JSON.stringify(rc(e)),"utf8").digest("hex")}function Ne(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function ui(e,t){if(!Ve(e)||!Ve(e.metrics))throw new Error(`${t} metrics required`);let r=Ne(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!qt(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function Mh(e,{maxDailyLossPct:t}={}){let r=e.split,n=Ne(r.trainStartIndex,"split.trainStartIndex"),o=Ne(r.trainEndIndex,"split.trainEndIndex"),i=Ne(r.trainBarCount,"split.trainBarCount",1),s=Ne(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Ne(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Ne(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!qt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");ui(e.train,"train");let u=ui(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(qt(t)&&u.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let 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 g=0;g<d.length;g++){let h=d[g];if(!Ve(h)||h.index!==g||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let x=Ne(h.trainStartIndex,`walkForward.windows[${g}].trainStartIndex`),S=Ne(h.trainEndIndex,`walkForward.windows[${g}].trainEndIndex`),O=Ne(h.evalStartIndex,`walkForward.windows[${g}].evalStartIndex`),w=Ne(h.evalEndIndex,`walkForward.windows[${g}].evalEndIndex`);if(x!==0||S>=O||O>w||O<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=w,h.passed){if(p+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let _=ui({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${g}]`);if(_.tradeCount<1||_.netPnlUsd<=0||_.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(qt(t)&&_.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/d.length;if(!qt(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 oc(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let r=rc(e),n=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=nc(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Mh(e,t),e}function di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ve(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ve(r))throw new TypeError("backtestOptions must be a plain object");if(!qt(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=me(e),c=Ut(a),u=yr(t),l=t.length,d=(B=[],H={})=>tc({status:"fail",strategy:a,sHash:c,barsHash:u,split:H.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:H.train||null,holdout:H.holdout||null,walkForward:H.walkForward||{windows:[],passRate:0},flags:[...s,...B]});if(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 g=t.slice(0,p),h=t.slice(f),x,S;try{x=ut(a,g,r),S=ut(a,h,r)}catch(B){return d([{type:"backtest_error",message:String(B.message||B)}])}let O={metrics:ci(x),costs:ec(x),tradeCount:x.metrics.tradeCount},w={metrics:ci(S),costs:ec(S),tradeCount:S.metrics.tradeCount},_={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},k=[],b=Math.floor(l/(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(l,ie+b);if(K-ie<3||H<3){k.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let je=t.slice(ie,K),en;try{en=ut(a,je,r)}catch{k.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let tn=ci(en),rn=Dh(tn,a.risk,i);k.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:rn,reason:rn?"pass":"fail_metrics",metrics:tn})}let y=k.filter(B=>B.passed).length,A=k.length===0?0:y/k.length,E={windows:k,passRate:A,windowsRun:k.length};w.metrics.tradeCount===0&&O.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),w.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),w.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),O.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<0&&O.metrics.netPnlUsd>Math.abs(w.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):O.metrics.netPnlUsd>0&&w.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<O.metrics.netPnlUsd*.1&&O.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=Bh(w.costs),I=Fh(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)),q=s.some(B=>B.type==="overfit"),j="fail";return w.metrics.tradeCount>=i&&w.metrics.netPnlUsd>0&&w.metrics.profitFactor>1&&w.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&A>=.6&&!(I>0&&R>I)&&!q&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?j="pass_live_eligible":!$&&w.metrics.tradeCount>0&&O.metrics.tradeCount>0&&Number.isFinite(w.metrics.netPnlUsd)?(j="pass_paper_only",w.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&w.metrics.tradeCount>0&&O.metrics.netPnlUsd>0?j="fail":w.metrics.tradeCount>0&&O.metrics.tradeCount>0&&!$?j="pass_paper_only":j="fail",w.metrics.netPnlUsd<0&&(j=j==="pass_live_eligible"?"fail":j==="pass_paper_only"?"pass_paper_only":"fail",j="fail"),tc({status:j,strategy:a,sHash:c,barsHash:u,split:_,train:O,holdout:w,walkForward:E,flags:s})}function tc({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:kt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=nc(u),li(St(JSON.parse(JSON.stringify(u))))}var Uh,pi=v(()=>{At();Et();ln();Uh=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as jh,createHmac as Hh,timingSafeEqual as Iv}from"node:crypto";function fi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${fi(e[r])}`).join(",")}}`}function ic(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function sc(e=process.env){return ic(process.env)||ic(e)}function Gh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Kh(e){let t=Gh(e);return jh("sha256").update(fi(t)).digest("hex")}function Xh(e,t=sc()){return t?Hh("sha256",t).update(String(e)).digest("hex"):""}function J(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+Vh:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>Wh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:zh},f=Kh(p),m=sc(n),g=m?Xh(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var zh,Vh,Wh,ge=v(()=>{zh=2,Vh=300*1e3,Wh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function gr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qh(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function hi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>hi(r,`${t}[${n}]`));return}if(gr(e))for(let[r,n]of Object.entries(e)){let o=Qh(r);if(Yh.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);hi(n,`${t}.${r}`)}}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function ac({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(hi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!gr(e))throw new Error("handoff: strategy required");if(!gr(t))throw new Error("handoff: evidence required");if(!gr(r))throw new Error("handoff: shadow required");if(!gr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=me(e,{nowMs:o}),a=he(s);if(oc(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!mi(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!mi(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!mi(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let 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:br,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:l},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Yh,cc=v(()=>{At();pi();Et();ge();Yh=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Bt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Ft(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function wr(e){if(Array.isArray(e))for(let t of e)wr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))wr(t);return Object.freeze(e)}function Zh(e){let t=Jh[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function e0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Ft(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=Ft(Number(o.t),`candles[${n}].t`);if(Ft(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Bt(o.o,`candles[${n}].o`),h:Bt(o.h,`candles[${n}].h`),l:Bt(o.l,`candles[${n}].l`),c:Bt(o.c,`candles[${n}].c`),v:Bt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return wr([...r.values()].sort((n,o)=>n.t-o.t))}function t0(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=Ft(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Bt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function r0({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await Za({coin:e,startTime:i,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let 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 t0(o,r)}function n0(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function uc(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=Zh(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Ft(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):Ft(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Ja({coin:r,interval:n,startTime:a,endTime:i},t),r0({coin:r,startTime:a,endTime:i},t)]),l=e0(c,{endTime:i}),d=wr(n0(l,u,o));return wr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var Jh,lc=v(()=>{ai();Jh=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function s0(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let r of Object.keys(e))i0.has(r)||t.push({path:`market.${r}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!o0.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function a0(e={}){let t=await Qa(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var o0,i0,dc,pc=v(()=>{ai();cc();lc();o0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),i0=new Set(["coin","interval"]);dc=Object.freeze({id:"hyperliquid",validateMarket:s0,fetchBars:uc,listMarkets:a0,prepareIntent(e){return ac(e)}})});function u0(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of c0.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function yi(e){return typeof e!="string"?null:l0.get(e)??null}function gi(e){let t=yi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var c0,fc,l0,Dv,bi=v(()=>{pc();c0=Object.freeze(["id","validateMarket","prepareIntent"]);fc=[dc].map(u0),l0=new Map(fc.map(e=>[e.id,e])),Dv=Object.freeze([...fc])});import{createHash as d0}from"node:crypto";function _e(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function Sc(e){return Number.isInteger(e)&&e>0}function ki(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ki(t);return Object.freeze(e)}for(let t of Object.keys(e))ki(e[t]);return Object.freeze(e)}function Ai(e){if(Array.isArray(e))return e.map(Ai);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ai(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function lt(e,t,r,n){for(let o of Object.keys(e))t.has(o)||C(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function vc(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Ei(e,t,r,n){if(_e(e)){if(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return C(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return C(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!_e(o)||![o.value,o.min,o.max,o.step].every(Sc)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Sc(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function Ec(e,t,r,n){return _e(e)?(lt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(C(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(C(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(C(n,t,"must be a finite number or {param}"),null)}function dn(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function x0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of dn(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function S0(e,t){if(!_e(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>bc)return C(t,"parameters",`too many parameters (max ${bc})`),null;let n={};for(let o of r){if(!kc.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!_e(i)){C(t,s,"must be a plain object");continue}lt(i,hc,s,t);for(let d of hc)d in i||C(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ne(c)||C(t,`${s}.min`,"must be a finite number"),ne(u)||C(t,`${s}.max`,"must be a finite number"),(!ne(l)||l<=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(l)&&l>0&&(vc(a,c,u,l)||C(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 E0(e,t,r,n){let o=`nodes.${t}`;if(!_e(e))return C(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!gc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),lt(e,w0,o,n),null;switch(lt(e,gc[e.type],o,n),(typeof e.id!="string"||!Ac.test(e.id))&&C(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!p0.has(e.field))&&C(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Ec(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!f0.has(e.indicator))&&C(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?C(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Ei(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=Ei(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=Ei(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?g0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be line|signal|histogram"):C(n,`${o}.output`,"required field is missing"),"period"in e&&C(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(n,`${o}.stdDev`,"required field is missing");else{let a=Ec(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?C(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?b0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be upper|middle|lower"):C(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&C(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!m0.has(e.op))&&C(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!h0.has(e.op))&&C(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?C(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&C(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!y0.has(e.direction))&&C(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(n,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function k0(e,t,r){if(!_e(e))return C(t,"risk","must be a plain object"),null;lt(e,yc,"risk",t);for(let p of yc)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!ne(l)||l<=0||l>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function vi(e,t={}){let r=[];if(!_e(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};lt(e,mc,"",r);for(let d of mc)(!(d in e)||e[d]==null)&&C(r,d,"required field is missing");e.version!==wi&&C(r,"version",`must be ${wi}`),(typeof e.id!="string"||!kc.test(e.id))&&C(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>xc)&&C(r,"name",`must be a non-empty string max ${xc}`);let n=yi(e.venue);n||C(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)_e(e.market)||C(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))C(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)C(r,p.path,p.message)}let i=S0(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))C(r,"nodes","must be an array");else if(e.nodes.length>wc)C(r,"nodes",`too many nodes (max ${wc})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=E0(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Ac.test(p.id)&&(a.has(p.id)?C(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 dn(p))a.has(m)||C(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of dn(p)){let g=a.get(m);g&&xi.has(g.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of dn(p)){let g=a.get(m);g&&!xi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}x0(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!_e(e.rules))C(r,"rules","must be a plain object");else{lt(e.rules,Si,"rules",r);for(let d of Si)d in e.rules||C(r,`rules.${d}`,"required field is missing");c={};for(let d of Si){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){C(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){C(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);xi.has(f.type)||C(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=k0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=ki({version:wi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function me(e,t={}){let r=vi(e,t);if(!r.ok)throw new Dt(r.errors);return r.strategy}function A0(e){let t=me(e);return JSON.stringify(Ai(t))}function Ut(e){let t=A0(e);return d0("sha256").update(t,"utf8").digest("hex")}function xr(e,t){if(!_e(e))throw new Dt([{path:"",message:"strategy must be a plain object"}]);if(!_e(t))throw new Dt([{path:"overrides",message:"must be a plain object"}]);let r=me(e),n={};for(let[i,s]of Object.entries(r.parameters))n[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,i)){C(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ne(s)){C(o,i,"override must be a finite number");continue}if(!vc(s,a.min,a.max,a.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Dt(o);return me({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var wi,kc,Ac,p0,f0,m0,h0,y0,g0,b0,xi,mc,hc,Si,yc,w0,gc,bc,wc,xc,Dt,Et=v(()=>{bi();wi=1,kc=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ac=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,p0=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),f0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),m0=new Set(["gt","gte","lt","lte","eq"]),h0=new Set(["and","or","not"]),y0=new Set(["above","below"]),g0=new Set(["line","signal","histogram"]),b0=new Set(["upper","middle","lower"]),xi=new Set(["compare","logic","cross"]),mc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),hc=new Set(["value","min","max","step"]),Si=new Set(["entryLong","entryShort","exitLong","exitShort"]),yc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),w0=new Set(["id","type"]),gc={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},bc=16,wc=128,xc=100,Dt=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function Sr(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function dt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function v0(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let o=r[n];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function _c(e,t){Sr(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function pn(e,t){Sr(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Oc(e,t){Sr(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Ic(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,l=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+l)/t,r[a]=Ic(i,s)}return r}function Ic(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Cc(e,t={}){Sr(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(dt(r),dt(n),dt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=pn(e,r),s=pn(e,n),a=new Array(e.length).fill(null);for(let 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 g=0;g<o;g++)d+=a[l[g]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let g=o;g<l.length;g++){let h=l[g];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function Tc(e,t={}){Sr(e);let r=t.period,n=t.stdDev;if(dt(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<r)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let 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 Nc(e,t){v0(e),dt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Rc=v(()=>{});import{createHash as I0}from"node:crypto";var Ii,_0,O0,C0,$c,Pc=v(()=>{Ii=3,_0="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",O0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",C0="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",$c=I0("sha256").update(JSON.stringify({version:Ii,compilerSourceHash:_0,indicatorsSourceHash:O0,schemaSourceHash:C0})).digest("hex")});function ke(e){return typeof e=="number"&&Number.isFinite(e)}function R0(e){let t=new Map(e.map(a=>[a.id,a])),r=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Mt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function $0(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(!ke(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(!ke(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!==N0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!ke(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!ke(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`)}for(let p of["premium","oiDelta"])if(p in i&&i[p]!=null&&!ke(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!ke(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function vt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=T0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=n[u][c];a[u]=l===void 0?null:l}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 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=Nc(d,c);break}let l=vt(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!ke(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=_c(l,c);else if(s.indicator==="ema")a=pn(l,c);else if(s.indicator==="rsi")a=Oc(l,c);else if(s.indicator==="macd")a=Cc(l,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Tc(l,{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 l=0;l<=o;l++){let d=c[l],p=u[l];if(d==null||p==null||!ke(d)||!ke(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=>vt(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=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 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||!ke(d)||!ke(p)||!ke(f)||!ke(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 he(e,t={}){let r=me(e);t&&Object.keys(t).length&&(r=xr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(R0(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Ut(r);function u(f,m){let g={};for(let x of o){let S=f.get(x);g[x]=S[m]}let h=x=>x!=null&&g[x]===!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 l(f,m){$0(f,m,r.market.interval);let g=new Map;for(let h of o)vt(h,n,i,f,m,g);return g}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,g=l(f,m);return Object.freeze(f.map((h,x)=>Object.freeze(u(g,x))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:br,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var br,kt,T0,N0,At=v(()=>{Et();Rc();Pc();br=Ii,kt=$c,T0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),N0=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as P0}from"node:crypto";function q0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function _i(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)_i(t);return Object.freeze(e)}for(let t of Object.keys(e))_i(e[t]);return Object.freeze(e)}function fn(e){if(Array.isArray(e))return e.map(fn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=fn(e[r]);return t}return e}function Oi(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((r,n)=>Oi(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Oi(n,`${t}.${r}`)}}function qc(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=n;if(!We(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!We(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&&!We(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!We(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!We(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function yr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&qc(e),P0("sha256").update(JSON.stringify(fn(e)),"utf8").digest("hex")}function U0(e){if(e==null&&(e={}),!q0(e))throw new TypeError("options must be a plain object");let t={...L0},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!We(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let o=e[n];if(!We(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!We(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function mn(e){return e/1e4}function B0(e,t,r){let n=mn(r);return t==="long"?e*(1+n):e*(1-n)}function F0(e,t,r){let n=mn(r);return t==="long"?e*(1-n):e*(1+n)}function Lc(e,t,r){let n=Math.abs(e)*mn(t),o=Math.abs(e)*mn(r);return{taker:n,builder:o,total:n+o}}function D0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function M0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function j0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function H0(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function z0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function V0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function W0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Er(e,t){for(let r of e.requiredSeries)if(G0.includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function K0(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 X0(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function ut(e,t,r={}){let n=U0(r);qc(t);let o=yr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(Er(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,g=0,h=0,x=0,S=[],O=[],w=[],_=[],k=[],b=null,y=0,A=null,E=p,R=!1,I=0,$=0,q=[],j=new Array(t.length).fill(0);function X(T){q.push(T)}function B(T){let D=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,D-j[T])}function H(T){if(!b)return p;let D=b.side==="long"?(T-b.entryPrice)*b.qty:(b.entryPrice-T)*b.qty;return p+D}function ie(T,D,P){let ee=P.o,z=D0(p,s);if(!(z>0)||!(ee>0))return;let te=B0(ee,D,u),Q=z/te,se=B(T),ur=te*se;if(Q>se){w.push({kind:"entry",barIndex:T,time:P.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:ur,reason:"volume_participation"});return}j[T]+=Q;let He=Math.abs(te-ee)*Q,Ze=Lc(z,l,d);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,x+=z,b={lifecycleEpoch:++$,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:Q,notionalUsd:z,stop:M0(te,D,s.stopLossPct),take:j0(te,D,s.takeProfitPct),liq:H0(te,D,s.maxLeverage,l+d),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=F0(te,z,u));let se=b.qty,ur=se*Q;if(P!=="liquidation"){let La=B(T),Dm=Q*La;if(se>La)return w.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ur,maxFillNotionalUsd:Dm,reason:"volume_participation",triggerReason:P}),!1;j[T]+=se}let He=Lc(ur,l,d),Ze=P==="liquidation"?0:Math.abs(Q-te)*se,lr,Wo;z==="long"?(lr=(te-b.entryReferencePrice)*se,Wo=(Q-b.entryPrice)*se):(lr=(b.entryReferencePrice-te)*se,Wo=(b.entryPrice-Q)*se),p+=Wo,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,x+=ur;let Fm={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:Q,exitReason:P,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:lr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:lr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return S.push(Fm),P==="liquidation"&&O.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;q.some(Q=>Q.kind==="exit"&&Q.side===D&&Q.fillBar===z&&Q.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:P,epoch:ee})}function en(T){let D=q.filter(P=>P.fillBar===T);for(let P=q.length-1;P>=0;P--)q[P].fillBar===T&&q.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 tn(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 rn(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Ta(T){if(!b)return;let D=t[T],P=b.side,ee=W0(D,P,b.liq),z=z0(D,P,b.stop),te=V0(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!==A&&(A=D,E=H(t[T].o),R=!1),rn(T),en(T),Ta(T),tn(T),!R&&H(t[T].c)<=E*(1-s.maxDailyLossPct/100)&&(R=!0,_.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&&(q.some(se=>se.kind==="exit"&&se.side===b.side&&se.fillBar===ee&&se.epoch===b.lifecycleEpoch)||X({kind:"exit",side:b.side,signalBar:T,fillBar:ee,reason:"rule",epoch:b.lifecycleEpoch}));else{let te=P.entryLong===!0,Q=P.entryShort===!0;te&&Q?_.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)),k.push({barIndex:T,time:t[T].t,equity:z,positionSide:b?b.side:null})}let Na=null;if(b){let T=t.length-1;if(K(T,t[T].c,"end_of_data",!0))k[T]={barIndex:T,time:t[T].t,equity:p,positionSide:null};else{let P=H(t[T].c);Na={side:b.side,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,qty:b.qty,notionalUsd:b.notionalUsd,markPrice:t[T].c,markedEquityUsd:P},_.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ra=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Lm=Ra/n.initialEquityUsd*100,$a=0,jo=0,Ho=0;for(let T of S)T.netPnlUsd>0?($a+=1,jo+=T.netPnlUsd):T.netPnlUsd<0&&(Ho+=-T.netPnlUsd);let zo=S.length,qm=zo===0?0:$a/zo,Vo=0;Ho>0?Vo=jo/Ho:jo>0&&(Vo=1e12);let Um={netPnlUsd:Ra,netPnlPct:Lm,maxDrawdownPct:X0(k),winRate:qm,profitFactor:Vo,tradeCount:zo,sharpe:K0(k),turnoverUsd:x,exposurePct:y/t.length*100},Bm={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Pa={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:br,config:Bm,trades:S,equityCurve:k,metrics:Um,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:O,missedFills:w,openPositionAtEnd:Na,flags:_};return Oi(Pa),_i(fn(Pa))}var L0,G0,ln=v(()=>{At();Et();L0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});G0=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as Y0}from"node:crypto";function oy(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ci(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ci(t);return Object.freeze(e)}for(let t of Object.keys(e))Ci(e[t]);return Object.freeze(e)}function iy(e){return String(e).trim().replace(/\s+/g," ")}function sy(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function ay(e){for(let r of J0)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 cy(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 Q0.has(r)?r:null}function uy(e){let t={...ey},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 ly(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 dy(e){let t=Y0("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 py(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 fy(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 my(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 hy(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:r}}function yy(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?(t[3]==="%"&&(r=r/100),{kind:"premium",op:t[1].toLowerCase(),threshold:r}):null}function gy(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:r}:null}function by(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<-1||r>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:r}}function wy(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?r=r.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?r=r.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?r=r.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?r=r.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Uc(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function xy({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:Uc(a.fast),ema_right_period:Uc(a.slow)},nodes:c,rules:u,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:"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 Ey({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 ky({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"oi",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 vy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Ay[a.kind]},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:u,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bc(e,t={}){if(typeof e!="string")throw new ue("prompt must be a string");if(e.length>1e3)throw new ue("prompt length must be <= 1000");if(!oy(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=ny;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<ty||n>ry)throw new ue("expiresInMs must be between 1h and 30d")}if(Z0.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=iy(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(ly(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=sy(o),s=ay(o),a=cy(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=uy(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,l=dy(o),d=`Draft ${s} ${i}`.slice(0,100),p=py(o),f=fy(o),m=my(o),g=hy(o),h=yy(o),x=gy(o),S=by(o),O=[p,f,m,g,h,x,S].filter(Boolean);if(O.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!wy(o,O[0]))throw new ue(`unsupported or ambiguous prompt. ${jt}`);let w,_=O[0],k={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:_};_.kind==="ema_cross"?w=xy(k):_.kind==="rsi"?w=Sy(k):_.kind==="open_interest"?w=ky(k):_.kind==="funding"?w=Ey(k):w=vy(k);let b=vi(w,{nowMs:r});if(!b.ok)throw new ue(`draft failed validation: ${b.errors.map(y=>y.message).join("; ")}`);return Ci(me(w,{nowMs:r}))}var ue,Q0,J0,Z0,jt,ey,ty,ry,ny,Ay,Fc=v(()=>{Et();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Q0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),J0=new Set(["BTC","ETH","SOL","HYPE"]),Z0=/\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]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",ey=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),ty=36e5,ry=30*864e5,ny=864e5;Ay=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Iy}from"node:crypto";function jc(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function Hc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ni(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ni(t);return Object.freeze(e)}for(let t of Object.keys(e))Ni(e[t]);return Object.freeze(e)}function kr(e){if(Array.isArray(e))return e.map(kr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=kr(e[r]);return t}return e}function hn(e){return JSON.stringify(kr(e))}function _y(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 Oy(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=hn(n),s=hn(o);return i<s?-1:i>s?1:0}),r}function Ti(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=hn(r),a=hn(o);return s<a}function zc(e,t,r={}){if(!Hc(r))throw new TypeError("options must be a plain object");for(let w of Object.keys(r))if(jc(w))throw new TypeError(`options must not include holdout/test/oos key "${w}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let w of Object.keys(r))if(!n.has(w))throw new TypeError(`unknown option "${w}"`);let o=64;if("maxTrials"in r){let w=r.maxTrials;if(!Number.isInteger(w)||w<1||w>Dc)throw new TypeError(`maxTrials must be an integer 1..${Dc}`);o=w}let i=r.objective??"netPnlUsd";if(!Mc.has(i))throw new TypeError(`objective must be one of ${[...Mc].join("|")}`);let s=r.backtestOptions??{};if(!Hc(s))throw new TypeError("backtestOptions must be a plain object");for(let w of Object.keys(s))if(jc(w))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${w}"`);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={},l=1;for(let w of c){let _=_y(a.parameters[w]);if(_.length===0)throw new Error(`parameter "${w}" produces an empty grid`);u[w]=_,l*=_.length}let d=Oy(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,g=null;for(let w of p){let _=xr(a,w),k=ut(_,t,s);g==null&&(g=k.config);let b={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},y={parameters:{...w},metrics:b};f.push(y),(!m||Ti(i,b,w,m.metrics,m.parameters))&&(m=y)}f.sort((w,_)=>Ti(i,w.metrics,w.parameters,_.metrics,_.parameters)?-1:Ti(i,_.metrics,_.parameters,w.metrics,w.parameters)?1:0);let h={...m.parameters},x=xr(a,h),S={strategyHash:Ut(a),compilerHash:kt,trainBarsHash:yr(t),backtestConfig:g,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:x},O={id:Iy("sha256").update(JSON.stringify(kr(S)),"utf8").digest("hex"),...S};return Ni(kr(JSON.parse(JSON.stringify(O))))}var Dc,Mc,Vc=v(()=>{At();Et();ln();Dc=256,Mc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import yn from"node:path";function gn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ty(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ht(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ht(r,`${t}[${n}]`));return}if(gn(e))for(let[r,n]of Object.entries(e)){let o=Ty(r);if(Cy.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function Ny(e){if(typeof e!="string"||!e||!yn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Wc(e){let t;try{t=et.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function Ry(){return{version:$i,runners:[]}}function Gc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!gn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==$i)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Ht(r,yn.basename(t)),{version:$i,runners:r.runners.map(n=>Ge(n))}}function Kc(e,t){Ht(t,"store");let r=yn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=yn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
+
`;try{et.writeFileSync(n,o,{mode:384,flag:"wx"}),et.renameSync(n,e);try{et.chmodSync(e,384)}catch{}}catch(i){try{et.unlinkSync(n)}catch{}throw i}}function Xc(e={}){let t=e.path;if(Ny(t),Wc(t),et.existsSync(t)?Gc(et.readFileSync(t,"utf8"),t):Kc(t,Ry()),Ri.has(t))return Ri.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let g=m.fn();r=!1,m.resolve(g),o()}catch(g){r=!1,m.reject(g),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((g,h)=>{n.push({fn:m,resolve:g,reject:h}),queueMicrotask(o)})}function s(){return Wc(t),Gc(et.readFileSync(t,"utf8"),t)}function a(m){Kc(t,m)}function c(m){if(!gn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Ht(m,"record");let g=s();if(g.runners.some(x=>x.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 l(){return s().runners.map(m=>Ge(m))}function d(m,g){if(typeof g!="function")throw new Error("shadow-store: updater must be a function");let h=s(),x=h.runners.findIndex(w=>w.id===m);if(x<0)throw new Error(`shadow-store: runner not found: ${m}`);let S=Ge(h.runners[x]),O=g(S);if(!gn(O)||O.id!==m)throw new Error("shadow-store: updater must return record with same id");return Ht(O,"record"),h.runners[x]=Ge(O),a(h),Ge(h.runners[x])}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 x=Ge(g.runners[h]);return x.status!=="stopped"&&(x.status="stopped",g.runners[h]=x,a(g)),Ge(g.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,g){return i(()=>d(m,g))},stop(m){return i(()=>p(m))}};return Ri.set(t,f),f}var $i,Cy,Ri,Yc=v(()=>{$i=1,Cy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Ri=new Map});import{createHash as qi}from"node:crypto";function Pi(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Li(e){return Array.isArray(e)?e.map(Li):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Li(e[t])])):e}function Jc(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return qi("sha256").update(JSON.stringify(Li(e))).digest("hex")}function $y(e,t,r,n,o){return qi("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Py(e,t,r,n){return qi("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Ly(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Qc(e){return e==="entryLong"||e==="entryShort"}function Ui({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Xc({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=he(c),d=u==null?null:String(u),p=r.list().filter(x=>x.status==="running"&&x.strategyHash===l.strategyHash&&x.compilerHash===l.compilerHash&&x.evidenceId===d).sort((x,S)=>x.createdAt-S.createdAt||x.id.localeCompare(S.id))[0];if(p)return Pi(p);let f=t(),m=Py(f,l.strategyHash,l.compilerHash,d),g=r.get(m);if(g)return Pi(g);let h={id:m,strategy:Pi(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(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: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=he(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let g=d.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 d;let x=new Map(d.intendedOrders.map(I=>[I.id,I])),S=new Set(d.fills.map(I=>I.orderId)),O=new Map(d.missedFills.map(I=>[I.orderId,I])),w=(I,$)=>`${I}|${$}`,_=new Map(d.markouts.map(I=>[w(I.orderId,I.horizon),I])),k=d.position?{...d.position}:null,b=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,y=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function A({action:I,signalBarT:$,signalIndex:q}){let j=Ly(I),X=$y(d.id,d.strategyHash,$,j,I);if(x.has(X))return x.get(X);let B=q+1,H=B<u.length,ie={id:X,action:I,type:I,side:j,signalBarT:$,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return x.set(X,ie),d.intendedOrders.push(ie),ie}function E(I,$,q){if(S.has(I.id))return;let j={orderId:I.id,action:Qc(I.action)?"entry":"exit",side:I.side,price:$.o,barT:$.t,signalBarT:I.signalBarT,barIndex:q};if(d.fills.push(j),S.add(I.id),I.status="filled",I.fillBarT=$.t,O.has(I.id)&&(O.delete(I.id),d.missedFills=d.missedFills.filter(X=>X.orderId!==I.id)),Qc(I.action)){k={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:$.t,entryPrice:$.o,entryBarIndex:q};for(let X of l){let B=w(I.id,X);if(_.has(B))continue;let H={orderId:I.id,horizon:X,entryBarT:$.t,entryPrice:$.o,side:k.side,status:"pending",close:null,barT:null};_.set(B,H),d.markouts.push(H)}}else k=null,b=Number(d.strategy?.risk?.cooldownBars)||0,y=$.t}function R(I){if(S.has(I.id)||O.has(I.id))return;let $={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};O.set(I.id,$),d.missedFills.push($),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||S.has(I.id))continue;let $=m.get(I.signalBarT);if($==null)continue;let q=$+1;q<u.length&&(g==null||u[q].t>g)&&E(I,u[q],q)}for(let I of h){let $=u[I],q=f[I].signals,j=k,X=H=>{if(k||b>0&&(y==null||$.t>=y))return;let K=A({action:H,signalBarT:$.t,signalIndex:I}),je=I+1;je<u.length?E(K,u[je],je):R(K)},B=H=>{if(!k||k.side==="long"&&H!=="exitLong"||k.side==="short"&&H!=="exitShort")return;let ie=A({action:H,signalBarT:$.t,signalIndex:I}),K=I+1;K<u.length?E(ie,u[K],K):R(ie)};j?(q.exitLong&&B("exitLong"),q.exitShort&&B("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&X("entryLong"),q.entryShort&&X("entryShort")),b>0&&y!=null&&$.t>=y&&(b-=1,b===0&&(y=null)),d.cursor=$.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let $=d.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!$)continue;let q=m.get($.barT);if(q==null)continue;let j=q+I.horizon;if(j<u.length){I.close=u[j].c,I.barT=u[j].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return d.position=k,d.cooldownBarsRemaining=b,d.cooldownStartT=y,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var Zc=v(()=>{At();Yc()});var ru={};M(ru,{runStrategyOperation:()=>Hy});import qy from"node:os";import Uy from"node:path";function Ar(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Fy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Fi(e){if(Array.isArray(e)){for(let t of e)Fi(t);return}if(Ar(e))for(let[t,r]of Object.entries(e)){if(By.some(n=>Fy(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Fi(r)}}function Dy(e){if(!Ar(e))throw new TypeError("strategy input must be a plain object");return Fi(e),e}function My(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function Bi(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=gi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);r.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Di(e,t){let r=e.backtestOptions??{};if(!Ar(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function eu(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Ar(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:Di(e,n)}}function tu(){return Uy.join(qy.homedir(),".oracle","strategy-shadow.json")}function jy(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 Hy(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Dy(t),o=My(n,r);if(e==="draft")return{strategy:Bc(n.prompt,{nowMs:o})};if(e==="validate"){let i=he(n.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Er(i,s);let a=di(eu(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ut(i.strategy,s,Di(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await Bi(i.strategy,n,r,o);Er(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(!Ar(d))throw new TypeError("options must be a plain object");let p=zc(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Di(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:di(eu(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ui({storePath:r.storePath??tu(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await Bi(a.strategy,n,r,o);return Er(he(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=he(n.strategy),s=gi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ui({storePath:r.storePath??tu(),clock:()=>o}).get(n.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??jy(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Jc(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var By,nu=v(()=>{ln();At();pi();Fc();Vc();Zc();bi();By=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var yu={};M(yu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>lu,DEFAULT_SAME_CHAIN_SOURCES:()=>uu,NATIVE_TOKEN:()=>Mi,canonicalJson:()=>pu,hashFirmQuote:()=>hu,hashRfqIntent:()=>mu,normalizeFirmQuote:()=>Hi,normalizeRfqIntent:()=>Xy,sha256Hex:()=>vr});import{createHash as zy}from"node:crypto";import{getAddress as cu,isAddress as ji}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function iu(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function bn(e,t){let r=String(e??"").trim();return(!Vy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function Wy(e,t){return e==null||e===""?null:bn(e,t)}function su(e,t){let r=String(e??"").trim();return r.toLowerCase()===Mi.toLowerCase()?Mi:(ji(r)||re(t,"must be an EVM address or native token sentinel"),cu(r))}function du(e,t){let r=String(e??"").trim();return ji(r)||re(t,"must be an EVM address"),cu(r)}function Gy(e,t){return e==null||e===""?null:du(e,t)}function au(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function Ky(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function zt(e){if(Array.isArray(e))return e.map(zt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=zt(e[r]));return t}return e}function pu(e){return JSON.stringify(zt(e))}function vr(e){return`0x${zy("sha256").update(pu(e)).digest("hex")}`}function fu(e,t){let r={...e};for(let n of t)delete r[n];return r}function mu(e){return vr(fu(e,["intentHash"]))}function hu(e){return vr(fu(e,["firmQuoteHash"]))}function Xy(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=iu(e.fromChainId??e.fromChain,"fromChainId"),i=iu(e.toChainId??e.toChain,"toChainId"),a=o===i?uu:lu,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:su(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:su(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:bn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:du(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Ky(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:Wy(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:au(e.allowedSources,"allowedSources",a),allowedRouters:au(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?zt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):vr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=mu(c),Object.freeze(c)}function Yy(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!ou.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ou.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!ji(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),zt(e)}function Hi(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=bn(t.amountOut??t.buyAmount,"amountOut"),a=bn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=Yy(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 l=Gy(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)?zt(t.metadata):{}};return d.quoteId||(d.quoteId=vr({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=hu(d),Object.freeze(d)}var Mi,uu,lu,ou,Vy,zi=v(()=>{Mi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",uu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),lu=Object.freeze(["lifi"]),ou=/^0x[0-9a-fA-F]{64}$/,Vy=/^\d+$/});import{readFileSync as Qy}from"node:fs";import{homedir as Jy}from"node:os";import{join as wn}from"node:path";function Zy(){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=Jy();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||wn(t,".config","oracle")).trim();return[e,wn(r,"exec.env")].filter(Boolean)}return[e,wn(t,".config","oracle","exec.env"),wn(t,".config","mad-desk","exec.env")].filter(Boolean)}function gu(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Zy())try{let i=Qy(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var bu=v(()=>{});var wu=v(()=>{});import{createHash as eg,createHmac as Su,timingSafeEqual as tg}from"node:crypto";function xn(e){return Array.isArray(e)?`[${e.map(xn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Eu(e,{required:t=!1}={}){try{return gu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Wi(e){let{signature:t,...r}=e;return r}function ku(e,{secret:t}={}){let r=Eu(t);return r?{...e,signature:Su("sha256",r).update(xn(Wi(e))).digest("hex")}:e}function rg(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 eg("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Ae(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=Eu(o);if(i){let f=Su("sha256",i).update(xn(Wi(e))).digest("hex");if(!ng(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 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=ig(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return ku({...Wi(e),calldataHash:rg(n)},{secret:o})}function ng(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:tg(r,n)}function Vi(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function og(e){let t=e==null?tt:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,tt)}function rt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=Vi(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(Vi(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Vi(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=og(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function Gi({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=xu,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=rt({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||xu)),g=d*BigInt(1e4-p.selectedBps),h=g/10000n;if(g%10000n!==0n&&(h+=1n),h>d&&(h=d),d>0n&&h<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let x=Number((d-h)*10000n/(d===0n?1n:d));if(x>p.capBps)throw new Error(`auto-slippage: realised floor implies ${x} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ku({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:h.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:l})}function ig(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 l=Gi({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 tt,xu,Re=v(()=>{bu();wu();tt=100,xu=2e4});function Ki(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:pt}var pt,Sn=v(()=>{pt="0x000000000000000000000000000000000000dEaD"});import{Contract as sg,JsonRpcProvider as ag}from"ethers";function fg(e){return pg.test(String(e||""))}async function Au(e,{contract:t=cg,rpc:r=lg,chainId:n=ug,balanceOf:o}={}){if(!fg(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new ag(r,n,{staticNetwork:!0}),s=new sg(t,dg,i);return BigInt(await s.balanceOf(e))}var cg,ug,lg,dg,pg,vu=v(()=>{cg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",ug=999,lg="https://rpc.hyperliquid.xyz/evm",dg=["function balanceOf(address owner) view returns (uint256)"],pg=/^0x[a-fA-F0-9]{40}$/});import{existsSync as mg,readFileSync as hg,lstatSync as yg}from"node:fs";import{homedir as Iu}from"node:os";import{join as Xi}from"node:path";function wg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(_u,t)?_u[t]:bg}function Ag(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Ou])return String(e[Ou]);let t=e.ORACLE_CONFIG_DIR||Xi(Iu(),".config","oracle");return Xi(t,"fee-recipient")}return Xi(Iu(),".config","oracle","fee-recipient")}function vg(e=process.env){try{let t=Ag(e);if(!mg(t)||yg(t).isSymbolicLink())return"";let r=hg(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Ig(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),gg)}function _g({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Sg]||"").trim(),o=String(e[Eg]||kg).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=wg(t),s=Ig(e[xg],{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=vg(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 En({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=_g({env:t,action:r,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Au(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Cu(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function Tu(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Nu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var gg,bg,_u,xg,Sg,Eg,Ou,kg,kn=v(()=>{vu();gg=100,bg=5,_u=Object.freeze({swap:5,bridge:5,perps:0,nft:0});xg="ORACLE_INTEGRATOR_FEE_BPS",Sg="ORACLE_INTEGRATOR_FEE_RECIPIENT",Eg="ORACLE_INTEGRATOR_ID",Ou="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",kg="oracle"});var Ji={};M(Ji,{LIFI_API:()=>$u,lifiChains:()=>Rg,lifiHealth:()=>Tg,lifiPrepare:()=>Ng,lifiQuote:()=>It});function Qi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||$u).replace(/\/$/,"")}function Cg(e){let t=String(e||Yi).toLowerCase();return t===Yi.toLowerCase()||t===Og}function Ru(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function Tg(e={}){let t=await N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function It(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=Yi,toToken:i,fromAmount:s,fromAddress:a=pt}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let l=await En({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,x]of Object.entries(Tu(l)))c.set(h,x);let d=await N(`${Qi(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=ae(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),g=d?.estimate?.toAmountMin||d?.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:l}}async function Ng(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(!Cg(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:Ru(a,"approval token"),spender:Ru(s,"approval spender"),amount:String(e.fromAmount)}}return J({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:Ae(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Rg(e={}){return N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var $u,Yi,Og,Ir=v(()=>{W();Re();Sn();ge();kn();$u="https://li.quest/v1";Yi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Og="0x0000000000000000000000000000000000000000"});var qu={};M(qu,{PARASWAP_API:()=>Pu,paraswapHealth:()=>Pg,paraswapPrepare:()=>$g,paraswapPrice:()=>Wt,paraswapTokens:()=>Lu});function Vt(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Lu(e={},t={}){let r=Number(e.chainId||1);return N(`${Zi(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await En({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Nu(o)))n.set(a,c);let i=await N(`${Zi(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function $g(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=Vt(e.userAddress,"userAddress"),o=await Wt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Vt(e.receiver,"receiver"));let c=await N(`${Zi(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return J({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:Ae(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Pg(e={}){let t=await Lu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Pu,Zi,An=v(()=>{W();Re();ge();kn();Pu="https://api.paraswap.io",Zi=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Pu).replace(/\/$/,"")});function vn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Bu(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Bu(t),...r]).has(c)){let 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[Uu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Uu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Bu(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function In(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var Uu,es=v(()=>{Uu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var zu={};M(zu,{ZEROX_API:()=>Fu,zeroxHealth:()=>Lg,zeroxPrepare:()=>qg,zeroxPrice:()=>Hu,zeroxQuote:()=>Gt});function Du(e={}){return vn({provider:"zerox",defaultUrl:Fu,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Mu(e={}){return Du(e).baseUrl}function _n(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function ju(e={}){return In({"0x-version":"v2",accept:"application/json"},{"0x-api-key":_n(e)},Du(e).trusted)}async function Lg(e={}){if(!_n(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Hu({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Hu(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),N(`${Mu(t)}/swap/allowance-holder/price?${a}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!_n(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await N(`${Mu(t)}/swap/allowance-holder/quote?${c}`,{headers:ju(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ae(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 qg(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:Ae(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Fu,On=v(()=>{W();Re();es();ge();Fu="https://api.0x.org"});var aI,Vu=v(()=>{aI=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Cn from"node:fs";import Ug from"node:os";import Xt from"node:path";import{fileURLToPath as Bg}from"node:url";function Wu(){return process.env.ORACLE_FAKE_HOME||Ug.homedir()}function Dg(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Tn(){return Dg()?process.env.ORACLE_CONFIG_DIR||Xt.join(Wu(),".config","oracle"):Xt.join(Wu(),".config","oracle")}function Mg(){return Xt.join(Tn(),"desk.json")}function jg(){return Xt.join(Tn(),"env")}function Kt({force:e=!1}={}){if(Kt._done&&!e)return Kt._result||null;Kt._done=!0;let t={},r=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=jg();if(Cn.existsSync(o))for(let i of Cn.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let o=Mg();if(Cn.existsSync(o)){let i=JSON.parse(Cn.readFileSync(o,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),Kt._result=Object.keys(t).length?t:null,Kt._result}var Fg,fI,Gu=v(()=>{Fg=Xt.dirname(Bg(import.meta.url)),fI=Xt.resolve(Fg,"../..");try{Kt()}catch{}});var Yu={};M(Yu,{armPreparedAction:()=>Yg,callSigner:()=>Ku,queueOwnerAction:()=>Xu});import{existsSync as Hg,readFileSync as zg}from"node:fs";import{request as Vg}from"node:http";import Wg from"node:path";function Kg(e=process.env){let t=String(e.ORACLE_SIGNER_URL||Gg).replace(/\/$/,""),r;try{r=new URL(t)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function Xg(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Wg.join(Tn(),"signer","signer-token");return Hg(t)?zg(t,"utf8").trim():null}function Ku(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=Kg(n),s=Xg(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=r?Buffer.from(JSON.stringify(r)):null,l=Vg({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...u?{"content-type":"application/json","content-length":u.length}:{}}},d=>{let p=[];d.on("data",f=>p.push(f)),d.on("end",()=>{let f=Buffer.concat(p).toString("utf8"),m={};try{m=f?JSON.parse(f):{}}catch{m={error:"signer refused"}}a({httpStatus:d.statusCode,...m})})});l.on("timeout",()=>{l.destroy(),a({ok:!1,error:"local signer timed out"})}),l.on("error",()=>a({ok:!1,error:"local signer is not running"})),u&&l.write(u),l.end()})}async function Xu(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Ku("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function Yg(e,t=process.env){let r=e?.localSignerEnvelope||e?.envelope;if(!r||r.version!==1||!r.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Xu(r,t)}var Gg,Qu=v(()=>{Gu();Gg="http://127.0.0.1:9462"});var sl={};M(sl,{COW_CANCEL_TYPES:()=>tl,COW_HOSTS:()=>Rn,COW_ORDER_TYPES:()=>Nn,COW_SETTLEMENT:()=>Ju,COW_VAULT_RELAYER:()=>Zu,armCowOrder:()=>nb,buildArmedCowOrder:()=>os,cowCancelOrders:()=>ub,cowChains:()=>pb,cowHealth:()=>tb,cowOrder:()=>il,cowOrderStatus:()=>ol,cowOrderUid:()=>ob,cowPrepareCancel:()=>ab,cowPrepareOrder:()=>rb,cowQuote:()=>_t,cowSignCancel:()=>cb,cowSignOrder:()=>ib,cowSubmitSignedOrder:()=>sb,cowVerifyOrderFill:()=>db});import{TypedDataEncoder as rs,getAddress as _r,isAddress as Qg}from"ethers";function $n(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Rn[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Jg(e,t="v1",r={}){let n=$n(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function nt(e,t){let r=String(e||"").trim();if(!Qg(r))throw new Error(`cowswap: ${t} must be an address`);return _r(r).toLowerCase()}function Yt(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function rl(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function nl(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Zg({digest:e,owner:t,validTo:r}={}){let n=rl(e,"order digest").slice(2),o=nt(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function ns(e){let t=Ju[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:_r(t)}}function eb(e={},t,r){let n=nt(e.sellToken,"sellToken"),o=nt(e.buyToken,"buyToken"),i=nt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=rl(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Yt(e.sellAmount,"sellAmount"),buyAmount:Yt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Yt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function tb(e={}){try{let t=await _t({chainId:1,sellToken:ts[1],buyToken:el[1],sellAmountBeforeFee:"1000000000000000",from:pt},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function _t(e={},t={}){let r=Number(e.chainId??1),n=Ki(e.from||e.owner),o=e.sellToken||ts[r],i=e.buyToken||el[r],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ts[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await N(`${$n(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 rb(e={},t={}){let r=Number(e.chainId??1),n=nt(Ki(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=eb(o?.quote||o,r,n),s=ns(r),a={domain:s,types:Nn,primaryType:"Order",message:i},c=rs.hash(s,Nn,i),u=Zu[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return J({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:_r(u).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:_r(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:os({chainId:r,owner:n,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function os(e={},t={}){let r=e.typedData;if(!r?.domain||!r?.types||!r?.message)throw new Error("cowswap: typedData required to arm");let n=Number(e.chainId??r.domain.chainId),o=Rn[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=nt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=rs.hash(r.domain,r.types,r.message);return Object.freeze({tradeId:`cow:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:n,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:n,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:r.domain,types:r.types,message:r.message,typedData:r})})}async function nb(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Qu(),Yu)),n=e.localSignerEnvelope||os(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function ol(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${$n(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function il(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${$n(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function ob(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||rs.hash(ns(r),Nn,n),i=e.owner||e.from||e.signer||n.receiver;return Zg({digest:o,owner:i,validTo:n.validTo})}async function ib(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 sb(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 ab(e={}){let t=Number(e.chainId??1),r=nt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>nl(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=ns(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:tl,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function cb(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function ub(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function lb(e={}){return Yt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function db(e={},t={}){let r=Number(e.chainId??1),n=nl(e.uid||e.orderUid),o=t.order||await il({chainId:r,uid:n},t),i=t.status||o.status||await ol({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${Jg(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?nt(e.expectedOwner,"expectedOwner"):null;if(c&&nt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(lb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Yt(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(Yt(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 pb(){return Object.keys(Rn).map(Number)}var Rn,Ju,Zu,ts,el,Nn,tl,Pn=v(()=>{W();Re();Vu();Sn();ge();Rn={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Ju=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zu=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ts={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},el={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Nn=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),tl=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var cl={};M(cl,{CHAINS:()=>Ln,chainById:()=>ss,isSupportedChain:()=>al,registerChain:()=>fb,rpcUrlFor:()=>as});function ss(e){return is.get(Number(e))||null}function fb({key:e,chainId:t,name:r,rpcEnv:n=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:r||e,rpcEnv:n,evm:!0};return Ln[e]=o,is.set(o.chainId,o),o}function as(e,t=process.env){let r=ss(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function al(e){return is.has(Number(e))}var Ln,is,cs=v(()=>{Ln={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},is=new Map(Object.values(Ln).map(e=>[e.chainId,e]))});import{Interface as mb,getAddress as hb}from"ethers";function Or(e,t){try{return hb(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function gb(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=as(e,r);return n||yb[Number(e)]||null}function wb(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!bb.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||"");wb(o);let i=gb(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function Un(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ul(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function ll(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function dl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.owner,"owner"),i=Or(e.spender,"spender"),s=qn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=qn.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function pl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Or(e.token||e.tokenAddress,"token"),o=Or(e.account||e.owner||e.address,"account"),i=qn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=qn.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var qn,yb,bb,ot=v(()=>{W();cs();qn=new mb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);yb={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"};bb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function fl(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Bn(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=fl(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,g=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(d)||xb.has(p)?h=300:s&&d===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:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function ml(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&fl(e,r[0]).address||null}var xb,us=v(()=>{xb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function Ab(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 vb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ib(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Sb).replace(/\/$/,"")}async function Fn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Ib(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hl({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Cr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=$e(Eb[Number(e)]||e),s=new Set(kb(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Fn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,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=>Ab(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:vb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function yl(e,{chainSlug:t="solana",stables:r=_b}={},n={}){let o=await Fn(e,n),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Bn(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Sb,Eb,$e,kb,_b,Tr=v(()=>{W();us();Sb="https://api.dexscreener.com",Eb=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(),kb=e=>Array.isArray(e)?e:e==null?[]:[e];_b=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var vl={};M(vl,{PANCAKE_FEE_TIERS:()=>Dn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>xl,UNI_V3_VENUES:()=>kl,uniV3Chains:()=>Pb,uniV3EthUsdc:()=>Al,uniV3Health:()=>$b,uniV3PrepareExactIn:()=>Rb,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>Nb});import{Interface as bl,getAddress as Nr,isAddress as wl}from"ethers";function ds(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=kl[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ls(e,t){let r=be[Number(t)];if(!e||e===Sl||e===El||/^eth$/i.test(String(e)))return Nr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Nr(r.weth);if(/^usdc$/i.test(n))return Nr(r.usdc);if(!wl(n))throw new Error(`invalid token address: ${e}`);return Nr(n)}function Cb(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 Tb(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function Ot(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=ds(e.chainId??8453,e.venue),s=ls(e.tokenIn||"WETH",r),a=ls(e.tokenOut||be[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:xl,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 b=Mn.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let y=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!y||y==="0x"){d.push({fee:k,ok:!1,error:"empty result"});continue}let A=Mn.decodeFunctionResult("quoteExactInputSingle",y),E={fee:k,ok:!0,amountOut:A[0].toString(),sqrtPriceX96After:A[1].toString(),initializedTicksCrossed:Number(A[2]),gasEstimate:A[3].toString()};d.push(E),(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E)}catch(y){d.push({fee:k,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let k=d.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${k}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:Cb(e.venue)},t).catch(()=>[]):[],m={};for(let k of f.slice(0,8))if(!(!k.pairAddress||!wl(k.pairAddress)))try{let b=await Y(r,"eth_call",[{to:k.pairAddress,data:Ob},"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||k.liquidityUsd>m[y].liquidityUsd)&&(m[y]=k)}catch{}let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),h=null;if(e.fee==null&&g>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),y=d.filter(A=>A.ok&&Number((k-BigInt(A.amountOut))*10000n/k)<=g).filter(A=>m[A.fee]?.liquidityUsd!=null).sort((A,E)=>m[E.fee].liquidityUsd-m[A.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 x=m[p.fee]??null,S=f[0]??null,O=x??S,w=e.liquidityUsd??x?.liquidityUsd??S?.liquidityUsd??null,_=e.liquidityUsd!=null?"caller":x?"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:w,liquiditySource:O,liquidityAttribution:_,liquidityPick:h,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:w,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Nb(e={},t={}){let{chainId:r,quoter:n,router:o}=ds(e.chainId??8453),i=(e.tokens||[]).map(p=>ls(p,r)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Tb(i,s),u=Mn.encodeFunctionData("quoteExactInput",[c,a]),l=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),d=Mn.decodeFunctionResult("quoteExactInput",l);return ae({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 Al(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Ot({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Rb(e={},t={}){let r=Number(e.chainId??8453),n=ds(r,e.venue),o=Nr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Sl||i===El||/^eth$/i.test(i),a=await Ot(e,t),c=gl.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=gl.encodeFunctionData("multicall",[d,[c]]);return J({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:Ae(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function $b(e={}){let t=Number(e.chainId??8453);try{let r=await Al({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function Pb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,xl,Ob,Mn,gl,Sl,El,Dn,kl,jn=v(()=>{ot();Tr();Re();ge();be={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},xl=[100,500,3e3,1e4],Ob="0xddca3f43",Mn=new bl(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),gl=new bl(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),Sl="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",El="0x0000000000000000000000000000000000000000",Dn=[100,500,2500,1e4],kl={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Dn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Tl={};M(Tl,{executeRfqCandidates:()=>Ol,rankRfqQuotes:()=>Cl,requestRfqQuotes:()=>Ub,sourceCandidates:()=>_l});function Rr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Il(e,t){return String(e?.[t]??"").trim()}function $r(e,t){return Object.freeze({source:e,run:t})}function _l(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Rr(e,"lifi")&&s.push($r("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 Lb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Rr(e,"paraswap")&&s.push($r("paraswap",async()=>{let c=await(n.paraswapPrice??Wt)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),Rr(e,"0x")&&(Il(r,"ZEROX_API_KEY")||Il(r,"0X_API_KEY")||n.zeroxQuote)&&s.push($r("0x",async()=>{let c=await(n.zeroxQuote??Gt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Rr(e,"cow")&&s.push($r("cow",async()=>{let c=await(n.cowQuote??_t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Rr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push($r("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 Lb(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function qb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Ol(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>qb(a,n))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(Hi(e,{...u.value,source:c.source},r))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Cl(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Ub(e,t={}){let r=_l(e,t),{quotes:n,failed:o}=await Ol(e,r,t),i=Cl(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Nl=v(()=>{Ir();An();On();Pn();jn();zi()});function Rl(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Bb.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||r.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))Qt.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function $l(e){let{ok:t,errors:r,warnings:n}=Rl(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
5
|
- ${r.join(`
|
|
6
|
-
- `)}`);let o=e.capabilities||{},i=Qt.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Qt.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Qt)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function Hn(e){let t=Pl(e);return Jt.set(t.chainId,t),t}function ps(e){return Jt.get(Number(e))||null}function $l(){return[...Jt.values()]}function Nb(){Jt.clear()}function Rb(){let e={};for(let t of Jt.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:Jt.size,capabilities:[...Qt],chains:e}}var Qt,U,L,Tb,Jt,ft=v(()=>{Qt=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),L=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Tb=/^0x[0-9a-fA-F]{40}$/;Jt=new Map});function Ll(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:d=!1,meta:l={}}=e||{};if(u||r==null)return{source:t,quality:$e.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=$r(r);if(p==null||p<=0n)return{source:t,quality:$e.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?$e.NO_GAS:$e.FULL,amountOut:p.toString(),minOut:$r(n)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:d,meta:l}}async function Ul(e,t,{divisor:r=1000n}={}){let n=$r(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=$r(i),c=$r(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),d=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(d)||u<=0?null:{impactPct:(1-d/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function Bl(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:n,impactUnmeasured:o,warnings:s}}function fs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(y=>y.quality!==$e.FAILED),c=e.filter(y=>y.quality===$e.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,d=Number(i),l=Number(s),p=Number.isFinite(d)&&d>0&&Number.isFinite(l)&&l>0,f=a.map(y=>{let k=BigInt(y.amountOut),S=0n,R=!1,I=!1,P=BigInt(y.oracleFeeBps??0),q=P>0n?k*P/10000n:0n;if(u){let B=y.gasUsd,H=Number(y.meta?.gasUnits??y.estimatedGas);if(B==null&&p&&Number.isFinite(H)&&H>0){let K=H*d/1e18*l;Number.isFinite(K)&&K>=0&&(B=K,I=!0)}let ie=(B??0)+(y.feeUsd??0);if(ie>0){let K=ie/t*10**r;Number.isFinite(K)&&K>=0&&(S=BigInt(Math.floor(K)),R=!0)}else B===0&&(R=!0)}let j=S+q,X=k>j?k-j:0n;return{...y,grossOut:k.toString(),netOut:X.toString(),costInDest:S.toString(),oracleFeeInDest:q.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,g=f.reduce((y,k)=>BigInt(k.netOut)>y?BigInt(k.netOut):y,0n),h=y=>g>0n?Number((g-BigInt(y))*10000n/g):0,w=[],E=f.slice().sort((y,k)=>BigInt(k.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,k)=>{let S=h(y.netOut)<=m?0:1,R=h(k.netOut)<=m?0:1;if(n&&m>0&&S!==R)return S-R;if(n&&m>0){let I=y.liquidityUsd??-1,P=k.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(k.netOut)>BigInt(y.netOut)?1:-1}),n&&m>0&&E&&f[0]&&f[0].source!==E.source&&w.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let _=f.filter(y=>!y.costAccounted).map(y=>y.source);u?_.length&&w.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let y=f.find(k=>k.costAccounted&&h(k.netOut)<=m);y&&w.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${y.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(y=>y.gasEstimated).map(y=>y.source);O.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${O.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let A=null,b=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let y=BigInt(f[0].netOut),k=BigInt(f[1].netOut);k>0n&&(A=Number((y-k)*10000n/k),b=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:A,spreadBasis:b,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function zn(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ll({source:s,error:String(o.reason?.message||o.reason)}):Ll({source:s,...o.value})})}var $e,ql,$r,ms=v(()=>{ft();$e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),ql={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},$r=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Fl(e={}){return vn({provider:"oneinch",defaultUrl:Pb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function $b(e={}){return Fl(e).baseUrl}function Dl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Lb(e={}){let t=Dl(e);return In({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Fl(e).trusted)}async function Ml(e={},t={}){if(!Dl(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await N(`${$b(t)}/${r}/quote?${s}`,{headers:Lb(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var Pb,jl=v(()=>{W();Re();es();ge();Pb="https://api.1inch.dev/swap/v6.0"});var Vl={};M(Vl,{UNI_V4_CHAINS:()=>Le,UNI_V4_FEE_TIERS:()=>gs,computeV4PoolId:()=>Gn,decodeV4HookPermissions:()=>ws,uniV4Chains:()=>Kb,uniV4Health:()=>Xb,uniV4InspectHook:()=>Vb,uniV4PrepareExactIn:()=>Gb,uniV4QuoteExactIn:()=>Kn,uniV4QuoteExactOut:()=>Wb});import{AbiCoder as qb,Interface as hs,getAddress as Ke,isAddress as ys,keccak256 as Ub}from"ethers";function ws(e){let t=Br(e),r=Number(BigInt(t)&Fb),n=Object.fromEntries(Hl.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Hl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Ur(e){let t=Number(e),r=Le[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Le).join(", ")})`);return{chainId:t,...r}}function Br(e){if(e==null||e==="")return ye;let t=String(e);if(!ys(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function Zt(e,t){let r=Le[Number(t)];if(qr(e))return Ke(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ke(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ke(r.usdc);if(!ys(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function qr(e){let t=String(e||"").trim().toLowerCase();return!t||t===Hb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function Gn({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=Br(o);return Ub(Lr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function xs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:Br(o)},zeroForOne:u}}function zb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=ws(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==ye&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),n&&e===ye&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==ye&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==ye&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==ye,returnsDelta:i,reasons:Object.freeze(a)})}async function Vb(e={},t={}){let r=Ur(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=Zt(e.tokenIn||"WETH",r.chainId),o=Zt(e.tokenOut||r.usdc,r.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Br(e.hooks),{poolKey:c}=xs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Gn(c),d=t.rpcCall||Y,l=Vn.encodeFunctionData("getSlot0",[u]),p=Vn.encodeFunctionData("getLiquidity",[u]),[f,m,g]=await Promise.all([d(r.chainId,"eth_call",[{to:r.stateView,data:l},"latest"],t),d(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===ye?Promise.resolve(null):d(r.chainId,"eth_getCode",[a,"latest"],t)]),h=Vn.decodeFunctionResult("getSlot0",f),w=Vn.decodeFunctionResult("getLiquidity",m)[0],E=h[0],_=E>0n,x=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,O=!!(i&bs),A=zb({hook:a,codePresent:x,initialized:_,dynamicFee:O});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:_,sqrtPriceX96:E.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:w.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:x,codeBytes:x?(g.length-2)/2:0,permissions:ws(a)}),risk:A})}async function Kn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],d=e.hooks||ye,l=[],p=null;for(let b of u){let{poolKey:y,zeroForOne:k}=xs({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:d}),S=Wn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:S},"latest"],t);if(!R||R==="0x"){l.push({...b,ok:!1,error:"empty result"});continue}let I=Wn.decodeFunctionResult("quoteExactInputSingle",R),P={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:k,poolId:Gn({...y})};l.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(R){l.push({...b,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let b=l.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>[]):[],m=new Map;for(let b of f){let y=String(b.pairAddress||"").toLowerCase();y&&m.set(y,b)}let g=b=>m.get(String(b.poolId||"").toLowerCase())??null,h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&h>0&&BigInt(p.amountOut)>0n){let b=BigInt(p.amountOut),k=l.filter(S=>S.ok&&Number((b-BigInt(S.amountOut))*10000n/b)<=h).filter(S=>g(S)?.liquidityUsd!=null).sort((S,R)=>g(R).liquidityUsd-g(S).liquidityUsd)[0];k&&k.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:k.fee,chosenPoolUsd:g(k).liquidityUsd,bandBps:h},p=k)}let E=g(p),_=f[0]??null,x=E??_,O=e.liquidityUsd??E?.liquidityUsd??_?.liquidityUsd??null,A=e.liquidityUsd!=null?"caller":E?"pool":_?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:O,liquiditySource:x,liquidityAttribution:A,liquidityPick:w,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ys(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!qr(e.tokenIn)&&!qr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&bs)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Wb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],d=e.hooks||ye,l=[],p=null;for(let m of u){let{poolKey:g,zeroForOne:h}=xs({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:d}),w=Wn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let E=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:w},"latest"],t);if(!E||E==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let _=Wn.decodeFunctionResult("quoteExactOutputSingle",E),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:_[0].toString(),gasEstimate:_[1].toString(),poolKey:g,zeroForOne:h,poolId:Gn({...g})};l.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(E){l.push({...m,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let m=l.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await hl({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:l,best:!0,executionReady:!1,prepareReady:!1}}async function Gb(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=Ur(n);if(Br(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&bs)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let s=Ke(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(qr(e.tokenIn)||qr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Kn(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let d=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,l={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Lr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[l,u.zeroForOne,BigInt(u.amountIn),d,0n,"0x"]]),m=Lr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),g=Lr.encode(["address","uint256"],[u.tokenOut,d]),h=Lr.encode(["bytes","bytes[]"],[Mb,[f,m,g]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=Bb.encodeFunctionData("execute",[Db,[h],E]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:E,quote:{...u,amountOutMinimum:d.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:jb,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:_,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Kb(){return Object.entries(Le).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Xb(e={}){let t=Ur(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Lr,ye,Le,gs,Wn,Bb,Vn,Hl,Fb,bs,Db,Mb,jb,Hb,zl,Es=v(()=>{ot();Tr();Re();ge();Lr=qb.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",Le={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},gs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Wn=new hs(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Bb=new hs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Vn=new hs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Hl=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Fb=(1n<<14n)-1n,bs=8388608;Db="0x10",Mb="0x060c0f",jb="0x000000000022D473030F116dDEE9F6B43aC78BA3",Hb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";zl=["uniswap-v4","uniswapv4"]});function Jb(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Yb).replace(/\/$/,"")}function Zb(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||Qb).replace(/\/$/,"")}async function Xn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${Jb(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wl(e={}){return N(`${Zb(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var Yb,Qb,Ss=v(()=>{W();Yb="https://coins.llama.fi",Qb="https://api.llama.fi"});var Yn={};M(Yn,{ACROSS_API:()=>Gl,HOP_API:()=>Kl,RELAY_API:()=>Xl,acrossHealth:()=>tw,acrossSuggestedFees:()=>Yl,hopHealth:()=>rw,hopQuote:()=>Ql,relayHealth:()=>nw,relayPrepare:()=>ow,relayQuote:()=>ks});async function tw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Yl({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Yl(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Gl).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function rw(e={}){try{let t=await Ql({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ql(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Kl).replace(/\/$/,""),d=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=d?.estimatedRecieved||d?.estimatedReceived;return l?ae(d,{chainId:Number(e.originChainId||e.chainId||ew[o]||0),venue:d?.tx?.to||"hop",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...d,autoSlippagePolicy:a}}async function nw(e={}){try{let t=await ks({user:pt,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function ks(e={},t={}){let{user:r=pt,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let d=(t.baseUrl||process.env.RELAY_API_URL||Xl).replace(/\/$/,""),l=await N(`${d}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=l?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...l,autoSlippagePolicy:u}:ae(l,{chainId:Number(n),venue:l?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ow(e={},t={}){let r=await ks(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:n,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:ke(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return J({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Gl,Kl,Xl,ew,Qn=v(()=>{W();Re();En();ge();Gl="https://across.to/api",Kl="https://api.hop.exchange/v1",Xl="https://api.relay.link",ew={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Jn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Xe(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Zl(e,t={}){let r=ql[Number(e)];if(!r)return null;try{let n=await Xn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function iw(e={}){try{let t=await Wl({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function sw(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Jl[r]||[r]),n.push(...Jl[mt(e)]||[e]),n}function aw(e,t,r={}){let n=Array.isArray(e)?e:[],o=sw(t,r).map(mt).filter(Boolean);for(let i of o){let s=n.find(c=>mt(c?.slug)===i||mt(c?.name)===i),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=mt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:mt(c?.slug).includes(i)||mt(c?.name).includes(i)}),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function As({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:d={}}){let l=[];return l.push({source:"lifi",run:async()=>{let p=await It({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},d),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:Jn(f?.gasCosts),feeUsd:Jn(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&l.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await Wt({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},d),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:Xe(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&l.push({source:"0x",run:async()=>{let p=await Gt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},d),f=null,m=p?.totalNetworkFee,g=await Promise.resolve(c);return m!=null&&g&&(f=Number(m)/1e18*g),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&l.push({source:"1inch",run:async()=>{let p=await Ml({chainId:e,src:t,dst:r,amount:n},d),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),l.push({source:"cow",run:async()=>{let p=await _t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},d),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),be[Number(e)]&&l.push({source:"uniswap-v3",run:async()=>{let p=await Ot({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},d);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),Le[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let p=await Kn({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},d);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),l}function ed({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(d,l={})=>(c||=iw(s),aw(await c,d,l));return a.push({source:"lifi",run:async()=>{let d=await It({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),l=d?.estimate??d?.[0]?.estimate,p={tool:d?.tool??d?.toolDetails?.name,durationSeconds:Xe(l?.executionDuration)},f=await u("lifi",p);return{amountOut:l?.toAmount,minOut:l?.toAmountMin,gasUsd:Jn(l?.gasCosts),feeUsd:Jn(l?.feeCosts),oracleFeeBps:d?.oracleFee?.applies?d.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:d?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:d}=await Promise.resolve().then(()=>(Qn(),Yn)),p=(await d({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:Xe(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Xe(p?.totalImpact?.usd)!=null?Math.abs(Xe(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:d}=await Promise.resolve().then(()=>(Qn(),Yn)),l=await d({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},s),p=l?.totalRelayFee?.total,f=null;if(p!=null)try{let g=BigInt(String(o))-BigInt(String(p));g>0n&&(f=g.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Xe(l?.estimatedFillTimeSec),limits:l?.limits?{min:l.limits.minDeposit,max:l.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Xe,mt,Jl,td=v(()=>{Ir();An();On();jl();$n();jn();Es();Ss();ms();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Jl=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var nd={};M(nd,{QUALITY:()=>$e,bestBridgeRoute:()=>Fr,bestSwapRoute:()=>er,formatComparisonNote:()=>Zn});async function rd(e,t,r){let n=cw[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await Xn([o],r))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function er(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Zl(r,t),a=rd(r,o,t),c=ul(r,t).catch(()=>null),u=As({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[d,l,p]=await Promise.all([zn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=fs(d,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),g=t.maxImpactPct===void 0?25:t.maxImpactPct;if(g!=null&&m.best){let h=m.best.source,E=await Ul(async _=>{let x=As({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(A=>A.source===h);return x.length?(await zn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let _=Bl(m,{[h]:E},{maxImpactPct:g});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:d.filter(x=>x.quality!==$e.FAILED).length,note:Zn(_,u.length),priceImpact:{[h]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:d.filter(h=>h.quality!==$e.FAILED).length,note:Zn(m,u.length)}}async function Fr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=rd(n,i,t),c=ed({...e,opts:t}),[u,d]=await Promise.all([zn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=fs(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=l.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.seconds!=null);return{kind:"bridge",fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...l,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==$e.FAILED).length,note:Zn(l,c.length)}}function uw(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Cu(t)}`:""}function Zn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=uw(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var cw,tr=v(()=>{ms();td();kn();Ss();ot();cw={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var od={};M(od,{ARTIFACT:()=>it,prepareBestRoute:()=>hw,supportedPreparers:()=>dw});function dw(){return Object.keys(eo)}async function hw(e,t={}){if(mw.some(h=>Object.hasOwn(e,h)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:r}=e;if(!r)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!fw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(pw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let n=await er(e,t);if(!n.best){let h=n.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=eo[o];if(!s){let h=n.routes.find(w=>eo[w.source]&&w.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await s(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O,A;_?(A="approval-required-first",O=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${E}`):x?(A="taker-not-funded",O=`${o} refused to build the transaction: ${E}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(A="provider-error",O=`${o} prepare failed: ${E}`);let b=n.routes.find(y=>eo[y.source]&&y.source!==o);return{ok:!1,reason:O,failureKind:A,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??lw,u=null,d=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),w=BigInt(a.amountOut);h>0n&&(u=Number((w-h)*10000n/h),u<-c&&(d=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let l=n.routes.filter(h=>h.source!==o).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),f=n.routes.map(h=>({source:h.source,liquidityUsd:h.liquidityUsd??null})).reduce((h,w)=>Math.max(h,w.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,g=m!=null&&f>0?Math.round(m/f*100):null;return J({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:g},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===it.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...d?[d]:[],...n.warnings||[],...a.artifactKind===it.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:l,comparison:{rankedOn:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var it,lw,eo,pw,fw,mw,id=v(()=>{tr();ge();it=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),lw=100,eo={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(jn(),vl)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},d)=>{let{uniV4PrepareExactIn:l}=await Promise.resolve().then(()=>(Es(),Vl)),p=await l({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},d);return{artifactKind:it.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Ir(),Ji)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(An(),qu)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:it.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(On(),zu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>($n(),sl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:it.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};pw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fw=/^0x[0-9a-fA-F]{40}$/,mw=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var sd={};M(sd,{prepareBestBridgeRoute:()=>xw,supportedBridgePreparers:()=>ww});function ww(){return Object.keys(to)}async function xw(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!yw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(gw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await Fr(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=to[s];if(!c){let h=i.routes.find(w=>to[w.source]&&w.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...h?{alternative:h.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O=i.routes.find(A=>to[A.source]&&A.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${E}`:x?`${s} refused to build: ${E}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${E}`,failureKind:_?"approval-required-first":x?"taker-not-funded":"provider-error",...O?{alternative:O.source}:{},comparison:i}}let d=u.transactions||[];if(!d.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let l=d.filter(h=>h.chainId!=null&&Number(h.chainId)!==Number(n));if(l.length)return{ok:!1,reason:`${s} returned a transaction for chain ${l[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??bw,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),w=BigInt(u.amountOut);h>0n&&(f=Number((w-h)*10000n/h),f<-p&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(p/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let g=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return d.length>1&&g.push(`This route needs ${d.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),J({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:d.length,transactions:d,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:d[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:g,runnersUp:i.routes.filter(h=>h.source!==s).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${d.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var yw,gw,bw,to,ad=v(()=>{tr();ge();yw=/^0x[0-9a-fA-F]{40}$/,gw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),bw=100,to={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Qn(),Yn)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Ir(),Ji)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var ld={};M(ld,{buildTwapSchedule:()=>ud,normalizeTwapParams:()=>cd,prepareTwapChunk:()=>Iw,simulateTwap:()=>_w});function cd(e={}){let t=Math.max(Ew,Math.min(Sw,Number(e.splits)||Aw)),r=Math.max(.1,Number(e.windowHours)||vw),n=Math.max(kw,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function ud(e){let t=cd(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function Iw(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await er({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=J(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function _w(e,{quoteFn:t=er,...r}={}){let n=ud(e),o=[],i=0n,s="unknown";for(let c=0;c<n.params.splits;c++)try{let u=await t({chainId:n.params.chainId,tokenIn:n.params.tokenIn,tokenOut:n.params.tokenOut,amountIn:n.params.chunkSize,taker:n.params.taker},r),d=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=d,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(d),source:u.source??u.venue})}catch(u){if(r.signal?.aborted)throw r.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(n.params.amount))).toFixed(6):null;return{params:n.params,schedule:n.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var Ew,Sw,kw,Aw,vw,dd=v(()=>{tr();ge();Ew=2,Sw=100,kw=60,Aw=10,vw=6});async function md({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!pd.has(Number(e))||!pd.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await N(`${fd}/dln/order/quote`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return u.error?{error:String(u.error)}:{estimation:u.estimation??{},order:u.order??{},fixFee:u.fixFee??"0"}}catch(c){return{error:String(c.message||c).slice(0,200)}}}async function hd(){try{return{ok:!0,chainCount:(await N(`${fd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var fd,pd,yd=v(()=>{W();ge();fd="https://dln.debridge.finance/v1.0",pd=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function bd({active:e=!0}={},t={}){let r=Date.now();if(rr.size&&r-gd<Ow)return[...rr.values()];try{let n=await N(`${vs}/exchange/currencies?active=${e?"true":"false"}`,t);rr.clear();for(let o of n??[])rr.set(String(o.ticker).toLowerCase(),o);return gd=r,n??[]}catch(n){return rr.size?[...rr.values()]:{error:String(n.message||n).slice(0,200)}}}async function Cw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${vs}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function Tw(e,t,r,{flow:n="standard"}={},o={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await N(`${vs}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function wd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Cw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Tw(e,t,s,{flow:n},o);if(a.error)return a;let c=await bd({},o),u=c.find(l=>String(l?.ticker).toLowerCase()===String(e).toLowerCase()),d=c.find(l=>String(l?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:a.toAmount,estimatedRate:a.rate,minAmount:i.minAmount,flow:a.flow,networkFee:u?.networkFee??null,kycRequired:u?.kycRequired??d?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function xd(){try{let e=await bd();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var vs,rr,gd,Ow,Ed=v(()=>{W();vs="https://api.changenow.io/v2",rr=new Map,gd=0,Ow=6e5});async function Sd({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},u=await N(`${Nw}/route`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return{route:u?.route??{},toAmount:u?.route?.estimate?.toAmount,fee:u?.route?.estimate?.feeCosts}}catch(c){return{error:String(c.message||c).slice(0,200)}}}var Nw,kd=v(()=>{W();Nw="https://api.squidrouter.com/v1"});async function Ad({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),c=await N(`${Rw}/quote?${a}`,s);return{amountOut:c?.amountOut,fee:c?.fee,estimatedTime:c?.estimatedTime}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Rw,vd=v(()=>{W();Rw="https://api.stargate.finance"});async function Id({fromAsset:e,toAsset:t,amount:r,destination:n}={},o={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await N(`${Pw}/quote/swap?${i}`,o);return{expectedAmountOut:s?.expected_amount_out,fees:s?.fees,slippageBps:s?.slippage_bps,inboundAddress:s?.inbound_address,memo:s?.memo,estimatedTime:s?.total_swap_seconds?`${Math.round(s.total_swap_seconds/60)} min`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Pw,_d=v(()=>{W();Pw="https://midgard.ninerealms.com/v2"});async function Od({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!r||!n||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await N(`${$w}/quote?${a}`,s);return{amountOut:c?.result?.toAmount,feeUsd:c?.result?.totalGasFeesInUsd,route:c?.result?.route,estimatedTime:c?.result?.serviceTime?`${c.result.serviceTime}s`:"unknown"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var $w,Cd=v(()=>{W();$w="https://api.socket.tech/v2"});async function Td({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={},i={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},a=await N(`${Lw}/estimate`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Lw,Nd=v(()=>{W();Lw="https://api.connext.network"});async function Rd({fromChain:e,toChain:t,token:r,amount:n}={},o={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await N(`${qw}/quote?${i}`,o);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var qw,Pd=v(()=>{W();qw="https://api.portalbridge.com/v1"});function Uw(e,t){return`0x${_s.getAmountsOut}`+_e(e)+_e(64)+_e(t.length)+t.map(Dr).join("")}function Bw(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Is(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Fw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Os)throw new Error(`slippageBps ${r} exceeds the ${Os} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function $d(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:Uw(i,s)},"latest"],a);return Bw(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Is(c.scanner);if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let d=a||[o,i];if(d.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let l=await n(u,s,d,c);return l?{chainId:t,router:u,path:d,amountIn:String(s),amountOut:l[l.length-1].toString(),hops:d.length-1,evidence:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:d,evidence:U.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Is(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let d=await n(c,i,[u,o],a);if(!d)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let l=d[d.length-1];if(l===0n)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,l,[o,u],a);if(!p)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.LIVE,leg:"sell",bought:l.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p[p.length-1],m=Number(f*10000n/BigInt(i)),g=L.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(g=L.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(g=L.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:g,reason:h,amountIn:String(i),bought:l.toString(),returned:f.toString(),retentionBps:m,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:d},l={}){let p=l.scanner,f=Is(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=d||[o,i],g=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},l);if(g.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${g.evidence}: ${g.reason??"no reason given"})`);let h=Fw(g.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(u)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,_=E?`0x${_s.swapExactETHForTokens}`+_e(h)+_e(128)+Dr(a)+_e(w)+_e(m.length)+m.map(Dr).join(""):`0x${_s.swapExactTokensForTokens}`+_e(s)+_e(h)+_e(160)+Dr(a)+_e(w)+_e(m.length)+m.map(Dr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Os,deadline:w.toString()},requires:E?[]:[{step:"approve",token:m[0],spender:f,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var _s,_e,Dr,Os,Ld=v(()=>{ot();ft();_s={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},_e=e=>BigInt(e).toString(16).padStart(64,"0"),Dr=e=>e.slice(2).toLowerCase().padStart(64,"0");Os=100});function Mw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Ts)throw new Error(`slippageBps ${r} exceeds the ${Ts} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Cs(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Bd(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},d){let l=`0x${qd.quoteExactInputSingle}`+Mr(s)+Mr(a)+Ct(c)+Ct(u)+Ct(0),p=await Y(t,"eth_call",[{to:i,data:l},"latest"],d).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let d=[],l=null;for(let p of Dw){let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);d.push({fee:p,amountOut:f?f.toString():null}),f&&(!l||f>l.amountOut)&&(l={fee:p,amountOut:f})}return{best:l,tried:d}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=Cs(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Ud.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:d,tried:l}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return d?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:d.amountOut.toString(),fee:d.fee,useNative:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:l,evidence:U.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:l,evidence:U.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=Cs(c.scanner,"quoter"),d=(e.stableQuoteAssets||[]).map(O=>String(O).toLowerCase()),l=null;!a&&typeof e.resolveQuoteAsset=="function"&&(l=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||l||(d[0]&&p!==d[0]?d[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let g=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!g.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(A.best){let b=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c);if(b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),S=L.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return k<5e3?(S=L.FAIL,R=`round trip vs dollar book returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(S=L.CAUTION,R=`round trip vs dollar book returns ${(k/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:g.best.amountOut},c);if(!h.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),b=A.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c):{best:null};if(A.best&&b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),S=L.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return k<5e3?(S=L.FAIL,R=`dollar-book round trip returns only ${(k/100).toFixed(2)}%`):k<9e3&&(S=L.CAUTION,R=`dollar-book round trip returns ${(k/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"sell",bought:g.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=h.best.amountOut,E=Number(w*10000n/BigInt(s)),_=L.PASS,x="round trip completes with expected fee/impact loss";return E<5e3?(_=L.FAIL,x=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(_=L.CAUTION,x=`round trip returns ${(E/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:_,reason:x,amountIn:String(s),bought:g.best.amountOut.toString(),returned:w.toString(),retentionBps:E,buyFee:g.best.fee,sellFee:h.best.fee,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:d},l={}){let p=Cs(l.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!Ud.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},l);if(f.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=d??f.fee,g=Mw(f.amountOut,u);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(l.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),w=`0x${qd.exactInputSingle}`+Mr(i)+Mr(s)+Ct(m)+Mr(c)+Ct(a)+Ct(g)+Ct(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:h?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:g.toString(),slippageBps:u,maxSlippageBps:Ts,fee:m},requires:h?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Dw,qd,Ct,Mr,Ud,Ts,Fd=v(()=>{ot();ft();Dw=[100,500,3e3,1e4],qd={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Mr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Ud=/^0x[0-9a-fA-F]{40}$/,Ts=100});function Dd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Md(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function jw(e){let{chainId:t}=e;async function r(n,o,i){return Y(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await Un(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await ll(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await pl({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,ro.decimals,o).catch(()=>null),r(n,ro.symbol,o).catch(()=>null),r(n,ro.name,o).catch(()=>null),r(n,ro.totalSupply,o).catch(()=>null)]),u=Dd(i?.result??i),d=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Md(s?.result??s),name:Md(a?.result??a),totalSupply:(Dd(c?.result??c)??null)?.toString()??null,evidence:d?U.LIVE:U.UNKNOWN,warning:d?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Fn(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(d=>String(d.chainId).toLowerCase()===String(i).toLowerCase()).map(d=>({pair:d.pairAddress,dex:d.dexId,base:d.baseToken?.address,quote:d.quoteToken?.address,liquidityUsd:d.liquidity?.usd??null,priceUsd:d.priceUsd??null,volume24hUsd:d.volume?.h24??null,createdAt:d.pairCreatedAt??null})).sort((d,l)=>(l.liquidityUsd??0)-(d.liquidityUsd??0)),u=Bn(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:ml(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],d=[];for(let l=n;l<=o;l+=a){let p=Math.min(l+a-1,o);d.push([l,p])}for(let[l,p]of d){let f={fromBlock:`0x${l.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let m=await Y(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[l,p],error:m.error,evidence:U.UNKNOWN};for(let g of m?.result??m??[])u.push(g)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:d.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=L.PASS,a=d=>{let l={[L.PASS]:0,[L.CAUTION]:1,[L.UNKNOWN]:2,[L.FAIL]:3};l[d]>l[s]&&(s=d)},c=await this.resolveToken(n,o);c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:L.UNKNOWN,detail:c.warning}),a(L.UNKNOWN)):i.push({check:"erc20-metadata",result:L.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:L.UNKNOWN,detail:u.reason}),a(L.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:L.FAIL,detail:"no pool with liquidity found"}),a(L.FAIL);else{let d=u.pools[0],l=d.liquidityUsd??0;l<5e3?(i.push({check:"liquidity",result:L.CAUTION,detail:`top pool only $${l}`}),a(L.CAUTION)):i.push({check:"liquidity",result:L.PASS,detail:`$${l} on ${d.dex}`}),d.createdAt&&Date.now()-d.createdAt<24*3600*1e3&&(i.push({check:"age",result:L.CAUTION,detail:"pool under 24h old"}),a(L.CAUTION))}if(typeof this.sellSimulation=="function"){let d=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:L.UNKNOWN,reason:String(l?.message||l)}));i.push({check:"sellability",result:d.verdict,detail:d.retentionBps!=null?`round trip returns ${(d.retentionBps/100).toFixed(2)}% -- ${d.reason}`:d.reason}),a(d.verdict)}else i.push({check:"sellability",result:L.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(L.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ns(e){let r={...jw(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Bd({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,$d({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var ro,jd=v(()=>{ot();Tr();ft();Ld();Fd();us();ro={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function no(){return jr.map(e=>Hn(Ns(e)))}function Hd(e){return Hn(Ns(e))}var jr,oo=v(()=>{jd();ft();jr=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Xd,getAddress as Hw,id as Yd}from"ethers";function nr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function $s(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function io(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function sx(e,t){try{return Hw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ax(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Kd(e){return`0x${String(e).slice(-40).toLowerCase()}`}function cx({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>ex)return"stale"}return"scoped"}function ux(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function lx(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(nr(r)){let a=$s(Wd,o,tx);if(a)return a.value}let s=(async()=>{let a=async l=>{try{let p=zd.encodeFunctionData(l,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:zd.decodeFunctionResult(l,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),d={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return nr(r)&&io(Wd,o,d,ox),d})();return n?.set(o,s),s}async function dx(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Vw,1),Ww),o=await Un(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[zw,ax(t)]}],r);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),d=c?.topics?.[2];!u||!d||a.set(`${u}:${Kd(d)}`,{token:u,spender:Kd(d)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function px(e){return(Qw[e]||[]).flatMap(r=>Kw.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function fx(e,t,r={}){let n=[],o="direct-probe",i=null,s=px(e),a=Ps(e),c=nr(r)&&$s(Rs,e,rx)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let u=await dx(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},nr(r)&&io(Rs,e,!0,64)}catch{if(nr(r)&&io(Rs,e,!1,64),n=s,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,l=(await un(n,r.concurrency||4,async f=>{try{let m=await dl({chainId:e,token:f.token,owner:t,spender:f.spender},r),g=BigInt(m.allowance);if(g<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await lx(e,f.token,r,u),w=g>=Zw,E=Gw[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:h.symbol,decimals:h.decimals,spender:f.spender,spenderLabel:E,allowance:g.toString(),allowanceDisplay:ux(g,h.decimals,w),unlimited:w,lastActivityAt:null,risk:cx({unlimited:w,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await hx(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:Ps(e).length,...i||{}},approvals:[...l,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function mx(e,t,r,n,o){try{let i=Vd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Vd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function Ps(e){return(Yw[e]||[]).flatMap(r=>Xw.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function hx(e,t,r){let n=Ps(e);return n.length===0?[]:(await un(n,r.concurrency||4,async i=>await mx(e,i.collection,t,i.operator,r)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Qd(e={},t={}){let r=sx(e.owner||e.address,"owner"),n=new Map(jr.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=nr(t)&&!e.refresh;if(s){let f=$s(Gd,i,nx);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await un(o,e.concurrency||3,f=>fx(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),d=u.find(f=>f.method==="log-scan"&&f.toBlock),l=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:d?`last ${d.toBlock-d.fromBlock} blocks`:l?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&io(Gd,i,p,ix),{...p,cached:!1,cachedAgeMs:0}}var zd,Vd,zw,uO,Vw,Ww,Gw,Kw,Xw,Yw,Qw,Jw,Zw,ex,tx,rx,nx,ox,ix,Wd,Rs,Gd,Jd=v(()=>{oo();W();ot();zd=new Xd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Vd=new Xd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),zw=Yd("Approval(address,address,uint256)"),uO=Yd("ApprovalForAll(address,address,bool)"),Vw=1e4,Ww=2e5,Gw=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),Kw=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),Xw=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),Yw=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),Qw=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),Jw=(1n<<256n)-1n,Zw=Jw/2n,ex=4320*60*60*1e3,tx=360*60*1e3,rx=600*1e3,nx=45*1e3,ox=512,ix=128,Wd=new Map,Rs=new Map,Gd=new Map});var tp={};M(tp,{aggregateBridgeQuotes:()=>Zd,bridgeAggregatorHealth:()=>gx,checkRevokeNeeded:()=>ep,scanBridgeRoutes:()=>yx});async function Zd(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:d=18,toDecimals:l=18}=e,p=[],f=[],m=md({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(y=>y.error?(f.push(`debridge: ${y.error}`),null):{provider:"debridge",amountOut:y.estimation?.dstChainTokenOut?.amount??y.estimation?.toAmount,feeUsd:y.estimation?.fixFee??y.fixFee,estimatedTime:y.estimation?.execution?.estimatedTransferTime?`${y.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:y}).catch(y=>(f.push(`debridge: ${y.message}`),null)),g=Fr({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(y=>!y||y.error?(f.push(`lifi: ${y?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:y.amountOut??y.quote?.amountOut,feeUsd:y.feeUsd??y.totalFee,estimatedTime:y.estimatedTime??y.duration??"unknown",preparable:!!y.transaction,raw:y}).catch(y=>(f.push(`lifi: ${y.message}`),null)),h=Sd({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(y=>y.error?(f.push(`squid: ${y.error}`),null):{provider:"squid",amountOut:y.toAmount,feeUsd:Array.isArray(y.fee)?y.fee.reduce((k,S)=>k+(Number(S.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),w=Ad({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(y=>y.error?(f.push(`stargate: ${y.error}`),null):{provider:"stargate",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"1-5 min",preparable:!1,raw:y}).catch(y=>(f.push(`stargate: ${y.message}`),null)),E=Id({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(y=>y.error?(f.push(`thorchain: ${y.error}`),null):{provider:"thorchain",amountOut:y.expectedAmountOut,feeUsd:y.fees?.total,estimatedTime:y.estimatedTime||"10-30 min",preparable:!1,raw:y}).catch(y=>(f.push(`thorchain: ${y.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let y=await wd({fromTicker:c,toTicker:u,fromAmount:s},t);return y.error?(f.push(`changenow: ${y.error}`),null):{provider:"changenow",amountOut:y.toAmount,feeUsd:y.networkFee,estimatedTime:y.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:y.kycRequired,raw:y}}catch(y){return f.push(`changenow: ${y.message}`),null}})(),x=Od({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(y=>y.error?(f.push(`bungee: ${y.error}`),null):{provider:"bungee",amountOut:y.amountOut,feeUsd:y.feeUsd,estimatedTime:y.estimatedTime,preparable:!1,raw:y}).catch(y=>(f.push(`bungee: ${y.message}`),null)),O=Td({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(y=>y.error?(f.push(`connext: ${y.error}`),null):{provider:"connext",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-20 min",preparable:!1,raw:y}).catch(y=>(f.push(`connext: ${y.message}`),null)),A=Rd({fromChain:r,toChain:n,token:o,amount:s},t).then(y=>y.error?(f.push(`wormhole: ${y.error}`),null):{provider:"wormhole",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-15 min",preparable:!1,raw:y}).catch(y=>(f.push(`wormhole: ${y.message}`),null)),b=await Promise.allSettled([m,g,h,w,E,x,O,A,_]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,k)=>{let S=Number(y.amountOut??0),R=Number(k.amountOut??0);return S!==R?R-S:y.preparable&&!k.preparable?-1:!y.preparable&&k.preparable?1:0}),{providers:p.map(y=>y.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function ep({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Qd({chainIds:[e],address:t},n)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?i.find(a=>String(a.token).toLowerCase()===String(r).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function yx(e={},t={}){let[r,n]=await Promise.all([Zd(e,t),ep({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=r.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:r.providers,runnersUp:r.runnersUp,revokeCheck:n,errors:r.errors,confidence:r.providers.length>=2?.85:r.providers.length===1?.6:.1}}async function gx(){let[e,t]=await Promise.all([hd().catch(r=>({ok:!1,error:r.message})),xd().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var LO,rp=v(()=>{tr();yd();Ed();kd();vd();_d();Cd();Nd();Pd();Jd();LO=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var np={};M(np,{DYDX_API:()=>so,dydxHealth:()=>xx,dydxMarkets:()=>bx,dydxOrderbook:()=>wx});async function bx(e=50,t={}){try{return((await N(`${so}/v4/perpetualMarkets?limit=${e}`,t))?.markets||[]).map(n=>({ticker:n?.ticker,oraclePrice:n?.oraclePrice,indexPrice:n?.indexPrice,nextFundingRate:n?.nextFundingRate?`${(Number(n.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:n?.openInterest,volume24h:n?.volume24H}))}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function wx(e){try{let t=await N(`${so}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function xx(){try{return{ok:!0,serverTime:(await N(`${so}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var so,op=v(()=>{W();so="https://api.dydx.exchange"});var sp={};M(sp,{DRIFT_API:()=>ip,driftHealth:()=>Sx,driftMarkets:()=>Ex});async function Ex(e={}){try{return((await N(`${ip}/v2/markets`,e))?.markets||[]).map(r=>({symbol:r?.symbol||r?.marketIndex,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Sx(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ip,ap=v(()=>{W();ip="https://dlob.drift.trade"});var cp={};M(cp,{VERTEX_API:()=>ao,vertexHealth:()=>vx,vertexMarkets:()=>kx,vertexOrderbook:()=>Ax});async function kx(e={}){try{return((await N(`${ao}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets||[]).map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Ax(e){try{let r=(await N(`${ao}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function vx(){try{return{ok:!0,status:(await N(`${ao}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ao,up=v(()=>{W();ao="https://gateway.prod.vertexprotocol.com/v2"});var lp={};M(lp,{pancakeHealth:()=>Ox,pancakeQuote:()=>_x});async function _x({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},a=await N(`${Ix}/quote`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,route:a?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Ox(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ix,dp=v(()=>{W();Ix="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var fp={};M(fp,{sushiHealth:()=>Nx,sushiQuote:()=>Tx});async function Tx({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,a=await N(`${Cx(e)}/quote?query=${encodeURIComponent(s)}`,i);return{amountOut:a?.data?.quote?.amountOut,route:a?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Nx(){try{return{ok:!0,chains:Object.keys(pp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cx,pp,mp=v(()=>{W();Cx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${pp[e]||"ethereum"}`,pp={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var hp={};M(hp,{raydiumHealth:()=>$x,raydiumQuote:()=>Px});async function Px({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={},o={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await N(`${Rx}/quote?${i}`,o),a=(s?.routePlan||[]).filter(c=>c?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:a.length,allRoutes:s?.routePlan?.length||0}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function $x(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Rx,yp=v(()=>{W();Rx="https://quote-api.jup.ag/v6"});var gp={};M(gp,{AEVO_API:()=>Ls,aevoHealth:()=>qx,aevoMarkets:()=>Lx});async function Lx(e={}){try{return(await N(`${Ls}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function qx(){try{return{ok:(await N(`${Ls}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ls,bp=v(()=>{W();Ls="https://api.aevo.xyz"});var wp={};M(wp,{compoundHealth:()=>Fx,compoundMarkets:()=>Bx});async function Bx(e={}){try{return((await N(`${Ux}/ctoken`,e))?.cToken||[]).map(r=>({symbol:r?.symbol,underlying:r?.underlying_symbol,supplyApy:r?.supply_rate?.value?`${(Number(r.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:r?.borrow_rate?.value?`${(Number(r.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:r?.total_supply?.value,totalBorrow:r?.total_borrows?.value,collateralFactor:r?.collateral_factor?.value?`${(Number(r.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Fx(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ux,xp=v(()=>{W();Ux="https://api.compound.finance/api/v2"});var Ep={};M(Ep,{yearnHealth:()=>jx,yearnVaults:()=>Mx});async function Mx(e={}){try{return(await N(`${Dx}/vaults/all`,e)||[]).map(r=>({name:r?.name,symbol:r?.symbol,apy:r?.apy?.net_apy?`${(Number(r.apy.net_apy)*100).toFixed(2)}%`:null,tvl:r?.tvl?.tvl_deposited,chain:r?.chainId,type:r?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function jx(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Dx,Sp=v(()=>{W();Dx="https://api.yearn.fi/v1"});var kp={};M(kp,{convexHealth:()=>Vx,convexPools:()=>zx});async function zx(e={}){try{return(await N(`${Hx}/pools`,e)||[]).map(r=>({name:r?.curvePool?.name||r?.name,curveApy:r?.curvePool?.apy?`${(Number(r.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:r?.apy?`${(Number(r.apy)*100).toFixed(2)}%`:null,tvl:r?.tvl,boosted:r?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Vx(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Hx,Ap=v(()=>{W();Hx="https://api.convexfinance.com/api"});function Tt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ye(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Tt(t),Object.freeze({mantissa:e,scale:t})}function ht(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Tt(e.scale)}function co(e){return Tt(e),10n**BigInt(e)}function F(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return Ye(s,o.length)}function we(e,t){if(Tt(t),typeof e=="bigint")return Ye(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ye(BigInt(e),t)}function qe(e){ht(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function Hr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*co(t-e.scale),t):Ye(e.mantissa/co(e.scale-t),t)}function qs(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Hr(e,r),Hr(t,r),r]}function yt(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa+n.mantissa,o)}function zr(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa-n.mantissa,o)}function Ae(e,t){ht(e,"left"),ht(t,"right");let r=e.scale+t.scale;return Tt(r),Ye(e.mantissa*t.mantissa,r)}function Ue(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(ht(e,"left"),ht(t,"right"),Tt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*co(t.scale+r),o=t.mantissa*co(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=qs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var WO,Oe=v(()=>{WO=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Ip,readFileSync as Wx}from"node:fs";import{dirname as vp,join as Us}from"node:path";import{fileURLToPath as Gx}from"node:url";function Kx(e){let t=vp(Gx(e));for(let r=0;r<8;r+=1){let n=Us(t,"package.json");if(Ip(n))try{let i=JSON.parse(Wx(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=vp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function _p(e,t){let r=Kx(t),n=Us(r,e);return Ip(n)?n:Us(r,"dist","assets",e)}var Op=v(()=>{});import{readFileSync as Xx,existsSync as Yx}from"node:fs";import{fileURLToPath as Qx}from"node:url";import{dirname as Jx,join as Tp}from"node:path";function eE(){try{let e=_p("equities-fixtures",import.meta.url);if(e&&Yx(e))return e}catch{}return Zx}function rE(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function V(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){rE(e)||V(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&V(t,`${r} must be a nonempty string`)}function Qe(e,t,r){Number.isSafeInteger(e)||V(t,`${r} must be a safe integer`)}function bt(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function nE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];oe(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),bt(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))bt(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function oE(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||V(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function iE(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Qe(e[r],t,r);G(e.usdg,t,"usdg"),bt(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&V(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&V(t,`assets.${r}.usd must be a nonnegative finite source number`)}function sE(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||V(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&V(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>Qe(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&V(t,`dates[${o}] must use YYYY-MM-DD`)})}function aE(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&V(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Qe(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&V(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&V(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function cE(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&V(t,`${r}.liq must be a nonnegative finite source number`)}}function uE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),Qe(e.block,t,"block"),Qe(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),bt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&V(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&V(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&V(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&V(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function lE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&V(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&V(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())oe(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())oe(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function dE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function pE(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&V(t,'chain must be "ton"'),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function mE(e,t){let r=Np[t],n=Tp(e,r),o;try{o=Xx(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return fE[t](i,r),i}function Rp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Rp(t)}return e}function Bs({fixtureDir:e=tE}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Np))t[r]=mE(e,r);return Rp(t)}function st(){return Cp??=Bs(),Cp}function ve(){return st().venues}function Pp(){return st().universe}function $p(){return st().oracles}function Lp(){return st().nyseHolidays}function qp(){return st().dstTransitions}function uo(){return st().rhPoolState}function Up(){return st().solanaXstocks}function Bp(){return st().tonXstocks}function Fp(){return st().hip3L2Books}var Zx,tE,Np,fE,Cp,Be=v(()=>{Op();Zx=Tp(Jx(Qx(import.meta.url)),"fixtures");tE=eE(),Np=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});fE=Object.freeze({venues:nE,universe:oE,oracles:iE,nyseHolidays:sE,dstTransitions:aE,equityDexPools:cE,rhPoolState:uE,solanaXstocks:dE,tonXstocks:pE,hip3L2Books:lE})});function gE(){let e=qp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ds,endMs:n.endUtc*Ds}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function Gp(){return Mp??=gE(),Mp}function bE(){return Fs===void 0&&(Fs=new Set(Lp().holidayDayIndex)),Fs}function Kp(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function wE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Gp();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function xE(e){for(let t of Gp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function EE(e){return xE(e)?yE:hE}function SE(e){let t=e+EE(e),r=Math.floor(t/Dp),n=t-r*Dp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/jp),msIntoDay:n,weekday:o.getUTCDay()}}function kE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!bE().has(e)}function AE(e){return e<Hp?"dark":e<zp?"extended":e<Vp?"core":e<Wp?"extended":"dark"}function Vr(e){Kp(e,"sessionState"),wE(e,"sessionState");let t=SE(e);return kE(t)?AE(t.minuteOfDay):"dark"}function js(e){return Kp(e,"isDark"),Vr(e)==="dark"}var Ds,jp,Ms,Dp,hE,yE,Hp,zp,Vp,Wp,oC,iC,Mp,Fs,lo=v(()=>{Be();Ds=1e3,jp=60*Ds,Ms=60*jp,Dp=24*Ms,hE=-5*Ms,yE=-4*Ms,Hp=240,zp=570,Vp=960,Wp=1200,oC=Object.freeze([Hp,zp,Vp,Wp]),iC=Object.freeze(["core","extended","dark"])});function fo(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function _E(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function OE(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function Xp(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function mo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??vE,o=t.oracleFreshnessMs??IE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(_E(c)){i?s.push(Object.freeze({...c,staleData:!0})):fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(OE(c)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Xp(c,r,n)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=Vr(r),d=u==="core"?o:o*2;if(Xp(c,r,d)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var po,vE,IE,Hs=v(()=>{Oe();lo();po=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),vE=12e4,IE=6e5});function CE(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[a,c=""]=s.split("."),u=`${a}${c}`,d=a.length+o,l;return d<=0?l=`0.${"0".repeat(-d)}${u}`:d>=u.length?l=`${u}${"0".repeat(d-u.length)}`:l=`${u.slice(0,d)}.${u.slice(d)}`,`${i?"-":""}${l}`}function le(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(CE(e))}function Fe(e,t){let r=le(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Nt=v(()=>{Oe()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function Jp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){Jp(e)||Z(t,"must be an object")}function Zp(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function or(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function Wr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Vs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function zs(e,t,r=!1){e===null&&r||(Jp(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function ho(e,t,r=!1){e===null&&r||Rt(e,t)}function Qp(e,t){Rt(e,t),or(e.venue,`${t}.venue`),or(e.reason,`${t}.reason`),qE.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&or(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Yp,"costAccounted","capturedAt","blockOrSeq","raw"])Zp(e,r,"quote");or(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),Wr(e.instrument,TE,"quote.instrument"),Wr(e.tier,NE,"quote.tier"),or(e.symbolRaw,"quote.symbolRaw"),or(e.symbol,"quote.symbol"),Wr(e.side,RE,"quote.side"),zs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of LE)Object.hasOwn(e,r)&&(zs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of Yp)zs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Vs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Rt(e.raw,"quote.raw"),e}function yo(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Zp(e,t,"rankResult");return Wr(e.rankedOn,PE,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>ho(t,`rankResult.ranked[${r}]`)),ho(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>ho(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Vs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Vs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Qp(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Qp(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),Wr(e.instrumentMix,$E,"rankResult.instrumentMix"),ho(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var TE,NE,RE,PE,$E,LE,Yp,qE,at=v(()=>{TE=new Set(["spot","perp"]),NE=new Set(["read-only","quote-only","prepare","intent"]),RE=new Set(["buy","sell"]),PE=new Set(["net-of-cost","gross"]),$E=new Set(["homogeneous","heterogeneous"]),LE=["bid","ask","mid","mark"],Yp=["fees","gasEstimate","priceImpact","fundingHourly"],qE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function ef(){return ve().venues.arcus}function DE(){return Object.keys(ef().markets).sort()}function ME({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=ef().markets[n];if(!o)return null;let i=Fe(o.mark,`${n}.mark`),s=le(o.oracle),a=le(o.fundingHourly),c=r===null?F("0"):r,u={venue:UE,chain:BE,instrument:"perp",tier:FE,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:go,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),xe(u)}function bo({side:e="buy",sizeUsd:t=null}={}){return DE().map(r=>ME({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var UE,BE,FE,go,Ws=v(()=>{Be();Nt();Oe();at();UE="arcus_perp",BE="robinhood-4663",FE="quote-only",go="0.00000480324074074"});function Gs(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return F("0");let n=F(String(t)),o=we(10000n,0);return Ae(Ae(e,n),o)}function rf(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=jE(n,t),c=t-a,u=F(go),d=Gs(i,c),l=Gs(u,a),p=Math.max(d.scale,l.scale),f={mantissa:d.mantissa*10n**BigInt(p-d.scale)+l.mantissa*10n**BigInt(p-l.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:qe(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:go,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Gs(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:qe(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function jE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)js(e+o*tf)&&(r+=1);return t>n&&js(e+n*tf)&&(r+=t-n),r}var tf,SC,nf=v(()=>{Oe();Ws();lo();tf=36e5,SC=24*365});function HE(e){return e.mid??e.mark??e.ask??e.bid??null}function zE(e){let t=HE(e);if(t===null)return null;let r=e.costAccounted===!0,n=F("0");e.fees!==null?n=yt(n,e.fees):r=!1,e.priceImpact!==null?n=yt(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=yt(n,e.gasEstimate);let o;if(e.fees!==null&>(e.fees,F("1"))<0&>(e.fees,F("0"))>=0){let i=yt(F("1"),e.fees);o=Ae(t,i),e.priceImpact!==null&&(o=yt(o,Ae(t,e.priceImpact)))}else o=yt(t,n);return{net:o,costAccounted:r,px:t}}function VE(e,t,r=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:r,quote:e}}function WE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=zr(t.net,e.net);return Ue(Ae(r,we(10000n,0)),t.net,4)}function wo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let b=mo(e,{nowMs:r});o=b.survivors,i=b.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,d=[];for(let b of o){let y=zE(b);if(y===null)continue;let k=null;if(u&&b.instrument==="perp"&&(k=rf(b,c,{nowMs:r}),k.carryBps!==null)){let S=yt(F("1"),Ue(k.carryBps,we(10000n,0),12));y.net=Ae(y.net,S),y.costAccounted=!1}d.push(VE(b,y,k))}let l=d,p="homogeneous";if(u)p="heterogeneous",l=d;else{let b=d.filter(k=>k.instrument==="spot"),y=d.filter(k=>k.instrument==="perp");b.length>0&&y.length>0?(l=b.length>=y.length?b:y,p="homogeneous"):(l=d,p="homogeneous")}l.sort((b,y)=>{let k=gt(b.net,y.net);return k!==0?k:b.venue<y.venue?-1:b.venue>y.venue?1:0});let f=l[0]??null,m=l.slice(1),g=l,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:WE(f,m[0]),E=d.find(b=>b.tier==="prepare")??null,_=Vr(r),x=_==="core"?null:{session:_,warning:_==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},O=null;u&&(O=GE(d));let A={rankedOn:h,ranked:g,winner:f,runnersUp:m,improvementBps:w===null?null:Number(qe(w)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:O};return yo(A)}function GE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>gt(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>gt(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=zr(t.net,r.net);if(n.mantissa===0n)return 0;let o=Ae(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=Ue(n,o,4),s=Number(qe(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Ks=v(()=>{Hs();nf();lo();Oe();at()});function Xs(){return uo()}function ZE(e){return{mantissa:e*e*10n**BigInt(ir)/QE,scale:ir}}function eS(e){let t=ZE(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ue(Ae(t,we(10n**BigInt(r),0)),we(10n**BigInt(n),0),ir);return o.mantissa===0n?null:Ue(F("1"),o,ir)}return Ue(Ae(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),ir)}function tS(e){let t=$p(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function rS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,nS(r,t),ir)}function nS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Hr(e,r).mantissa+Hr(t,r).mantissa,scale:r}}function oS(e){let t=Xs(),r=JE[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ys(){return Object.keys(Xs().pools).sort()}function sr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Xs(),o=n.pools[e];if(!o)return null;let i=eS(o);if(i===null)return null;let s=le(o.liqUsd),a=r===null?F("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:Ue(we(BigInt(o.feePpm),0),we(1000000n,0),8),u=a.mantissa===0n?F("0"):rS(s,a),d=oS(o.version),f={venue:KE,chain:XE,instrument:"spot",tier:YE,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:d===null?null:d.wei.toString(),gasUnits:d===null?null:d.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},m=tS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=qe(Ue(Ae(zr(i,m),we(10000n,0)),m,4))),xe(f)}function of({side:e="buy",sizeUsd:t=null}={}){return Ys().map(r=>sr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var KE,XE,YE,QE,ir,JE,Qs=v(()=>{Be();Nt();Oe();at();KE="rh_uniswap",XE=4663,YE="prepare",QE=1n<<192n,ir=18,JE=Object.freeze({v3:180000n,v4:240000n})});function xo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=sr({symbol:t,side:r,sizeUsd:n});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>sf)throw new Error(`quote is stale (${a}ms old, bound ${sf}ms); re-quote before preparing`);let u=uo().pools[t],d=u.version==="v4"?sS:iS,l=d,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:d,data:"0x",value:"0",requiresApproval:{spender:l,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var sf,iS,sS,Js=v(()=>{Qs();Be();sf=12e4,iS="0x0000000000000000000000000000000000000000",sS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Gr(){return ve().venues.hyperliquid_hip3}function af(){return Object.keys(Gr().dexs).sort()}function lS(){let e=[];for(let[t,r]of Object.entries(Gr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function dS(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=Gr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Gr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function pS(e,t){try{return Fp().books[`${e}:${t}`]??null}catch{return null}}function fS(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(qe(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),d=Number(c.sz);if(!(u>0)||!(d>0))continue;let l=u*d,p=Math.min(o,l),f=p/u;if(i+=p,s+=f,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function mS(e,t,r,n){let o=fS(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(qe(n));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:le(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function cf({dex:e,ticker:t,market:r,side:n,size:o}){let i=Fe(r.mark,`${e}:${t}.mark`),s=le(r.fundingHourly),a=le(r.vol24h),c=le(r.oi),u=o===null?F("0"):o,d=pS(e,t),l=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(d){let h=mS(d,n,u,i);l=h.impact,p=h.depth,p?.fullyFilled?f="impact measured from l2Book; fees and gas still not captured":f="book walked but size exceeds visible depth; fees and gas not captured"}else f="no order book depth wired for this coin; fees and gas not captured";else d?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let g={venue:aS,chain:cS,instrument:"perp",tier:uS,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:s,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:d!==null,l2BookFixture:d?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(g.raw.vol24hFixed=a),c!==null&&(g.raw.oiFixed=c),d?.bids?.[0]&&d?.asks?.[0]&&(g.bid=F(String(d.bids[0].px)),g.ask=F(String(d.asks[0].px))),xe(g)}function uf({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=dS(e);return n.length===0||n.length>1?null:cf({...n[0],side:t,size:r})}function Eo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of lS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Gr().dexs[i][s];n.push(cf({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var aS,cS,uS,lf=v(()=>{Be();Nt();Oe();at();aS="hyperliquid_hip3",cS="hyperliquid",uS="quote-only"});function df(){return ve().venues.arcus_spot}function bS(){return Object.keys(df().pairs).sort()}function wS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=df().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Fe(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Fe(n.ask,`${e}.ask`),s=le(n.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let l=Math.max(o.scale,i.scale),p=o.scale===l?o.mantissa:o.mantissa*10n**BigInt(l-o.scale),f=i.scale===l?i.mantissa:i.mantissa*10n**BigInt(l-i.scale);a={mantissa:p+f,scale:l+1},a={mantissa:(p+f)/2n,scale:l}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=r===null?F("0"):r,u=F("0"),d={venue:hS,chain:yS,instrument:"spot",tier:gS,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:ve().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(d.bid=o),i!==null&&(d.ask=i),a!==null&&(d.mid=a),xe(d)}function So({side:e="buy",sizeUsd:t=null}={}){return bS().map(r=>wS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var hS,yS,gS,pf=v(()=>{Be();Nt();Oe();at();hS="arcus_spot",yS="robinhood-4663",gS="quote-only"});function ko(){return Up()}function Zs(){return Object.keys(ko().tokens).sort()}function kS(e){let t=ko().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function AS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ea({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=ko().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=kS(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):AS(u,d),p=!1;d.mantissa===0n&&(a.liquidityUsd??0)>=ff&&(p=!1);let f={venue:xS,chain:ES,instrument:"spot",tier:SS,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:p,capturedAt:ko().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<ff}};return xe(f)}function mf({side:e="buy",sizeUsd:t=null}={}){return Zs().map(r=>ea({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var xS,ES,SS,ff,hf=v(()=>{Be();Nt();Oe();at();xS="solana_xstocks",ES="solana",SS="quote-only",ff=25e3});function Ao(){return Bp()}function ta(){return Object.keys(Ao().tokens).sort()}function TS(e){let t=Ao().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function NS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ra({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Ao().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=TS(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):NS(u,d),f={venue:vS,chain:IS,instrument:"spot",tier:_S,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:Ao().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<OS,impactSizeFractionHint:CS}};return xe(f)}function yf({side:e="buy",sizeUsd:t=null}={}){return ta().map(r=>ra({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var vS,IS,_S,OS,CS,gf=v(()=>{Be();Nt();Oe();at();vS="ton_stonfi",IS="ton",_S="quote-only",OS=25e3,CS=.01});var vo={};M(vo,{bestEquityRoute:()=>RS,collectEquityQuotes:()=>wf,equityVenues:()=>PS,getUniverse:()=>Pp,getVenues:()=>ve,loadFixtures:()=>Bs,prepareEquity:()=>xo,prepareEquityRoute:()=>$S,rankEquityQuotes:()=>wo,toJsonSafe:()=>LS,validateQuote:()=>xe,validateRankResult:()=>yo});function na(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function wf(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=na(t),o=[],i=uf({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Eo({ticker:r,sizeUsd:n}))o.push(u);for(let u of bo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of So({sizeUsd:n}))u.symbol===r&&o.push(u);let s=sr({symbol:r,sizeUsd:n});s&&o.push(s);let a=ea({symbol:r,sizeUsd:n});a&&o.push(a);let c=ra({symbol:r,sizeUsd:n});return c&&o.push(c),o}function RS(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=na(e.sizeUsd??e.size??null),n=wf(t,{sizeUsd:r});if(n.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=n[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=wo(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>bf}}function PS(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Eo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:bo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:So().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ys().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Zs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ta().length}],t=[...Eo(),...bo(),...So(),...of(),...mf(),...yf()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=mo(t,{nowMs:r});return{inventory:e,hip3Dexs:af(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:ve().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function $S(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=na(e.sizeUsd??e.size??null),o=sr({symbol:t,sizeUsd:n});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=xo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>bf}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function LS(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var bf,Io=v(()=>{Oe();Ks();Js();Hs();lf();pf();Ws();Qs();hf();gf();Be();Ks();Js();at();Be();bf=3600*1e3});var _o={};M(_o,{CHAIN_CONFIGS:()=>jr,EVIDENCE:()=>U,RISK:()=>L,SCANNER_CAPABILITIES:()=>Qt,__clearScanners:()=>Nb,createScanner:()=>Pl,getScanner:()=>ps,listScanners:()=>$l,registerBuiltinScanners:()=>no,registerCustomChain:()=>Hd,registerScanner:()=>Hn,scannerCoverage:()=>Rb,validateScanner:()=>Rl});var Oo=v(()=>{ft();oo()});var sa={};M(sa,{createWatch:()=>DS,listWatches:()=>FS,removeWatch:()=>MS});import Kr from"node:fs";import oa from"node:path";import{randomUUID as qS}from"node:crypto";import{homedir as US}from"node:os";function BS(e=process.env){return e.ORACLE_CONFIG_DIR||oa.join(US(),".config","oracle")}function xf(e=process.env){return oa.join(BS(e),"watches.json")}function ia(e=process.env){let t=xf(e);if(!Kr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Kr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Ef(e,t=process.env){let r=xf(t);Kr.mkdirSync(oa.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Kr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
-
`,{mode:384}),Kr.renameSync(n,r)}function
|
|
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 HS,zS,VS,WS,If=v(()=>{HS=/\b0x[a-fA-F0-9]{40}\b/g,zS=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,VS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),WS=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as KS}from"node:child_process";import _f from"node:fs";import ca from"node:path";function JS(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Tf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function ZS(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ca.isAbsolute(t)?_f.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(ca.delimiter)){if(!n)continue;let o=ca.join(n,"xurl");try{if(_f.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function ek(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function tk(e){for(let t of e){let r=String(t);if(Cf.includes(r))return r;if(Cf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function rk(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(d=>String(d)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=tk(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!Tf(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(d=>d==="-X"||d==="--request"),u=String(r[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!YS.includes(o))if(QS.includes(o)){if(!Tf(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...r],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function Nf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!JS(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=rk(t,n);if(!o.ok)return o;let i=ZS(n);if(!i.ok)return i;let a=(r.spawnFn||KS)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Of,maxBuffer:1024*1024,env:ek(n)});if(a.error){let l=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Of}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(l,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,XS),{force:!0}),u=wt(String(a.stderr||"").slice(0,2e3),{force:!0}),d=typeof a.status=="number"?a.status:1;return{ok:d===0,status:d,command:o.command,argv:o.argv.map(l=>/=/.test(l)&&/token|secret|key|bearer/i.test(l)?"[redacted-arg]":l),stdout:c,stderr:u||void 0}}var Of,XS,YS,QS,Cf,LT,Rf=v(()=>{Qo();Of=45e3,XS=4e4,YS=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),QS=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Cf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);LT=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function sk(e){return!e||e==="0x"||e===ik}async function Pf(e={},t={}){let r=t.rpcCall||Y,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await r(o,"eth_getCode",[n,"latest"],t)}catch(m){return{address:n,chainId:o,status:"unavailable",error:m?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:n,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[m,g]of Object.entries(nk))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,d=null,l=null;for(let{label:m,slot:g}of ok)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!sk(h)){u=!0,d=m,l=`0x${String(h).slice(-40)}`;break}}catch{s.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}u&&(a.push({selector:d,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${d}), not the implementation ${l} it delegates to`));let f=a.filter(m=>m.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:f,findings:a,isProxy:u,proxyStandard:d,implementation:l,codeSize:Math.floor(c.length/2),notes:s}}var nk,ok,ik,$f=v(()=>{ot();nk=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),ok=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),ik=`0x${"0".repeat(64)}`});function Co(e,t){let r=String(e||"").trim();if(!ak.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function ua(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function Xr(e,t){return e==null||e===""?null:ua(e,t)}function uk({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let d=a?.tx;if(!d||typeof d!="object")throw new Error("local-signer envelope requires unsigned tx object");let l=Co(d.to,"prepared destination"),p=String(d.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=ua(d.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Xr(d.gasLimit??c.gasLimit,"gasLimit"),g=Xr(d.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!g)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let h=Number(u.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=Gi({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=ke(E,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:l,data:p,value:f,gasLimit:m,maxFeePerGas:g,slippageBps:_.selectedBps,expiresAtMs:h+w},O=Xr(d.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(x.maxPriorityFeePerGas=O),c.nonce!==void 0&&(x.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(x.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(x.l1FeeWei=Xr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=Xr(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:l,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:_.selectedBps,expiresAtMs:h+w,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[x]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function lk(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}no();let r=ps(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function dk({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==L.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==L.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Lf(e={},t={}){let r=Number(e.chainId??ck);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Co(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Co(e.tokenIn,"tokenIn"):null,i=e.recipient?Co(e.recipient,"recipient"):null,s=e.amountIn==null?null:ua(e.amountIn,"amountIn"),a=lk(r,t.scanner),c=t.scanContractRisk||Pf,[u,d,l]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let g={...e,tokenIn:o,amountIn:s,recipient:i},h=dk({token:u,pools:d,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),w=null,E=null,_=null;if(e.prepare===!0&&h.length===0){w=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=uk({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:d?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(x){_=String(x?.message||x).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!E,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:d,topPool:d?.pools?.[0]||null,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,blockedReasons:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:E,localSignerBlockedReason:_,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var ak,ck,qf=v(()=>{oo();ft();Re();$f();ak=/^0x[0-9a-fA-F]{40}$/,ck=4663});var Mf={};M(Mf,{evaluateContracts:()=>Df,fetchAccountTweets:()=>Ff,snipeExecuteEnabled:()=>Uf,tickTwitterCaWatch:()=>gk,twitterSnipeEmitsCard:()=>bk});function Uf(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Bf(e){return String(e||"").trim().replace(/^@/,"")}async function Ff({handle:e,limit:t=5,xurlFn:r=Nf}={},n={}){let o=Bf(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:vf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function hk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Lf({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function yk(e,t){let r=await yl(e,{chainSlug:"solana",stables:[fk,mk]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function Df(e,t={},r={}){let n=Number(t.chainId??pk),o=[];for(let i of e.evm||[])o.push(await hk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await yk(i,r));return o}async function gk(e={},t={}){let r=Bf(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Ff({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Af(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let l=await(t.evaluateFn||Df)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:l})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:Uf(t.env||process.env),hits:i,seen:[...n]}}function bk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var pk,fk,mk,jf=v(()=>{If();Rf();qf();Tr();on();pk=4663,fk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",mk="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as wk}from"ethers";function kk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Sk.has(t.length)&&t.every(r=>wk.en.getWordIndex(r)>=0)}function _k(e){let t=Hf(e);return Ik.has(t)||vk.test(t)}function Hf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Ok(e){let t=Hf(e);return[...xk].some(r=>t.includes(r))}function Ck(e,t,r){if(typeof t=="string"){if(Ek.some(n=>n.test(t))||kk(t))throw new Yr(r);if(Ak.test(t)&&!_k(e))throw new Yr(r)}}function la(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Ck(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>la(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(Ok(o))throw new Yr(i);e[o]!==void 0&&(n[o]=la(e[o],i,o))}return n}function ar(e){return la(e)}var xk,Ek,Sk,Ak,vk,Ik,Yr,da=v(()=>{xk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Ek=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Sk=new Set([12,15,18,21,24]);Ak=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,vk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Ik=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Yr=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as Tk,chmod as To,readFile as Nk,rename as Rk,writeFile as Pk}from"node:fs/promises";import{homedir as $k}from"node:os";import{dirname as zf,join as pa}from"node:path";import Lk from"sql.js";function Po(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Po).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Po(e[t])}`).join(",")}}`}function Vf(e){if(!qk.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function No(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Ro(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Wf(e={}){let t=e.path||Fk;await Tk(zf(t),{recursive:!0,mode:448}),await To(zf(t),448);let r;try{r=await Nk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Lk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
6
|
+
- `)}`);let o=e.capabilities||{},i=Qt.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Qt.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Qt)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function Hn(e){let t=$l(e);return Jt.set(t.chainId,t),t}function ps(e){return Jt.get(Number(e))||null}function Pl(){return[...Jt.values()]}function Fb(){Jt.clear()}function Db(){let e={};for(let t of Jt.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:Jt.size,capabilities:[...Qt],chains:e}}var Qt,U,L,Bb,Jt,ft=v(()=>{Qt=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),L=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Bb=/^0x[0-9a-fA-F]{40}$/;Jt=new Map});function Ll(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:l=!1,meta:d={}}=e||{};if(u||r==null)return{source:t,quality:Pe.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Pr(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:Pr(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 Ul(e,t,{divisor:r=1000n}={}){let n=Pr(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=Pr(i),c=Pr(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 Bl(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:n,impactUnmeasured:o,warnings:s}}function fs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(y=>y.quality!==Pe.FAILED),c=e.filter(y=>y.quality===Pe.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(y=>{let A=BigInt(y.amountOut),E=0n,R=!1,I=!1,$=BigInt(y.oracleFeeBps??0),q=$>0n?A*$/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*l/1e18*d;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 j=E+q,X=A>j?A-j:0n;return{...y,grossOut:A.toString(),netOut:X.toString(),costInDest:E.toString(),oracleFeeInDest:q.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,g=f.reduce((y,A)=>BigInt(A.netOut)>y?BigInt(A.netOut):y,0n),h=y=>g>0n?Number((g-BigInt(y))*10000n/g):0,x=[],S=f.slice().sort((y,A)=>BigInt(A.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,A)=>{let E=h(y.netOut)<=m?0:1,R=h(A.netOut)<=m?0:1;if(n&&m>0&&E!==R)return E-R;if(n&&m>0){let I=y.liquidityUsd??-1,$=A.liquidityUsd??-1;if(I!==$)return $-I}return BigInt(A.netOut)>BigInt(y.netOut)?1:-1}),n&&m>0&&S&&f[0]&&f[0].source!==S.source&&x.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${m} bps`);let O=f.filter(y=>!y.costAccounted).map(y=>y.source);u?O.length&&x.push(`gas not reported by: ${O.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):x.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let w=f[0];if(u&&w&&w.costAccounted===!1){let y=f.find(A=>A.costAccounted&&h(A.netOut)<=m);y&&x.push(`winner ${w.source} has UNMEASURED gas; gas-measured ${y.source} is within ${m} bps and may net more once ${w.source}'s real gas is paid \u2014 prefer it if unsure.`)}let _=f.filter(y=>y.gasEstimated).map(y=>y.source);_.length&&x.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,b=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let y=BigInt(f[0].netOut),A=BigInt(f[1].netOut);A>0n&&(k=Number((y-A)*10000n/A),b=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:k,spreadBasis:b,rankedOn:u?"net-of-cost":"gross",warnings:x}}async function zn(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ll({source:s,error:String(o.reason?.message||o.reason)}):Ll({source:s,...o.value})})}var Pe,ql,Pr,ms=v(()=>{ft();Pe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),ql={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Pr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Fl(e={}){return vn({provider:"oneinch",defaultUrl:Mb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function jb(e={}){return Fl(e).baseUrl}function Dl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Hb(e={}){let t=Dl(e);return In({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Fl(e).trusted)}async function Ml(e={},t={}){if(!Dl(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await N(`${jb(t)}/${r}/quote?${s}`,{headers:Hb(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 Mb,jl=v(()=>{W();Re();es();ge();Mb="https://api.1inch.dev/swap/v6.0"});var Vl={};M(Vl,{UNI_V4_CHAINS:()=>Le,UNI_V4_FEE_TIERS:()=>gs,computeV4PoolId:()=>Gn,decodeV4HookPermissions:()=>ws,uniV4Chains:()=>rw,uniV4Health:()=>nw,uniV4InspectHook:()=>Zb,uniV4PrepareExactIn:()=>tw,uniV4QuoteExactIn:()=>Kn,uniV4QuoteExactOut:()=>ew});import{AbiCoder as zb,Interface as hs,getAddress as Ke,isAddress as ys,keccak256 as Vb}from"ethers";function ws(e){let t=Br(e),r=Number(BigInt(t)&Gb),n=Object.fromEntries(Hl.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Hl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Ur(e){let t=Number(e),r=Le[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Le).join(", ")})`);return{chainId:t,...r}}function Br(e){if(e==null||e==="")return ye;let t=String(e);if(!ys(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function Zt(e,t){let r=Le[Number(t)];if(qr(e))return Ke(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ke(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ke(r.usdc);if(!ys(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function qr(e){let t=String(e||"").trim().toLowerCase();return!t||t===Qb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function Gn({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=Br(o);return Vb(Lr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function xs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:Br(o)},zeroForOne:u}}function 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 Zb(e={},t={}){let r=Ur(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=Zt(e.tokenIn||"WETH",r.chainId),o=Zt(e.tokenOut||r.usdc,r.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Br(e.hooks),{poolKey:c}=xs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Gn(c),l=t.rpcCall||Y,d=Vn.encodeFunctionData("getSlot0",[u]),p=Vn.encodeFunctionData("getLiquidity",[u]),[f,m,g]=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)]),h=Vn.decodeFunctionResult("getSlot0",f),x=Vn.decodeFunctionResult("getLiquidity",m)[0],S=h[0],O=S>0n,w=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,_=!!(i&bs),k=Jb({hook:a,codePresent:w,initialized:O,dynamicFee:_});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:O,sqrtPriceX96:S.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:x.toString(),dynamicFee:_}),hook:Object.freeze({address:a,codePresent:w,codeBytes:w?(g.length-2)/2:0,permissions:ws(a)}),risk:k})}async function Kn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],l=e.hooks||ye,d=[],p=null;for(let b of u){let{poolKey:y,zeroForOne:A}=xs({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:l}),E=Wn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:A,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!R||R==="0x"){d.push({...b,ok:!1,error:"empty result"});continue}let I=Wn.decodeFunctionResult("quoteExactInputSingle",R),$={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:A,poolId:Gn({...y})};d.push($),(!p||BigInt($.amountOut)>BigInt(p.amountOut))&&(p=$)}catch(R){d.push({...b,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let b=d.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let f=e.liquidityUsd==null?await Cr({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>[]):[],m=new Map;for(let b of f){let y=String(b.pairAddress||"").toLowerCase();y&&m.set(y,b)}let g=b=>m.get(String(b.poolId||"").toLowerCase())??null,h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&h>0&&BigInt(p.amountOut)>0n){let b=BigInt(p.amountOut),A=d.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];A&&A.poolId!==p.poolId&&(x={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:g(A).liquidityUsd,bandBps:h},p=A)}let S=g(p),O=f[0]??null,w=S??O,_=e.liquidityUsd??S?.liquidityUsd??O?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":S?"pool":O?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:_,liquiditySource:w,liquidityAttribution:k,liquidityPick:x,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ys(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!qr(e.tokenIn)&&!qr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&bs)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:_,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ew(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Ur(e.chainId??8453),s=Zt(e.tokenIn||"WETH",r),a=Zt(e.tokenOut||Le[r].usdc,r),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...gs],l=e.hooks||ye,d=[],p=null;for(let m of u){let{poolKey:g,zeroForOne:h}=xs({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:l}),x=Wn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:x},"latest"],t);if(!S||S==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let O=Wn.decodeFunctionResult("quoteExactOutputSingle",S),w={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:O[0].toString(),gasEstimate:O[1].toString(),poolKey:g,zeroForOne:h,poolId:Gn({...g})};d.push(w),(!p||BigInt(w.amountIn)<BigInt(p.amountIn))&&(p=w)}catch(S){d.push({...m,ok:!1,error:String(S.message||S).slice(0,160)})}}if(!p){let m=d.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await hl({chainId:r,tokenA:s,tokenB:a,dexIds:zl},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:Le[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function tw(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(w=>Object.hasOwn(e,w)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=Ur(n);if(Br(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&bs)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let s=Ke(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(qr(e.tokenIn)||qr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Kn(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let 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=Lr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,u.zeroForOne,BigInt(u.amountIn),l,0n,"0x"]]),m=Lr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),g=Lr.encode(["address","uint256"],[u.tokenOut,l]),h=Lr.encode(["bytes","bytes[]"],[Xb,[f,m,g]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,O=Wb.encodeFunctionData("execute",[Kb,[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:l.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:O,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function rw(){return Object.entries(Le).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function nw(e={}){let t=Ur(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Lr,ye,Le,gs,Wn,Wb,Vn,Hl,Gb,bs,Kb,Xb,Yb,Qb,zl,Ss=v(()=>{ot();Tr();Re();ge();Lr=zb.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",Le={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},gs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Wn=new hs(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Wb=new hs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Vn=new hs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Hl=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Gb=(1n<<14n)-1n,bs=8388608;Kb="0x10",Xb="0x060c0f",Yb="0x000000000022D473030F116dDEE9F6B43aC78BA3",Qb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";zl=["uniswap-v4","uniswapv4"]});function sw(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||ow).replace(/\/$/,"")}function aw(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||iw).replace(/\/$/,"")}async function Xn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${sw(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wl(e={}){return N(`${aw(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var ow,iw,Es=v(()=>{W();ow="https://coins.llama.fi",iw="https://api.llama.fi"});var Yn={};M(Yn,{ACROSS_API:()=>Gl,HOP_API:()=>Kl,RELAY_API:()=>Xl,acrossHealth:()=>uw,acrossSuggestedFees:()=>Yl,hopHealth:()=>lw,hopQuote:()=>Ql,relayHealth:()=>dw,relayPrepare:()=>pw,relayQuote:()=>ks});async function uw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Yl({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Yl(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Gl).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function lw(e={}){try{let t=await Ql({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ql(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Kl).replace(/\/$/,""),l=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ae(l,{chainId:Number(e.originChainId||e.chainId||cw[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 dw(e={}){try{let t=await ks({user:pt,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function ks(e={},t={}){let{user:r=pt,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=rt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let l=(t.baseUrl||process.env.RELAY_API_URL||Xl).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}:ae(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 pw(e={},t={}){let r=await ks(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:n,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:Ae(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return J({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Gl,Kl,Xl,cw,Qn=v(()=>{W();Re();Sn();ge();Gl="https://across.to/api",Kl="https://api.hop.exchange/v1",Xl="https://api.relay.link",cw={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Jn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Xe(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Zl(e,t={}){let r=ql[Number(e)];if(!r)return null;try{let n=await Xn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function fw(e={}){try{let t=await Wl({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function mw(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Jl[r]||[r]),n.push(...Jl[mt(e)]||[e]),n}function hw(e,t,r={}){let n=Array.isArray(e)?e:[],o=mw(t,r).map(mt).filter(Boolean);for(let i of o){let s=n.find(c=>mt(c?.slug)===i||mt(c?.name)===i),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=mt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:mt(c?.slug).includes(i)||mt(c?.name).includes(i)}),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function As({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:l={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await It({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:Jn(f?.gasCosts),feeUsd:Jn(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&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 Wt({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),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&&d.push({source:"0x",run:async()=>{let p=await Gt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),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&&d.push({source:"1inch",run:async()=>{let p=await Ml({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 Ot({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}}}}),Le[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await Kn({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 ed({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=fw(s),hw(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await It({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:Xe(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Jn(d?.gasCosts),feeUsd:Jn(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(()=>(Qn(),Yn)),p=(await l({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:l}=await Promise.resolve().then(()=>(Qn(),Yn)),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 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(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Xe,mt,Jl,td=v(()=>{Ir();An();On();jl();Pn();jn();Ss();Es();ms();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Jl=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var nd={};M(nd,{QUALITY:()=>Pe,bestBridgeRoute:()=>Fr,bestSwapRoute:()=>er,formatComparisonNote:()=>Zn});async function rd(e,t,r){let n=yw[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await Xn([o],r))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function er(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Zl(r,t),a=rd(r,o,t),c=ul(r,t).catch(()=>null),u=As({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([zn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=fs(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.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 Ul(async O=>{let w=As({...e,amountIn:O.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(k=>k.source===h);return w.length?(await zn(w,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(S){let O=Bl(m,{[h]:S},{maxImpactPct:g});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...O,sourcesTried:u.length,sourcesAnswered:l.filter(w=>w.quality!==Pe.FAILED).length,note:Zn(O,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:l.filter(h=>h.quality!==Pe.FAILED).length,note:Zn(m,u.length)}}async function Fr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=rd(n,i,t),c=ed({...e,opts:t}),[u,l]=await Promise.all([zn(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=fs(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!==Pe.FAILED).length,note:Zn(d,c.length)}}function gw(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Cu(t)}`:""}function Zn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=gw(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 yw,tr=v(()=>{ms();td();kn();Es();ot();yw={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var od={};M(od,{ARTIFACT:()=>it,prepareBestRoute:()=>kw,supportedPreparers:()=>ww});function ww(){return Object.keys(eo)}async function kw(e,t={}){if(Ew.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(!Sw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(xw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let n=await er(e,t);if(!n.best){let h=n.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=eo[o];if(!s){let h=n.routes.find(x=>eo[x.source]&&x.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 x=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",S=[String(h?.message||h),x].filter(Boolean).join(" :: "),O=/allowance/i.test(S),w=!O&&/not enough|insufficient|balance/i.test(S),_,k;O?(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: ${S}`):w?(k="taker-not-funded",_=`${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.`):(k="provider-error",_=`${o} prepare failed: ${S}`);let b=n.routes.find(y=>eo[y.source]&&y.source!==o);return{ok:!1,reason:_,failureKind:k,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??bw,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),x=BigInt(a.amountOut);h>0n&&(u=Number((x-h)*10000n/h),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(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,x)=>Math.max(h,x.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,g=m!=null&&f>0?Math.round(m/f*100):null;return J({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:g},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===it.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===it.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp: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 it,bw,eo,xw,Sw,Ew,id=v(()=>{tr();ge();it=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),bw=100,eo={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(jn(),vl)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Ss(),Vl)),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:it.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Ir(),Ji)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(An(),qu)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:it.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(On(),zu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:it.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(Pn(),sl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:it.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};xw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Sw=/^0x[0-9a-fA-F]{40}$/,Ew=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var sd={};M(sd,{prepareBestBridgeRoute:()=>Ow,supportedBridgePreparers:()=>_w});function _w(){return Object.keys(to)}async function Ow(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(!Aw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(vw.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await Fr(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=to[s];if(!c){let h=i.routes.find(x=>to[x.source]&&x.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 x=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",S=[String(h?.message||h),x].filter(Boolean).join(" :: "),O=/allowance/i.test(S),w=!O&&/not enough|insufficient|balance/i.test(S),_=i.routes.find(k=>to[k.source]&&k.source!==s);return{ok:!1,reason:O?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${S}`:w?`${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:O?"approval-required-first":w?"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(h=>h.chainId!=null&&Number(h.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??Iw,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),x=BigInt(u.amountOut);h>0n&&(f=Number((x-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 l.length>1&&g.push(`This route needs ${l.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: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: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. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var Aw,vw,Iw,to,ad=v(()=>{tr();ge();Aw=/^0x[0-9a-fA-F]{40}$/,vw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Iw=100,to={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Qn(),Yn)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Ir(),Ji)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var ld={};M(ld,{buildTwapSchedule:()=>ud,normalizeTwapParams:()=>cd,prepareTwapChunk:()=>Pw,simulateTwap:()=>Lw});function cd(e={}){let t=Math.max(Cw,Math.min(Tw,Number(e.splits)||Rw)),r=Math.max(.1,Number(e.windowHours)||$w),n=Math.max(Nw,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function ud(e){let t=cd(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function Pw(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await er({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=J(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function Lw(e,{quoteFn:t=er,...r}={}){let n=ud(e),o=[],i=0n,s="unknown";for(let c=0;c<n.params.splits;c++)try{let u=await t({chainId:n.params.chainId,tokenIn:n.params.tokenIn,tokenOut:n.params.tokenOut,amountIn:n.params.chunkSize,taker:n.params.taker},r),l=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=l,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(l),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 Cw,Tw,Nw,Rw,$w,dd=v(()=>{tr();ge();Cw=2,Tw=100,Nw=60,Rw=10,$w=6});async function md({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!pd.has(Number(e))||!pd.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await N(`${fd}/dln/order/quote`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return u.error?{error:String(u.error)}:{estimation:u.estimation??{},order:u.order??{},fixFee:u.fixFee??"0"}}catch(c){return{error:String(c.message||c).slice(0,200)}}}async function hd(){try{return{ok:!0,chainCount:(await N(`${fd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var fd,pd,yd=v(()=>{W();ge();fd="https://dln.debridge.finance/v1.0",pd=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function bd({active:e=!0}={},t={}){let r=Date.now();if(rr.size&&r-gd<qw)return[...rr.values()];try{let n=await N(`${vs}/exchange/currencies?active=${e?"true":"false"}`,t);rr.clear();for(let o of n??[])rr.set(String(o.ticker).toLowerCase(),o);return gd=r,n??[]}catch(n){return rr.size?[...rr.values()]:{error:String(n.message||n).slice(0,200)}}}async function Uw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${vs}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function Bw(e,t,r,{flow:n="standard"}={},o={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await N(`${vs}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function wd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Uw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Bw(e,t,s,{flow:n},o);if(a.error)return a;let c=await bd({},o),u=c.find(d=>String(d?.ticker).toLowerCase()===String(e).toLowerCase()),l=c.find(d=>String(d?.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??l?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function xd(){try{let e=await bd();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var vs,rr,gd,qw,Sd=v(()=>{W();vs="https://api.changenow.io/v2",rr=new Map,gd=0,qw=6e5});async function Ed({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(`${Fw}/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 Fw,kd=v(()=>{W();Fw="https://api.squidrouter.com/v1"});async function Ad({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),c=await N(`${Dw}/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 Dw,vd=v(()=>{W();Dw="https://api.stargate.finance"});async function Id({fromAsset:e,toAsset:t,amount:r,destination:n}={},o={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await N(`${Mw}/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 Mw,_d=v(()=>{W();Mw="https://midgard.ninerealms.com/v2"});async function Od({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!r||!n||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await N(`${jw}/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 jw,Cd=v(()=>{W();jw="https://api.socket.tech/v2"});async function Td({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={},i={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},a=await N(`${Hw}/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 Hw,Nd=v(()=>{W();Hw="https://api.connext.network"});async function Rd({fromChain:e,toChain:t,token:r,amount:n}={},o={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await N(`${zw}/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 zw,$d=v(()=>{W();zw="https://api.portalbridge.com/v1"});function Vw(e,t){return`0x${_s.getAmountsOut}`+Oe(e)+Oe(64)+Oe(t.length)+t.map(Dr).join("")}function Ww(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Is(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Gw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Os)throw new Error(`slippageBps ${r} exceeds the ${Os} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Pd(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:Vw(i,s)},"latest"],a);return Ww(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Is(c.scanner);if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let 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:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:U.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Is(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let l=await n(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:L.FAIL,evidence:U.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:L.FAIL,evidence:U.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:L.FAIL,evidence:U.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)),g=L.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(g=L.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(g=L.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:g,reason:h,amountIn:String(i),bought:d.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:l},d={}){let p=d.scanner,f=Is(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=l||[o,i],g=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(g.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${g.evidence}: ${g.reason??"no reason given"})`);let h=Gw(g.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let x=BigInt(Math.floor(Date.now()/1e3)+Number(u)),S=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,O=S?`0x${_s.swapExactETHForTokens}`+Oe(h)+Oe(128)+Dr(a)+Oe(x)+Oe(m.length)+m.map(Dr).join(""):`0x${_s.swapExactTokensForTokens}`+Oe(s)+Oe(h)+Oe(160)+Dr(a)+Oe(x)+Oe(m.length)+m.map(Dr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:O,value:S?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Os,deadline:x.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 _s,Oe,Dr,Os,Ld=v(()=>{ot();ft();_s={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Oe=e=>BigInt(e).toString(16).padStart(64,"0"),Dr=e=>e.slice(2).toLowerCase().padStart(64,"0");Os=100});function Xw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Ts)throw new Error(`slippageBps ${r} exceeds the ${Ts} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Cs(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Bd(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${qd.quoteExactInputSingle}`+Mr(s)+Mr(a)+Ct(c)+Ct(u)+Ct(0),p=await Y(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 Kw){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=Cs(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Ud.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best: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:U.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:U.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=Cs(c.scanner,"quoter"),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:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||d||(l[0]&&p!==l[0]?l[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:L.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let g=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!g.best){let _=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 b=await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c);if(b.best){let y=b.best.amountOut,A=Number(y*10000n/BigInt(s)),E=L.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return A<5e3?(E=L.FAIL,R=`round trip vs dollar book returns only ${(A/100).toFixed(2)}% -- punitive tax or no real liquidity`):A<9e3&&(E=L.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:E,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:y.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:g.best.amountOut},c);if(!h.best){let _=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),b=k.best?await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c):{best:null};if(k.best&&b.best){let y=b.best.amountOut,A=Number(y*10000n/BigInt(s)),E=L.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return A<5e3?(E=L.FAIL,R=`dollar-book round trip returns only ${(A/100).toFixed(2)}%`):A<9e3&&(E=L.CAUTION,R=`dollar-book round trip returns ${(A/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:E,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:y.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:L.FAIL,evidence:U.LIVE,leg:"sell",bought:g.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let x=h.best.amountOut,S=Number(x*10000n/BigInt(s)),O=L.PASS,w="round trip completes with expected fee/impact loss";return S<5e3?(O=L.FAIL,w=`round trip returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(O=L.CAUTION,w=`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:O,reason:w,amountIn:String(s),bought:g.best.amountOut.toString(),returned:x.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:l},d={}){let p=Cs(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(!Ud.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!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,g=Xw(f.amountOut,u);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),x=`0x${qd.exactInputSingle}`+Mr(i)+Mr(s)+Ct(m)+Mr(c)+Ct(a)+Ct(g)+Ct(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:x,value:h?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:g.toString(),slippageBps:u,maxSlippageBps:Ts,fee:m},requires:h?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Kw,qd,Ct,Mr,Ud,Ts,Fd=v(()=>{ot();ft();Kw=[100,500,3e3,1e4],qd={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Mr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Ud=/^0x[0-9a-fA-F]{40}$/,Ts=100});function Dd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Md(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function 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 Un(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await ll(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await pl({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,ro.decimals,o).catch(()=>null),r(n,ro.symbol,o).catch(()=>null),r(n,ro.name,o).catch(()=>null),r(n,ro.totalSupply,o).catch(()=>null)]),u=Dd(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Md(s?.result??s),name:Md(a?.result??a),totalSupply:(Dd(c?.result??c)??null)?.toString()??null,evidence:l?U.LIVE:U.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:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Fn(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(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=Bn(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:ml(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],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 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:[d,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:l.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=L.PASS,a=l=>{let d={[L.PASS]:0,[L.CAUTION]:1,[L.UNKNOWN]:2,[L.FAIL]:3};d[l]>d[s]&&(s=l)},c=await this.resolveToken(n,o);c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:L.UNKNOWN,detail:c.warning}),a(L.UNKNOWN)):i.push({check:"erc20-metadata",result:L.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:L.UNKNOWN,detail:u.reason}),a(L.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:L.FAIL,detail:"no pool with liquidity found"}),a(L.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:L.CAUTION,detail:`top pool only $${d}`}),a(L.CAUTION)):i.push({check:"liquidity",result:L.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:L.CAUTION,detail:"pool under 24h old"}),a(L.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:L.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:L.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(L.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ns(e){let r={...Yw(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Bd({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,Pd({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var ro,jd=v(()=>{ot();Tr();ft();Ld();Fd();us();ro={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function no(){return jr.map(e=>Hn(Ns(e)))}function Hd(e){return Hn(Ns(e))}var jr,oo=v(()=>{jd();ft();jr=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Xd,getAddress as Qw,id as Yd}from"ethers";function nr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function Ps(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function io(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function mx(e,t){try{return Qw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function hx(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Kd(e){return`0x${String(e).slice(-40).toLowerCase()}`}function yx({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>cx)return"stale"}return"scoped"}function gx(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 bx(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(nr(r)){let a=Ps(Wd,o,ux);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=zd.encodeFunctionData(d,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:zd.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 nr(r)&&io(Wd,o,l,px),l})();return n?.set(o,s),s}async function wx(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Zw,1),ex),o=await Un(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[Jw,hx(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}:${Kd(l)}`,{token:u,spender:Kd(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function xx(e){return(ix[e]||[]).flatMap(r=>rx.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function Sx(e,t,r={}){let n=[],o="direct-probe",i=null,s=xx(e),a=$s(e),c=nr(r)&&Ps(Rs,e,lx)?.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 wx(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},nr(r)&&io(Rs,e,!0,64)}catch{if(nr(r)&&io(Rs,e,!1,64),n=s,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,d=(await un(n,r.concurrency||4,async f=>{try{let m=await dl({chainId:e,token:f.token,owner:t,spender:f.spender},r),g=BigInt(m.allowance);if(g<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await bx(e,f.token,r,u),x=g>=ax,S=tx[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:gx(g,h.decimals,x),unlimited:x,lastActivityAt:null,risk:yx({unlimited:x,spenderLabel:S,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await kx(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:$s(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 Ex(e,t,r,n,o){try{let i=Vd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Vd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function $s(e){return(ox[e]||[]).flatMap(r=>nx.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function kx(e,t,r){let n=$s(e);return n.length===0?[]:(await un(n,r.concurrency||4,async i=>await Ex(e,i.collection,t,i.operator,r)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Qd(e={},t={}){let r=mx(e.owner||e.address,"owner"),n=new Map(jr.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=nr(t)&&!e.refresh;if(s){let f=Ps(Gd,i,dx);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await un(o,e.concurrency||3,f=>Sx(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&&io(Gd,i,p,fx),{...p,cached:!1,cachedAgeMs:0}}var zd,Vd,Jw,gO,Zw,ex,tx,rx,nx,ox,ix,sx,ax,cx,ux,lx,dx,px,fx,Wd,Rs,Gd,Jd=v(()=>{oo();W();ot();zd=new Xd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Vd=new Xd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Jw=Yd("Approval(address,address,uint256)"),gO=Yd("ApprovalForAll(address,address,bool)"),Zw=1e4,ex=2e5,tx=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)"}),rx=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"}]),nx=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"}]),ox=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"}]}),ix=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}]}),sx=(1n<<256n)-1n,ax=sx/2n,cx=4320*60*60*1e3,ux=360*60*1e3,lx=600*1e3,dx=45*1e3,px=512,fx=128,Wd=new Map,Rs=new Map,Gd=new Map});var tp={};M(tp,{aggregateBridgeQuotes:()=>Zd,bridgeAggregatorHealth:()=>vx,checkRevokeNeeded:()=>ep,scanBridgeRoutes:()=>Ax});async function Zd(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:l=18,toDecimals:d=18}=e,p=[],f=[],m=md({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(y=>y.error?(f.push(`debridge: ${y.error}`),null):{provider:"debridge",amountOut:y.estimation?.dstChainTokenOut?.amount??y.estimation?.toAmount,feeUsd:y.estimation?.fixFee??y.fixFee,estimatedTime:y.estimation?.execution?.estimatedTransferTime?`${y.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:y}).catch(y=>(f.push(`debridge: ${y.message}`),null)),g=Fr({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(y=>!y||y.error?(f.push(`lifi: ${y?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:y.amountOut??y.quote?.amountOut,feeUsd:y.feeUsd??y.totalFee,estimatedTime:y.estimatedTime??y.duration??"unknown",preparable:!!y.transaction,raw:y}).catch(y=>(f.push(`lifi: ${y.message}`),null)),h=Ed({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((A,E)=>A+(Number(E.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),x=Ad({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(y=>y.error?(f.push(`stargate: ${y.error}`),null):{provider:"stargate",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"1-5 min",preparable:!1,raw:y}).catch(y=>(f.push(`stargate: ${y.message}`),null)),S=Id({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(y=>y.error?(f.push(`thorchain: ${y.error}`),null):{provider:"thorchain",amountOut:y.expectedAmountOut,feeUsd:y.fees?.total,estimatedTime:y.estimatedTime||"10-30 min",preparable:!1,raw:y}).catch(y=>(f.push(`thorchain: ${y.message}`),null)),O=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let y=await wd({fromTicker:c,toTicker:u,fromAmount:s},t);return y.error?(f.push(`changenow: ${y.error}`),null):{provider:"changenow",amountOut:y.toAmount,feeUsd:y.networkFee,estimatedTime:y.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:y.kycRequired,raw:y}}catch(y){return f.push(`changenow: ${y.message}`),null}})(),w=Od({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(y=>y.error?(f.push(`bungee: ${y.error}`),null):{provider:"bungee",amountOut:y.amountOut,feeUsd:y.feeUsd,estimatedTime:y.estimatedTime,preparable:!1,raw:y}).catch(y=>(f.push(`bungee: ${y.message}`),null)),_=Td({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(y=>y.error?(f.push(`connext: ${y.error}`),null):{provider:"connext",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-20 min",preparable:!1,raw:y}).catch(y=>(f.push(`connext: ${y.message}`),null)),k=Rd({fromChain:r,toChain:n,token:o,amount:s},t).then(y=>y.error?(f.push(`wormhole: ${y.error}`),null):{provider:"wormhole",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-15 min",preparable:!1,raw:y}).catch(y=>(f.push(`wormhole: ${y.message}`),null)),b=await Promise.allSettled([m,g,h,x,S,w,_,k,O]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,A)=>{let E=Number(y.amountOut??0),R=Number(A.amountOut??0);return E!==R?R-E:y.preparable&&!A.preparable?-1:!y.preparable&&A.preparable?1:0}),{providers:p.map(y=>y.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function ep({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Qd({chainIds:[e],address:t},n)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?i.find(a=>String(a.token).toLowerCase()===String(r).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function Ax(e={},t={}){let[r,n]=await Promise.all([Zd(e,t),ep({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=r.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:r.providers,runnersUp:r.runnersUp,revokeCheck:n,errors:r.errors,confidence:r.providers.length>=2?.85:r.providers.length===1?.6:.1}}async function vx(){let[e,t]=await Promise.all([hd().catch(r=>({ok:!1,error:r.message})),xd().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var HO,rp=v(()=>{tr();yd();Sd();kd();vd();_d();Cd();Nd();$d();Jd();HO=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var np={};M(np,{DYDX_API:()=>so,dydxHealth:()=>Ox,dydxMarkets:()=>Ix,dydxOrderbook:()=>_x});async function Ix(e=50,t={}){try{return((await N(`${so}/v4/perpetualMarkets?limit=${e}`,t))?.markets||[]).map(n=>({ticker:n?.ticker,oraclePrice:n?.oraclePrice,indexPrice:n?.indexPrice,nextFundingRate:n?.nextFundingRate?`${(Number(n.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:n?.openInterest,volume24h:n?.volume24H}))}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function _x(e){try{let t=await N(`${so}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Ox(){try{return{ok:!0,serverTime:(await N(`${so}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var so,op=v(()=>{W();so="https://api.dydx.exchange"});var sp={};M(sp,{DRIFT_API:()=>ip,driftHealth:()=>Tx,driftMarkets:()=>Cx});async function Cx(e={}){try{return((await N(`${ip}/v2/markets`,e))?.markets||[]).map(r=>({symbol:r?.symbol||r?.marketIndex,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Tx(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ip,ap=v(()=>{W();ip="https://dlob.drift.trade"});var cp={};M(cp,{VERTEX_API:()=>ao,vertexHealth:()=>$x,vertexMarkets:()=>Nx,vertexOrderbook:()=>Rx});async function Nx(e={}){try{return((await N(`${ao}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets||[]).map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Rx(e){try{let r=(await N(`${ao}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function $x(){try{return{ok:!0,status:(await N(`${ao}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ao,up=v(()=>{W();ao="https://gateway.prod.vertexprotocol.com/v2"});var lp={};M(lp,{pancakeHealth:()=>qx,pancakeQuote:()=>Lx});async function Lx({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(`${Px}/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 qx(){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 Px,dp=v(()=>{W();Px="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var fp={};M(fp,{sushiHealth:()=>Fx,sushiQuote:()=>Bx});async function Bx({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(`${Ux(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 Fx(){try{return{ok:!0,chains:Object.keys(pp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ux,pp,mp=v(()=>{W();Ux=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${pp[e]||"ethereum"}`,pp={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var hp={};M(hp,{raydiumHealth:()=>jx,raydiumQuote:()=>Mx});async function Mx({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(`${Dx}/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 jx(){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 Dx,yp=v(()=>{W();Dx="https://quote-api.jup.ag/v6"});var gp={};M(gp,{AEVO_API:()=>Ls,aevoHealth:()=>zx,aevoMarkets:()=>Hx});async function Hx(e={}){try{return(await N(`${Ls}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function zx(){try{return{ok:(await N(`${Ls}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ls,bp=v(()=>{W();Ls="https://api.aevo.xyz"});var wp={};M(wp,{compoundHealth:()=>Gx,compoundMarkets:()=>Wx});async function Wx(e={}){try{return((await N(`${Vx}/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 Gx(){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 Vx,xp=v(()=>{W();Vx="https://api.compound.finance/api/v2"});var Sp={};M(Sp,{yearnHealth:()=>Yx,yearnVaults:()=>Xx});async function Xx(e={}){try{return(await N(`${Kx}/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 Kx,Ep=v(()=>{W();Kx="https://api.yearn.fi/v1"});var kp={};M(kp,{convexHealth:()=>Zx,convexPools:()=>Jx});async function Jx(e={}){try{return(await N(`${Qx}/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 Zx(){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 Qx,Ap=v(()=>{W();Qx="https://api.convexfinance.com/api"});function Tt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ye(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Tt(t),Object.freeze({mantissa:e,scale:t})}function ht(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Tt(e.scale)}function co(e){return Tt(e),10n**BigInt(e)}function F(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return Ye(s,o.length)}function we(e,t){if(Tt(t),typeof e=="bigint")return Ye(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ye(BigInt(e),t)}function qe(e){ht(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function Hr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*co(t-e.scale),t):Ye(e.mantissa/co(e.scale-t),t)}function qs(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Hr(e,r),Hr(t,r),r]}function yt(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa+n.mantissa,o)}function zr(e,t){let[r,n,o]=qs(e,t);return Ye(r.mantissa-n.mantissa,o)}function ve(e,t){ht(e,"left"),ht(t,"right");let r=e.scale+t.scale;return Tt(r),Ye(e.mantissa*t.mantissa,r)}function Ue(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(ht(e,"left"),ht(t,"right"),Tt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*co(t.scale+r),o=t.mantissa*co(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=qs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var eC,Ce=v(()=>{eC=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Ip,readFileSync as eS}from"node:fs";import{dirname as vp,join as Us}from"node:path";import{fileURLToPath as tS}from"node:url";function rS(e){let t=vp(tS(e));for(let r=0;r<8;r+=1){let n=Us(t,"package.json");if(Ip(n))try{let i=JSON.parse(eS(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=vp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function _p(e,t){let r=rS(t),n=Us(r,e);return Ip(n)?n:Us(r,"dist","assets",e)}var Op=v(()=>{});import{readFileSync as nS,existsSync as oS}from"node:fs";import{fileURLToPath as iS}from"node:url";import{dirname as sS,join as Tp}from"node:path";function cS(){try{let e=_p("equities-fixtures",import.meta.url);if(e&&oS(e))return e}catch{}return aS}function lS(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){lS(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 dS(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 pS(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 fS(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 mS(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 hS(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 yS(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 gS(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 bS(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 wS(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 xS(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 ES(e,t){let r=Np[t],n=Tp(e,r),o;try{o=nS(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 SS[t](i,r),i}function Rp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Rp(t)}return e}function Bs({fixtureDir:e=uS}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Np))t[r]=ES(e,r);return Rp(t)}function st(){return Cp??=Bs(),Cp}function Ie(){return st().venues}function $p(){return st().universe}function Pp(){return st().oracles}function Lp(){return st().nyseHolidays}function qp(){return st().dstTransitions}function uo(){return st().rhPoolState}function Up(){return st().solanaXstocks}function Bp(){return st().tonXstocks}function Fp(){return st().hip3L2Books}var aS,uS,Np,SS,Cp,Be=v(()=>{Op();aS=Tp(sS(iS(import.meta.url)),"fixtures");uS=cS(),Np=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});SS=Object.freeze({venues:dS,universe:pS,oracles:fS,nyseHolidays:mS,dstTransitions:hS,equityDexPools:yS,rhPoolState:gS,solanaXstocks:wS,tonXstocks:xS,hip3L2Books:bS})});function vS(){let e=qp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ds,endMs:n.endUtc*Ds}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function Gp(){return Mp??=vS(),Mp}function IS(){return Fs===void 0&&(Fs=new Set(Lp().holidayDayIndex)),Fs}function Kp(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function _S(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Gp();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function OS(e){for(let t of Gp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function CS(e){return OS(e)?AS:kS}function TS(e){let t=e+CS(e),r=Math.floor(t/Dp),n=t-r*Dp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/jp),msIntoDay:n,weekday:o.getUTCDay()}}function NS({dayIndex:e,weekday:t}){return t===0||t===6?!1:!IS().has(e)}function RS(e){return e<Hp?"dark":e<zp?"extended":e<Vp?"core":e<Wp?"extended":"dark"}function Vr(e){Kp(e,"sessionState"),_S(e,"sessionState");let t=TS(e);return NS(t)?RS(t.minuteOfDay):"dark"}function js(e){return Kp(e,"isDark"),Vr(e)==="dark"}var Ds,jp,Ms,Dp,kS,AS,Hp,zp,Vp,Wp,pC,fC,Mp,Fs,lo=v(()=>{Be();Ds=1e3,jp=60*Ds,Ms=60*jp,Dp=24*Ms,kS=-5*Ms,AS=-4*Ms,Hp=240,zp=570,Vp=960,Wp=1200,pC=Object.freeze([Hp,zp,Vp,Wp]),fC=Object.freeze(["core","extended","dark"])});function fo(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function LS(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function qS(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function Xp(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function mo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??$S,o=t.oracleFreshnessMs??PS,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(LS(c)){i?s.push(Object.freeze({...c,staleData:!0})):fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(qS(c)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Xp(c,r,n)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=Vr(r),l=u==="core"?o:o*2;if(Xp(c,r,l)){fo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:po.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var po,$S,PS,Hs=v(()=>{Ce();lo();po=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),$S=12e4,PS=6e5});function US(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 le(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(US(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(()=>{Ce()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function Jp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){Jp(e)||Z(t,"must be an object")}function Zp(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function or(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function Wr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Vs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function zs(e,t,r=!1){e===null&&r||(Jp(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function ho(e,t,r=!1){e===null&&r||Rt(e,t)}function Qp(e,t){Rt(e,t),or(e.venue,`${t}.venue`),or(e.reason,`${t}.reason`),zS.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&or(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Yp,"costAccounted","capturedAt","blockOrSeq","raw"])Zp(e,r,"quote");or(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),Wr(e.instrument,BS,"quote.instrument"),Wr(e.tier,FS,"quote.tier"),or(e.symbolRaw,"quote.symbolRaw"),or(e.symbol,"quote.symbol"),Wr(e.side,DS,"quote.side"),zs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of HS)Object.hasOwn(e,r)&&(zs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of Yp)zs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Vs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Rt(e.raw,"quote.raw"),e}function yo(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Zp(e,t,"rankResult");return Wr(e.rankedOn,MS,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>ho(t,`rankResult.ranked[${r}]`)),ho(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>ho(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Vs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Vs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Qp(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Qp(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),Wr(e.instrumentMix,jS,"rankResult.instrumentMix"),ho(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var BS,FS,DS,MS,jS,HS,Yp,zS,at=v(()=>{BS=new Set(["spot","perp"]),FS=new Set(["read-only","quote-only","prepare","intent"]),DS=new Set(["buy","sell"]),MS=new Set(["net-of-cost","gross"]),jS=new Set(["homogeneous","heterogeneous"]),HS=["bid","ask","mid","mark"],Yp=["fees","gasEstimate","priceImpact","fundingHourly"],zS=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function ef(){return Ie().venues.arcus}function KS(){return Object.keys(ef().markets).sort()}function XS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=ef().markets[n];if(!o)return null;let i=Fe(o.mark,`${n}.mark`),s=le(o.oracle),a=le(o.fundingHourly),c=r===null?F("0"):r,u={venue:VS,chain:WS,instrument:"perp",tier:GS,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ie().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:go,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),xe(u)}function bo({side:e="buy",sizeUsd:t=null}={}){return KS().map(r=>XS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var VS,WS,GS,go,Ws=v(()=>{Be();Nt();Ce();at();VS="arcus_perp",WS="robinhood-4663",GS="quote-only",go="0.00000480324074074"});function Gs(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return F("0");let n=F(String(t)),o=we(10000n,0);return ve(ve(e,n),o)}function rf(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=YS(n,t),c=t-a,u=F(go),l=Gs(i,c),d=Gs(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:qe(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:go,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Gs(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:qe(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function YS(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)js(e+o*tf)&&(r+=1);return t>n&&js(e+n*tf)&&(r+=t-n),r}var tf,TC,nf=v(()=>{Ce();Ws();lo();tf=36e5,TC=24*365});function QS(e){return e.mid??e.mark??e.ask??e.bid??null}function JS(e){let t=QS(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=ve(t,i),e.priceImpact!==null&&(o=yt(o,ve(t,e.priceImpact)))}else o=yt(t,n);return{net:o,costAccounted:r,px:t}}function ZS(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 eE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=zr(t.net,e.net);return Ue(ve(r,we(10000n,0)),t.net,4)}function wo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let b=mo(e,{nowMs:r});o=b.survivors,i=b.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let b of o){let y=JS(b);if(y===null)continue;let A=null;if(u&&b.instrument==="perp"&&(A=rf(b,c,{nowMs:r}),A.carryBps!==null)){let E=yt(F("1"),Ue(A.carryBps,we(10000n,0),12));y.net=ve(y.net,E),y.costAccounted=!1}l.push(ZS(b,y,A))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let b=l.filter(A=>A.instrument==="spot"),y=l.filter(A=>A.instrument==="perp");b.length>0&&y.length>0?(d=b.length>=y.length?b:y,p="homogeneous"):(d=l,p="homogeneous")}d.sort((b,y)=>{let A=gt(b.net,y.net);return A!==0?A:b.venue<y.venue?-1:b.venue>y.venue?1:0});let f=d[0]??null,m=d.slice(1),g=d,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let x=m.length===0?null:eE(f,m[0]),S=l.find(b=>b.tier==="prepare")??null,O=Vr(r),w=O==="core"?null:{session:O,warning:O==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},_=null;u&&(_=tE(l));let k={rankedOn:h,ranked:g,winner:f,runnersUp:m,improvementBps:x===null?null:Number(qe(x)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:S,carry:f?.carry??null,breakEvenHorizonHours:_};return yo(k)}function tE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>gt(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>gt(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=zr(t.net,r.net);if(n.mantissa===0n)return 0;let o=ve(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=Ue(n,o,4),s=Number(qe(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Ks=v(()=>{Hs();nf();lo();Ce();at()});function Xs(){return uo()}function aE(e){return{mantissa:e*e*10n**BigInt(ir)/iE,scale:ir}}function cE(e){let t=aE(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ue(ve(t,we(10n**BigInt(r),0)),we(10n**BigInt(n),0),ir);return o.mantissa===0n?null:Ue(F("1"),o,ir)}return Ue(ve(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),ir)}function uE(e){let t=Pp(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function lE(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,dE(r,t),ir)}function dE(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Hr(e,r).mantissa+Hr(t,r).mantissa,scale:r}}function pE(e){let t=Xs(),r=sE[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ys(){return Object.keys(Xs().pools).sort()}function sr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Xs(),o=n.pools[e];if(!o)return null;let i=cE(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"):lE(s,a),l=pE(o.version),f={venue:rE,chain:nE,instrument:"spot",tier:oE,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=uE(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=qe(Ue(ve(zr(i,m),we(10000n,0)),m,4))),xe(f)}function of({side:e="buy",sizeUsd:t=null}={}){return Ys().map(r=>sr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var rE,nE,oE,iE,ir,sE,Qs=v(()=>{Be();Nt();Ce();at();rE="rh_uniswap",nE=4663,oE="prepare",iE=1n<<192n,ir=18,sE=Object.freeze({v3:180000n,v4:240000n})});function xo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=sr({symbol:t,side:r,sizeUsd:n});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>sf)throw new Error(`quote is stale (${a}ms old, bound ${sf}ms); re-quote before preparing`);let u=uo().pools[t],l=u.version==="v4"?mE:fE,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 sf,fE,mE,Js=v(()=>{Qs();Be();sf=12e4,fE="0x0000000000000000000000000000000000000000",mE="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Gr(){return Ie().venues.hyperliquid_hip3}function af(){return Object.keys(Gr().dexs).sort()}function bE(){let e=[];for(let[t,r]of Object.entries(Gr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function wE(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=Gr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Gr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function xE(e,t){try{return Fp().books[`${e}:${t}`]??null}catch{return null}}function SE(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(qe(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),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 EE(e,t,r,n){let o=SE(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(qe(n));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:le(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function cf({dex:e,ticker:t,market:r,side:n,size:o}){let i=Fe(r.mark,`${e}:${t}.mark`),s=le(r.fundingHourly),a=le(r.vol24h),c=le(r.oi),u=o===null?F("0"):o,l=xE(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let h=EE(l,n,u,i);d=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 l?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:hE,chain:yE,instrument:"perp",tier:gE,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ie().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&&(g.raw.vol24hFixed=a),c!==null&&(g.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(g.bid=F(String(l.bids[0].px)),g.ask=F(String(l.asks[0].px))),xe(g)}function uf({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=wE(e);return n.length===0||n.length>1?null:cf({...n[0],side:t,size:r})}function So({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of bE()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Gr().dexs[i][s];n.push(cf({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var hE,yE,gE,lf=v(()=>{Be();Nt();Ce();at();hE="hyperliquid_hip3",yE="hyperliquid",gE="quote-only"});function df(){return Ie().venues.arcus_spot}function IE(){return Object.keys(df().pairs).sort()}function _E({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=df().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Fe(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Fe(n.ask,`${e}.ask`),s=le(n.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let 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:kE,chain:AE,instrument:"spot",tier:vE,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ie().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),xe(l)}function Eo({side:e="buy",sizeUsd:t=null}={}){return IE().map(r=>_E({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var kE,AE,vE,pf=v(()=>{Be();Nt();Ce();at();kE="arcus_spot",AE="robinhood-4663",vE="quote-only"});function ko(){return Up()}function Zs(){return Object.keys(ko().tokens).sort()}function NE(e){let t=ko().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function RE(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ea({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=ko().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=NE(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):RE(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=ff&&(p=!1);let f={venue:OE,chain:CE,instrument:"spot",tier:TE,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:ko().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<ff}};return xe(f)}function mf({side:e="buy",sizeUsd:t=null}={}){return Zs().map(r=>ea({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var OE,CE,TE,ff,hf=v(()=>{Be();Nt();Ce();at();OE="solana_xstocks",CE="solana",TE="quote-only",ff=25e3});function Ao(){return Bp()}function ta(){return Object.keys(Ao().tokens).sort()}function BE(e){let t=Ao().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function FE(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ra({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Ao().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=BE(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):FE(u,l),f={venue:$E,chain:PE,instrument:"spot",tier:LE,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Ao().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<qE,impactSizeFractionHint:UE}};return xe(f)}function yf({side:e="buy",sizeUsd:t=null}={}){return ta().map(r=>ra({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var $E,PE,LE,qE,UE,gf=v(()=>{Be();Nt();Ce();at();$E="ton_stonfi",PE="ton",LE="quote-only",qE=25e3,UE=.01});var vo={};M(vo,{bestEquityRoute:()=>DE,collectEquityQuotes:()=>wf,equityVenues:()=>ME,getUniverse:()=>$p,getVenues:()=>Ie,loadFixtures:()=>Bs,prepareEquity:()=>xo,prepareEquityRoute:()=>jE,rankEquityQuotes:()=>wo,toJsonSafe:()=>HE,validateQuote:()=>xe,validateRankResult:()=>yo});function na(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function wf(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=na(t),o=[],i=uf({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of So({ticker:r,sizeUsd:n}))o.push(u);for(let u of bo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Eo({sizeUsd:n}))u.symbol===r&&o.push(u);let s=sr({symbol:r,sizeUsd:n});s&&o.push(s);let a=ea({symbol:r,sizeUsd:n});a&&o.push(a);let c=ra({symbol:r,sizeUsd:n});return c&&o.push(c),o}function DE(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=na(e.sizeUsd??e.size??null),n=wf(t,{sizeUsd:r});if(n.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=n[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=wo(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>bf}}function ME(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:So().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:bo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Eo().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ys().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Zs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ta().length}],t=[...So(),...bo(),...Eo(),...of(),...mf(),...yf()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=mo(t,{nowMs:r});return{inventory:e,hip3Dexs:af(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ie().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function jE(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=na(e.sizeUsd??e.size??null),o=sr({symbol:t,sizeUsd:n});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=xo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>bf}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function HE(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var bf,Io=v(()=>{Ce();Ks();Js();Hs();lf();pf();Ws();Qs();hf();gf();Be();Ks();Js();at();Be();bf=3600*1e3});var _o={};M(_o,{CHAIN_CONFIGS:()=>jr,EVIDENCE:()=>U,RISK:()=>L,SCANNER_CAPABILITIES:()=>Qt,__clearScanners:()=>Fb,createScanner:()=>$l,getScanner:()=>ps,listScanners:()=>Pl,registerBuiltinScanners:()=>no,registerCustomChain:()=>Hd,registerScanner:()=>Hn,scannerCoverage:()=>Db,validateScanner:()=>Rl});var Oo=v(()=>{ft();oo()});var sa={};M(sa,{createWatch:()=>KE,listWatches:()=>GE,removeWatch:()=>XE});import Kr from"node:fs";import oa from"node:path";import{randomUUID as zE}from"node:crypto";import{homedir as VE}from"node:os";function WE(e=process.env){return e.ORACLE_CONFIG_DIR||oa.join(VE(),".config","oracle")}function xf(e=process.env){return oa.join(WE(e),"watches.json")}function ia(e=process.env){let t=xf(e);if(!Kr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Kr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Sf(e,t=process.env){let r=xf(t);Kr.mkdirSync(oa.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Kr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
+
`,{mode:384}),Kr.renameSync(n,r)}function GE(e=process.env){return ia(e).watches}function KE({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:zE(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=ia(o);return s.watches.push(i),Sf(s,o),i}function XE(e,t=process.env){let r=ia(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Sf({watches:n},t),!0)}var aa=v(()=>{});var Ef={};M(Ef,{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 kf=v(()=>{});function tk(e){return!(ek.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Af(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
8
|
+
`),n=[...new Set((r.match(QE)||[]).map(i=>i.toLowerCase()))].filter(i=>!ZE.has(i)),o=[...new Set(r.match(JE)||[])].filter(tk);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function vf(e){let t=String(e||"").trim();if(!t)return[];let r=[],n=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let u of c)u?.expanded_url&&a.push(u.expanded_url),u?.url&&a.push(u.url);(i||s)&&r.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(n):n(o)}catch{for(let o of t.split(`
|
|
9
|
+
`)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var QE,JE,ZE,ek,If=v(()=>{QE=/\b0x[a-fA-F0-9]{40}\b/g,JE=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,ZE=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),ek=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as rk}from"node:child_process";import _f from"node:fs";import ca from"node:path";function sk(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Tf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function ak(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ca.isAbsolute(t)?_f.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(ca.delimiter)){if(!n)continue;let o=ca.join(n,"xurl");try{if(_f.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function ck(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 uk(e){for(let t of e){let r=String(t);if(Cf.includes(r))return r;if(Cf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function lk(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=uk(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!Tf(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(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(!ok.includes(o))if(ik.includes(o)){if(!Tf(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...r],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function Nf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!sk(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=lk(t,n);if(!o.ok)return o;let i=ak(n);if(!i.ok)return i;let a=(r.spawnFn||rk)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Of,maxBuffer:1024*1024,env:ck(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Of}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(d,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,nk),{force:!0}),u=wt(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 Of,nk,ok,ik,Cf,HT,Rf=v(()=>{Qo();Of=45e3,nk=4e4,ok=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),ik=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Cf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);HT=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 mk(e){return!e||e==="0x"||e===fk}async function $f(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(dk))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,l=null,d=null;for(let{label:m,slot:g}of pk)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!mk(h)){u=!0,l=m,d=`0x${String(h).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 dk,pk,fk,Pf=v(()=>{ot();dk=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"}}),pk=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),fk=`0x${"0".repeat(64)}`});function Co(e,t){let r=String(e||"").trim();if(!hk.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function ua(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function Xr(e,t){return e==null||e===""?null:ua(e,t)}function gk({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=Co(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=ua(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Xr(l.gasLimit??c.gasLimit,"gasLimit"),g=Xr(l.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()),x=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),S=Gi({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:x,secret:u.routeAttestationSecret}),O=Ae(S,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),w={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:g,slippageBps:O.selectedBps,expiresAtMs:h+x},_=Xr(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return _&&(w.maxPriorityFeePerGas=_),c.nonce!==void 0&&(w.nonce=Number(c.nonce)),(c.txType!==void 0||_)&&(w.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(w.l1FeeWei=Xr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(w.operatorFeeWei=Xr(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:O.selectedBps,expiresAtMs:h+x,fee:{oracleFeeBps:5},autoSlippage:O,artifact:{chainId:e,owner:o,transactions:[w]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function bk(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}no();let r=ps(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function wk({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==L.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==L.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Lf(e={},t={}){let r=Number(e.chainId??yk);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Co(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Co(e.tokenIn,"tokenIn"):null,i=e.recipient?Co(e.recipient,"recipient"):null,s=e.amountIn==null?null:ua(e.amountIn,"amountIn"),a=bk(r,t.scanner),c=t.scanContractRisk||$f,[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 g={...e,tokenIn:o,amountIn:s,recipient:i},h=wk({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),x=null,S=null,O=null;if(e.prepare===!0&&h.length===0){x=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{S=gk({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:x,args:e,opts:t})}catch(w){O=String(w?.message||w).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:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:h,prepared:!!x,unsignedTx:x,localSignerEnvelope:S,localSignerBlockedReason:O,signed:S?"pending-local-signer":!1,broadcast:S?"pending-local-signer":!1}}var hk,yk,qf=v(()=>{oo();ft();Re();Pf();hk=/^0x[0-9a-fA-F]{40}$/,yk=4663});var Mf={};M(Mf,{evaluateContracts:()=>Df,fetchAccountTweets:()=>Ff,snipeExecuteEnabled:()=>Uf,tickTwitterCaWatch:()=>vk,twitterSnipeEmitsCard:()=>Ik});function Uf(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Bf(e){return String(e||"").trim().replace(/^@/,"")}async function Ff({handle:e,limit:t=5,xurlFn:r=Nf}={},n={}){let o=Bf(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:vf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function kk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Lf({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function Ak(e,t){let r=await yl(e,{chainSlug:"solana",stables:[Sk,Ek]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function Df(e,t={},r={}){let n=Number(t.chainId??xk),o=[];for(let i of e.evm||[])o.push(await kk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await Ak(i,r));return o}async function vk(e={},t={}){let r=Bf(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Ff({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Af(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||Df)(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:Uf(t.env||process.env),hits:i,seen:[...n]}}function Ik(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var xk,Sk,Ek,jf=v(()=>{If();Rf();qf();Tr();on();xk=4663,Sk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Ek="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as _k}from"ethers";function Nk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Tk.has(t.length)&&t.every(r=>_k.en.getWordIndex(r)>=0)}function Lk(e){let t=Hf(e);return Pk.has(t)||$k.test(t)}function Hf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function qk(e){let t=Hf(e);return[...Ok].some(r=>t.includes(r))}function Uk(e,t,r){if(typeof t=="string"){if(Ck.some(n=>n.test(t))||Nk(t))throw new Yr(r);if(Rk.test(t)&&!Lk(e))throw new Yr(r)}}function la(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Uk(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>la(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(qk(o))throw new Yr(i);e[o]!==void 0&&(n[o]=la(e[o],i,o))}return n}function ar(e){return la(e)}var Ok,Ck,Tk,Rk,$k,Pk,Yr,da=v(()=>{Ok=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Ck=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Tk=new Set([12,15,18,21,24]);Rk=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,$k=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Pk=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Yr=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as Bk,chmod as To,readFile as Fk,rename as Dk,writeFile as Mk}from"node:fs/promises";import{homedir as jk}from"node:os";import{dirname as zf,join as pa}from"node:path";import Hk from"sql.js";function $o(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map($o).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${$o(e[t])}`).join(",")}}`}function Vf(e){if(!zk.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function No(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Ro(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Wf(e={}){let t=e.path||Gk;await Bk(zf(t),{recursive:!0,mode:448}),await To(zf(t),448);let r;try{r=await Fk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Hk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
10
10
|
PRAGMA foreign_keys=ON;
|
|
11
11
|
CREATE TABLE IF NOT EXISTS artifacts (
|
|
12
12
|
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
|
|
@@ -18,9 +18,9 @@ var Mm=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(
|
|
|
18
18
|
CREATE TABLE IF NOT EXISTS action_receipts (
|
|
19
19
|
artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
|
|
20
20
|
);
|
|
21
|
-
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let d=`${t}.tmp-${process.pid}`;await Pk(d,Buffer.from(o.export()),{mode:384}),await To(d,384),await Rk(d,t),await To(t,384)};return s=s.then(u,u),s}r?await To(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let d=Vf(String(u.type)),l=String(u.id||"").trim();if(!l)throw new TypeError("artifact id required");let p=ar(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[l,d,f,Po(p)]),await a(),{id:l,type:d,createdAt:f,data:p}},getArtifact(u){c();let d=o.prepare("SELECT * FROM artifacts WHERE id=?");d.bind([String(u)]);let l=d.step()?Ro(d.getAsObject()):null;return d.free(),l},listArtifacts(u){c();let d=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Vf(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),No(d).map(Ro)},async link(u,d){c();let l=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");l.bind([String(u),String(d)]);let p=No(l),f=p.find(g=>g.id===String(u)),m=p.find(g=>g.id===String(d));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!Uk.has(`${f.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${f.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[f.id,m.id]),await a(),{parentId:f.id,childId:m.id}},children(u){c();let d=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),No(d).map(Ro)},parents(u){c();let d=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),No(d).map(Ro)},async putReceipt(u,d){c();let l=this.getArtifact(u);if(!l||l.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=ar(d);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Po(p)]),await a(),p},getReceipt(u){c();let d=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");d.bind([String(u)]);let l=d.step()?JSON.parse(d.getAsObject().receipt_json):null;return d.free(),l},async close(){i||(await a(),o.close(),i=!0)}}}var fa,qk,Uk,Bk,Fk,Gf=v(()=>{da();fa=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),qk=new Set(fa),Uk=new Set(fa.slice(0,-1).map((e,t)=>`${e}:${fa[t+1]}`)),Bk=pa(process.env.ORACLE_CONFIG_DIR||pa($k(),".config","oracle"),"workspace"),Fk=pa(Bk,"artifacts.sqlite")});import{createHash as Kf}from"node:crypto";function Mk(e){return Dk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ma(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ma).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ma(e[t])}`).join(",")}}`}function jk(e){return Kf("sha256").update(String(e)).digest("hex")}function Xf(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let r of t.searchParams.keys())if(Mk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Yf(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function Hk(e={}){let t=Xf(e.url??e.sourceUrl),r=Yf(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(ar({url:t,fetchedAt:r,contentHash:n}))}function Qf(e={}){let t=Xf(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Yf(e.fetchedAt),s=jk(r);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(Hk),c=ar({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Kf("sha256").update(ma(c)).digest("hex")}`,...c})}var Dk,Jf=v(()=>{da();Dk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Zf(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Qr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ya(e,t){return t>0?Qr(e/t*100):null}function ga(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function Wk(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Pt(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Zf(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||Vk.has(n.toUpperCase())})}function Gk(e){let t=[],r=ga(e);for(let n of e.assets||e.holdings||[])Pt(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Pt(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Pt(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Pt(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Pt(t,a,{...i,venue:"Hyperliquid spot"});let s=Zf(n.perps?.accountValueUsd);s!=null&&Pt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Pt(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function Kk(e,t){let r=ga(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ha(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:Qr(i),percentOfKnown:ya(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function em(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=Wk(t.labels??t.addressBook??e.labels??e.addressBook),o={...zk,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((S,R)=>{if(!S||typeof S!="object")return;let I=Kk(S,R);s.has(I)?a+=1:(s.add(I),i.push(S))});let c=i.flatMap(Gk),u=c.filter(S=>S.usdValue!=null),d=c.filter(S=>S.usdValue==null),l=i.reduce((S,R)=>S+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Qr(u.reduce((S,R)=>S+R.usdValue,0)),f=d.length+l,m=ha(u,"chain",p),g=ha(u,"venue",p),h=ha(u,"symbol",p);for(let S of m)S.chain=S.name;for(let S of g)S.venue=S.name;for(let S of h)S.asset=S.name,S.symbol=S.name;let w=Qr(u.filter(S=>S.stablecoin).reduce((S,R)=>S+R.usdValue,0)),E=c.filter(S=>S.kind==="nft"),_=i.reduce((S,R)=>S+Number(R.valuation?.nftUnvaluedItems||0),0),x=E.filter(S=>S.usdValue==null).length+_,O=E.filter(S=>S.usdValue!=null).length,A=h[0]||null,b=A?A.percentOfKnown>=o.assetHighPct?"high":A.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",y=[];f&&y.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&y.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&y.push(`${a} duplicate address/chain snapshot(s) were ignored.`),A&&b!=="low"&&y.push(`Asset concentration is ${b}: ${A.name} is ${A.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&y.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),g[0]?.percentOfKnown>=o.venueHighPct&&y.push(`Venue concentration is high: ${g[0].name} is ${g[0].percentOfKnown}% of known value.`);let k=i.map(ga).filter(Boolean).map(S=>{let R=n.get(String(S).toLowerCase());return{address:S,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1),label:f===0&&i.length&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:g,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:b,topAsset:A?.name??null,topAssetPercent:A?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:ya(w,p),high:p>0&&ya(w,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||_?x?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:x,knownUsd:Qr(E.filter(S=>S.usdValue!=null).reduce((S,R)=>S+R.usdValue,0))},addresses:k,warnings:[...new Set(y)]}}var zk,Vk,tm=v(()=>{zk=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),Vk=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function rm(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function im(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function Xk(e){return Number.isFinite(Number(im(e)))}function nm(e){return pe(im(e),0)}function Yk(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=sm(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>Xk(o))?r.sort((o,i)=>nm(o.row)-nm(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function sm(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Lo(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function $o(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Me(o))continue;let i=t==="fill"?sm(o):Lo(o);r.has(i)?(n+=1,t!=="fill"&&rm(o)>rm(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function Qk(e){let t=new Map;for(let r of e){let n=[Lo(r),`${ce(r.chain??r.chainId)}|${ce(Me(r))}`,`*|${ce(Me(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function Jk(e,t){return t.get(Lo(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function Zk(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(om(n)),ce(Me(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ce(n.side)==="sell"){let u=Math.min(s,i.quantity),d=i.quantity?i.cost/i.quantity:pe(n.costBasisUsd)/(s||1);r+=u*(a-d)-c,i.quantity-=u,i.cost-=u*d}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:De(r),lots:t}}function am(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=$o(e.balances||[],"balance"),i=$o(e.positions||[],"position"),s=$o(e.fills||[],"fill"),a=$o(e.prices||[],"price"),c=Qk(a.rows),u=[],d=0,l=0;for(let k of[...o.rows,...i.rows]){let S=Jk(k,c),R=pe(k.quantity??k.amount??k.size),I=S?pe(S.priceUsd??S.price,NaN):pe(k.priceUsd,NaN);if(!Number.isFinite(I)){l+=1;continue}let P=R*I,q=pe(S?.asOf??k.priceAsOf,0),j=r-q>n;j&&(d+=Math.abs(P)),u.push({...k,quantity:R,priceUsd:I,valueUsd:P,stale:j,kind:i.rows.includes(k)?"position":"balance"})}let p=u.filter(k=>k.kind==="balance").reduce((k,S)=>k+S.valueUsd,0),f=u.filter(k=>k.kind==="position"),m=f.reduce((k,S)=>k+S.valueUsd,0),g=f.reduce((k,S)=>k+Math.abs(S.valueUsd),0),h=p+m,w=pe(e.equityUsd,h),E=Zk(Yk(e.fills||[])).realizedPnlUsd,_=f.reduce((k,S)=>{let R=pe(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return k+S.quantity*(S.priceUsd-R)},0),x=new Map;for(let k of u)x.set(ce(Me(k)),(x.get(ce(Me(k)))||0)+Math.abs(k.valueUsd));let O=[...x.values()].reduce((k,S)=>k+S,0),A=[...x].map(([k,S])=>({asset:k,exposureUsd:De(S),percent:O?De(S/O*100):null})).sort((k,S)=>S.exposureUsd-k.exposureUsd||k.asset.localeCompare(S.asset)),b=u.reduce((k,S)=>k+Math.abs(S.valueUsd),0),y=em({snapshots:[{assets:u.map(k=>({symbol:Me(k),usdValue:Math.abs(k.valueUsd),chain:k.chain,venue:k.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:E,unrealizedUsd:De(_),totalUsd:De(E+_)},exposure:{grossUsd:De(g),netUsd:De(h),leverage:w>0?De(g/w):null,equityUsd:De(w)},concentration:A,priceCoverage:{pricedItems:u.length,unpricedItems:l,staleItems:u.filter(k=>k.stale).length,staleValueUsd:De(d),stalePercent:b?De(d/b*100):null,ttlMs:n},risk:y})}var pe,De,ce,Me,om,Lo,cm=v(()=>{tm();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ce=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Me=e=>e.asset??e.symbol??e.coin,om=e=>e.address??e.owner??e.account,Lo=e=>[ce(e.chain??e.chainId),ce(om(e)),ce(Me(e)),ce(e.source)].join("|")});var l2,d2,p2,um=v(()=>{l2=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),d2=Object.freeze(["read","simulate"]),p2=1440*60});function lm(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return eA.test(t)||tA.includes(r)}function $t(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=nA.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of rA)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Jr(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&lm(o))throw new Jr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");$t(o,`${t}[key]`,r),$t(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())$t(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>$t(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(lm(o))throw new Jr(`${t}.${o}`,"forbidden-key-name");$t(i,`${t}.${o}`,r,o)}return e}var Jr,eA,tA,rA,nA,dm=v(()=>{um();Jr=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},eA=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,tA=Object.freeze(["privkey","wif","xprv","seed"]);rA=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),nA=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as oA}from"node:crypto";function wa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(wa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wa(e[t])}`).join(",")}}`}function iA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function qo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))qo(t)}return e}function xa(e,t="fact"){try{$t(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function mm(e){return oA("sha256").update(wa(e)).digest("hex")}function hm({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:iA(r)};return qo({...s,hash:mm(s)})}function Uo({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");xa(t,"intent");let n=hm({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return qo({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function ym(e,t,r,n={}){if(Ea(e),!(pm[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);xa(r,t);let i=n.external===!0||n.externallySupplied===!0;if(fm.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=hm({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return qo({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ea(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(mm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(xa(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!pm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(fm.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var ba,pm,fm,Sa=v(()=>{dm();ba=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),pm=Object.freeze(Object.fromEntries(ba.map((e,t)=>[e,Object.freeze(t+1<ba.length?[ba[t+1]]:[])]))),fm=new Set(["signed","broadcast"])});function gm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return sA[t]??t}function aA(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${gm(e)}:${t}`)}function Ce(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Bo(r)})}function cA(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(e.walletWinRate??e.winRate);Ce(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Ce(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function uA(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Ce(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Ce(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Ce(t,"liquidity_lock",o==null?null:o?.12:-.28)}function lA(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(e.sales??e.saleCount);Ce(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Ce(t,"sales_depth",n===null?null:fe(n/50)*.18)}function dA(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(e.fundingRate??e.funding);Ce(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Ce(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function pA(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Ce(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Ce(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function mA(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>Ee(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function Fo(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Ee(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=gm(o),a=aA(o,i),c=fA[s],u=[];c&&c(o,u);let d=s==="wallet"?2:s==="pool"?3:2,l=Bo(fe(u.length/d)),p=u.reduce((_,x)=>_+x.value,0),f=mA(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Ce(u,"shadow_markout",m);let g=Bo(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),w=Bo(fe(l*h)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),l<n&&E.push("LOW_COVERAGE","NO_TRADE"),w<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Ee(o.ageHours??o.poolAgeHours)??1/0)<24&&E.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&E.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:g,confidence:w,coverage:l,contributions:u,flags:[...new Set(E)],noTrade:E.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var v2,sA,fe,Ee,Bo,fA,ka=v(()=>{v2=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),sA=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),fe=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Ee=e=>Number.isFinite(Number(e))?Number(e):null,Bo=e=>Math.round(e*1e4)/1e4;fA=Object.freeze({wallet:cA,pool:uA,nft_floor:lA,hl_flow:dA,prediction_market:pA})});function hA(e=[],t=[],r={}){let n=Fo(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function yA(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=Uo({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function bm(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=hA(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(yA(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var wm=v(()=>{ka();Sa()});function xm(e){let t=bA[Number(e)]||[];return new Set([...t,...gA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var gA,bA,Em=v(()=>{gA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],bA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Do(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Aa(e){e&&(e.prepareAttempted=!0)}function va(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function SA(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...xm(o)]:[];return new Set([...n,...i])}function kA(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function AA(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function vA(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function IA(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function _A(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of wA)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of xA)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,AA(e)){let o=vA(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=EA.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=SA(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(kA(e)){let o=IA(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):tt;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>tt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>tt?(r.push(`slippage ${o} exceeds cap ${Math.min(i,tt)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function Ia(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=_A(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var wA,xA,EA,Sm=v(()=>{Em();Re();wA=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),xA=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),EA=/^0x[a-fA-F0-9]{40}$/});var Am={};M(Am,{DESK_TOOLS:()=>CA,runDeskTool:()=>NA});function TA(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>OA)throw new TypeError("tool arguments exceed size limit")}function Je(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function NA(e,t,r={}){if(TA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>km)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Qf)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||am)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Uo,o=r.advanceTradeLifecycle||ym,i=r.assertTradeLifecycle||Ea;if(t.action==="create")return Je(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Je(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Aa(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Ia(t.lifecycle,s?.fact||{});if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Do(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Je(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Aa(r.loopVerifier);let a=Ia(t.lifecycle,t.fact);if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Je(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||bm)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Fo)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||Wf,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Je(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Je(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Je(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Je(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var OA,km,Mo,Lt,Zr,CA,vm=v(()=>{Gf();Jf();cm();Sa();ka();wm();Sm();OA=128*1024,km=5e4,Mo={type:"string",minLength:1,maxLength:256},Lt={type:"object",additionalProperties:!0},Zr=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),CA=Object.freeze([Zr("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Mo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Lt,parentId:Mo,childId:Mo},required:["action"],additionalProperties:!1}),Zr("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:km},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Zr("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Lt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Zr("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Mo,intent:Lt,lifecycle:Lt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Lt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Zr("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Lt},markouts:{type:"array",maxItems:100,items:Lt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var Im={};M(Im,{deployGloballyEnabled:()=>PA,executeGloballyEnabled:()=>RA,mevExecuteEnabled:()=>$A});function RA(){return nn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function PA(){return nn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function $A(){return nn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var _m=v(()=>{on()});on();import Om from"node:fs";import _a from"node:process";import{fileURLToPath as LA}from"node:url";import{createInterface as Hm}from"node:readline";var ze=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),zm=/^[A-Za-z0-9_-]{1,64}$/;function sn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function de(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function Vm(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Wm(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ze.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!zm.test(o)||r.has(o))continue;r.add(o);let i=n.inputSchema&&typeof n.inputSchema=="object"&&!Array.isArray(n.inputSchema)?{...n.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...n,name:o,inputSchema:i})}return t}function Gm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Km(e,t,r){let n;try{return await Promise.race([e,new Promise((o,i)=>{n=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{r?.()}catch{}},t)})])}finally{clearTimeout(n)}}function Xm(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function dr(e,t,r="arguments",n=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(n>12)return`${r} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${r} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${r} must equal the required constant`;if(t.type){let o=Xm(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${r} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${r} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${r} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${r} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${r} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=dr(e[i],t.items,`${r}[${i}]`,n+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${r} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${r}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${r}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=dr(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Yo(e,t={}){let r=Wm(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=Gm(t.callTimeoutMs),c=!1;return async function(d){let l=d?.id??null;if(!Vm(d))return de(l,-32600,"invalid request");if(d.method==="initialize")return c=!0,sn(l,{protocolVersion:d.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(d.method==="notifications/initialized")return null;if(d.method==="ping")return sn(l,{});if(!c)return de(l,-32002,"server not initialized");if(d.method==="tools/list")return sn(l,{tools:r});if(d.method==="tools/call"){let p=d.params?.name,f=d.params?.arguments??{};if(typeof p!="string"||!n.has(p))return de(l,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return de(l,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return de(l,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>ze.maxArgumentBytes)return de(l,-32602,"tool arguments exceeded the size limit");let g=dr(f,o.get(p)?.inputSchema);if(g)return de(l,-32602,g);try{let h=new AbortController,w=await Km(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return sn(l,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return de(l,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.message.replace(/\s+/g," ").trim():"",E=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(w),_=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!_&&w.length<=200?de(l,-32e3,`tool call failed: ${w}`):de(l,-32e3,"tool call failed")}}return de(l,-32601,"method not found")}}function Ua(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||ze.maxRequestBytes,64),ze.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||ze.maxResponseBytes,256),ze.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||ze.maxConcurrentCalls,1),ze.maxConcurrentCalls),a=s*8,c=Yo(e,t),u={closed:!1,inflight:0},d=Hm({input:r,terminal:!1,crlfDelay:1/0}),l=0,p=[],f=!1,m=!1;function g(){if(u.closed||u.readerClosed)return;let x=u.inflight>=s||p.length>0||m;x&&!f?(f=!0,d.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),d.resume())}function h(x){if(!x||u.closed)return;let O=JSON.stringify(x);Buffer.byteLength(O)>i&&(O=JSON.stringify(de(x.id,-32003,"response exceeded the size limit"))),n.write(`${O}
|
|
22
|
-
`)===!1&&!m&&(m=!0,g(),n.once("drain",()=>{m=!1,
|
|
23
|
-
`);for(let
|
|
21
|
+
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await Mk(l,Buffer.from(o.export()),{mode:384}),await To(l,384),await Dk(l,t),await To(t,384)};return s=s.then(u,u),s}r?await To(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let l=Vf(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=ar(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,f,$o(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()?Ro(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"):(Vf(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),No(l).map(Ro)},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=No(d),f=p.find(g=>g.id===String(u)),m=p.find(g=>g.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!Vk.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)]),No(l).map(Ro)},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)]),No(l).map(Ro)},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=ar(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),$o(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 fa,zk,Vk,Wk,Gk,Gf=v(()=>{da();fa=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),zk=new Set(fa),Vk=new Set(fa.slice(0,-1).map((e,t)=>`${e}:${fa[t+1]}`)),Wk=pa(process.env.ORACLE_CONFIG_DIR||pa(jk(),".config","oracle"),"workspace"),Gk=pa(Wk,"artifacts.sqlite")});import{createHash as Kf}from"node:crypto";function Xk(e){return Kk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ma(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ma).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ma(e[t])}`).join(",")}}`}function Yk(e){return Kf("sha256").update(String(e)).digest("hex")}function Xf(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let r of t.searchParams.keys())if(Xk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Yf(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function Qk(e={}){let t=Xf(e.url??e.sourceUrl),r=Yf(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(ar({url:t,fetchedAt:r,contentHash:n}))}function Qf(e={}){let t=Xf(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Yf(e.fetchedAt),s=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(Qk),c=ar({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Kf("sha256").update(ma(c)).digest("hex")}`,...c})}var Kk,Jf=v(()=>{da();Kk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Zf(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Qr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ya(e,t){return t>0?Qr(e/t*100):null}function ga(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function eA(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=Zf(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||Zk.has(n.toUpperCase())})}function tA(e){let t=[],r=ga(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=Zf(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 rA(e,t){let r=ga(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ha(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:Qr(i),percentOfKnown:ya(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function em(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=eA(t.labels??t.addressBook??e.labels??e.addressBook),o={...Jk,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((E,R)=>{if(!E||typeof E!="object")return;let I=rA(E,R);s.has(I)?a+=1:(s.add(I),i.push(E))});let c=i.flatMap(tA),u=c.filter(E=>E.usdValue!=null),l=c.filter(E=>E.usdValue==null),d=i.reduce((E,R)=>E+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Qr(u.reduce((E,R)=>E+R.usdValue,0)),f=l.length+d,m=ha(u,"chain",p),g=ha(u,"venue",p),h=ha(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 x=Qr(u.filter(E=>E.stablecoin).reduce((E,R)=>E+R.usdValue,0)),S=c.filter(E=>E.kind==="nft"),O=i.reduce((E,R)=>E+Number(R.valuation?.nftUnvaluedItems||0),0),w=S.filter(E=>E.usdValue==null).length+O,_=S.filter(E=>E.usdValue!=null).length,k=h[0]||null,b=k?k.percentOfKnown>=o.assetHighPct?"high":k.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.`),w&&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.`),k&&b!=="low"&&y.push(`Asset concentration is ${b}: ${k.name} is ${k.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 A=i.map(ga).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:k?.name??null,topAssetPercent:k?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:x,percentOfKnown:ya(x,p),high:p>0&&ya(x,p)>=o.stablecoinHighPct},nftCoverage:{status:S.length||O?w?"partial":"valued":"not-observed",valuedItems:_,unvaluedItems:w,knownUsd:Qr(S.filter(E=>E.usdValue!=null).reduce((E,R)=>E+R.usdValue,0))},addresses:A,warnings:[...new Set(y)]}}var Jk,Zk,tm=v(()=>{Jk=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),Zk=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function rm(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function im(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function nA(e){return Number.isFinite(Number(im(e)))}function nm(e){return pe(im(e),0)}function oA(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=sm(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>nA(o))?r.sort((o,i)=>nm(o.row)-nm(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function sm(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Lo(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function Po(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Me(o))continue;let i=t==="fill"?sm(o):Lo(o);r.has(i)?(n+=1,t!=="fill"&&rm(o)>rm(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function iA(e){let t=new Map;for(let r of e){let n=[Lo(r),`${ce(r.chain??r.chainId)}|${ce(Me(r))}`,`*|${ce(Me(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function sA(e,t){return t.get(Lo(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function aA(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(om(n)),ce(Me(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ce(n.side)==="sell"){let u=Math.min(s,i.quantity),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:De(r),lots:t}}function am(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=Po(e.balances||[],"balance"),i=Po(e.positions||[],"position"),s=Po(e.fills||[],"fill"),a=Po(e.prices||[],"price"),c=iA(a.rows),u=[],l=0,d=0;for(let A of[...o.rows,...i.rows]){let E=sA(A,c),R=pe(A.quantity??A.amount??A.size),I=E?pe(E.priceUsd??E.price,NaN):pe(A.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let $=R*I,q=pe(E?.asOf??A.priceAsOf,0),j=r-q>n;j&&(l+=Math.abs($)),u.push({...A,quantity:R,priceUsd:I,valueUsd:$,stale:j,kind:i.rows.includes(A)?"position":"balance"})}let p=u.filter(A=>A.kind==="balance").reduce((A,E)=>A+E.valueUsd,0),f=u.filter(A=>A.kind==="position"),m=f.reduce((A,E)=>A+E.valueUsd,0),g=f.reduce((A,E)=>A+Math.abs(E.valueUsd),0),h=p+m,x=pe(e.equityUsd,h),S=aA(oA(e.fills||[])).realizedPnlUsd,O=f.reduce((A,E)=>{let R=pe(E.entryPriceUsd??E.averageEntryPrice??E.costBasisPrice,E.priceUsd);return A+E.quantity*(E.priceUsd-R)},0),w=new Map;for(let A of u)w.set(ce(Me(A)),(w.get(ce(Me(A)))||0)+Math.abs(A.valueUsd));let _=[...w.values()].reduce((A,E)=>A+E,0),k=[...w].map(([A,E])=>({asset:A,exposureUsd:De(E),percent:_?De(E/_*100):null})).sort((A,E)=>E.exposureUsd-A.exposureUsd||A.asset.localeCompare(E.asset)),b=u.reduce((A,E)=>A+Math.abs(E.valueUsd),0),y=em({snapshots:[{assets:u.map(A=>({symbol:Me(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:S,unrealizedUsd:De(O),totalUsd:De(S+O)},exposure:{grossUsd:De(g),netUsd:De(h),leverage:x>0?De(g/x):null,equityUsd:De(x)},concentration:k,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(A=>A.stale).length,staleValueUsd:De(l),stalePercent:b?De(l/b*100):null,ttlMs:n},risk:y})}var pe,De,ce,Me,om,Lo,cm=v(()=>{tm();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ce=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Me=e=>e.asset??e.symbol??e.coin,om=e=>e.address??e.owner??e.account,Lo=e=>[ce(e.chain??e.chainId),ce(om(e)),ce(Me(e)),ce(e.source)].join("|")});var b2,w2,x2,um=v(()=>{b2=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),w2=Object.freeze(["read","simulate"]),x2=1440*60});function lm(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return cA.test(t)||uA.includes(r)}function Pt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=dA.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of lA)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Jr(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&lm(o))throw new Jr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");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(lm(o))throw new Jr(`${t}.${o}`,"forbidden-key-name");Pt(i,`${t}.${o}`,r,o)}return e}var Jr,cA,uA,lA,dA,dm=v(()=>{um();Jr=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},cA=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,uA=Object.freeze(["privkey","wif","xprv","seed"]);lA=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}]),dA=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as pA}from"node:crypto";function wa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(wa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wa(e[t])}`).join(",")}}`}function fA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function qo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))qo(t)}return e}function xa(e,t="fact"){try{Pt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function mm(e){return pA("sha256").update(wa(e)).digest("hex")}function hm({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:fA(r)};return qo({...s,hash:mm(s)})}function Uo({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");xa(t,"intent");let n=hm({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return qo({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function ym(e,t,r,n={}){if(Sa(e),!(pm[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);xa(r,t);let i=n.external===!0||n.externallySupplied===!0;if(fm.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=hm({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return qo({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Sa(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(mm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(xa(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!pm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(fm.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var ba,pm,fm,Ea=v(()=>{dm();ba=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),pm=Object.freeze(Object.fromEntries(ba.map((e,t)=>[e,Object.freeze(t+1<ba.length?[ba[t+1]]:[])]))),fm=new Set(["signed","broadcast"])});function gm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return mA[t]??t}function hA(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${gm(e)}:${t}`)}function Te(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Bo(r)})}function yA(e,t){let r=Se(e.repeatBuys??e.repeat_buys??e.buyCount),n=Se(e.walletWinRate??e.winRate);Te(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Te(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function gA(e,t){let r=Se(e.ageHours??e.poolAgeHours),n=Se(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Te(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Te(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Te(t,"liquidity_lock",o==null?null:o?.12:-.28)}function bA(e,t){let r=Se(e.floorChange??e.floorChangePct),n=Se(e.sales??e.saleCount);Te(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Te(t,"sales_depth",n===null?null:fe(n/50)*.18)}function wA(e,t){let r=Se(e.flowImbalance??e.imbalance),n=Se(e.fundingRate??e.funding);Te(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Te(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function xA(e,t){let r=Se(e.marketProbability??e.marketPrice??e.probability),n=Se(e.fairProbability??e.referenceProbability??e.fairValue);Te(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Se(e.liquidityUsd??e.liquidity);Te(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function EA(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 Fo(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=gm(o),a=hA(o,i),c=SA[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=Bo(fe(u.length/l)),p=u.reduce((O,w)=>O+w.value,0),f=EA(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Te(u,"shadow_markout",m);let g=Bo(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),x=Bo(fe(d*h)),S=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||S.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&S.push("LOW_COVERAGE","NO_TRADE"),x<.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:x,coverage:d,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 $2,mA,fe,Se,Bo,SA,ka=v(()=>{$2=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),mA=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,Bo=e=>Math.round(e*1e4)/1e4;SA=Object.freeze({wallet:yA,pool:gA,nft_floor:bA,hl_flow:wA,prediction_market:xA})});function kA(e=[],t=[],r={}){let n=Fo(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function AA(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=Uo({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function bm(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=kA(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(AA(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var wm=v(()=>{ka();Ea()});function xm(e){let t=IA[Number(e)]||[];return new Set([...t,...vA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var vA,IA,Sm=v(()=>{vA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],IA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Do(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Aa(e){e&&(e.prepareAttempted=!0)}function va(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function TA(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...xm(o)]:[];return new Set([...n,...i])}function NA(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 RA(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function $A(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 PA(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 LA(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 _A)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of OA)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,RA(e)){let o=$A(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=CA.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=TA(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(NA(e)){let o=PA(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):tt;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>tt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>tt?(r.push(`slippage ${o} exceeds cap ${Math.min(i,tt)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function Ia(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=LA(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var _A,OA,CA,Em=v(()=>{Sm();Re();_A=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),OA=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),CA=/^0x[a-fA-F0-9]{40}$/});var Am={};M(Am,{DESK_TOOLS:()=>UA,runDeskTool:()=>FA});function BA(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")>qA)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 FA(e,t,r={}){if(BA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>km)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Qf)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||am)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Uo,o=r.advanceTradeLifecycle||ym,i=r.assertTradeLifecycle||Sa;if(t.action==="create")return Je(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Je(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Aa(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Ia(t.lifecycle,s?.fact||{});if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Do(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Je(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Aa(r.loopVerifier);let a=Ia(t.lifecycle,t.fact);if(!a.ok)return va(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Do(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Je(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||bm)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Fo)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||Wf,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Je(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Je(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Je(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Je(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var qA,km,Mo,Lt,Zr,UA,vm=v(()=>{Gf();Jf();cm();Ea();ka();wm();Em();qA=128*1024,km=5e4,Mo={type:"string",minLength:1,maxLength:256},Lt={type:"object",additionalProperties:!0},Zr=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),UA=Object.freeze([Zr("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Mo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Lt,parentId:Mo,childId:Mo},required:["action"],additionalProperties:!1}),Zr("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:km},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Zr("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Lt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Zr("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Mo,intent:Lt,lifecycle:Lt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Lt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Zr("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Lt},markouts:{type:"array",maxItems:100,items:Lt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var Im={};M(Im,{deployGloballyEnabled:()=>MA,executeGloballyEnabled:()=>DA,mevExecuteEnabled:()=>jA});function DA(){return nn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function MA(){return nn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function jA(){return nn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var _m=v(()=>{on()});on();import Om from"node:fs";import _a from"node:process";import{fileURLToPath as HA}from"node:url";import{createInterface as Hm}from"node:readline";var ze=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),zm=/^[A-Za-z0-9_-]{1,64}$/;function sn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function de(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function Vm(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Wm(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ze.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!zm.test(o)||r.has(o))continue;r.add(o);let i=n.inputSchema&&typeof n.inputSchema=="object"&&!Array.isArray(n.inputSchema)?{...n.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...n,name:o,inputSchema:i})}return t}function Gm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Km(e,t,r){let n;try{return await Promise.race([e,new Promise((o,i)=>{n=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{r?.()}catch{}},t)})])}finally{clearTimeout(n)}}function Xm(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function dr(e,t,r="arguments",n=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(n>12)return`${r} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>dr(e,i,r,n+1)===null))return`${r} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${r} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${r} must equal the required constant`;if(t.type){let o=Xm(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${r} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${r} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${r} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${r} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${r} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=dr(e[i],t.items,`${r}[${i}]`,n+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${r} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${r}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${r}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=dr(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Yo(e,t={}){let r=Wm(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=Gm(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!Vm(l))return de(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,sn(d,{protocolVersion:l.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(l.method==="notifications/initialized")return null;if(l.method==="ping")return sn(d,{});if(!c)return de(d,-32002,"server not initialized");if(l.method==="tools/list")return sn(d,{tools:r});if(l.method==="tools/call"){let p=l.params?.name,f=l.params?.arguments??{};if(typeof p!="string"||!n.has(p))return de(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return de(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return de(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>ze.maxArgumentBytes)return de(d,-32602,"tool arguments exceeded the size limit");let g=dr(f,o.get(p)?.inputSchema);if(g)return de(d,-32602,g);try{let h=new AbortController,x=await Km(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return sn(d,x)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return de(d,-32001,"tool call timed out");let x=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(x),O=/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(x.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return S&&!O&&x.length<=200?de(d,-32e3,`tool call failed: ${x}`):de(d,-32e3,"tool call failed")}}return de(d,-32601,"method not found")}}function Ua(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||ze.maxRequestBytes,64),ze.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||ze.maxResponseBytes,256),ze.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||ze.maxConcurrentCalls,1),ze.maxConcurrentCalls),a=s*8,c=Yo(e,t),u={closed:!1,inflight:0},l=Hm({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function g(){if(u.closed||u.readerClosed)return;let w=u.inflight>=s||p.length>0||m;w&&!f?(f=!0,l.pause(),typeof r.pause=="function"&&r.pause()):!w&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),l.resume())}function h(w){if(!w||u.closed)return;let _=JSON.stringify(w);Buffer.byteLength(_)>i&&(_=JSON.stringify(de(w.id,-32003,"response exceeded the size limit"))),n.write(`${_}
|
|
22
|
+
`)===!1&&!m&&(m=!0,g(),n.once("drain",()=>{m=!1,S()}))}function x(w){u.inflight+=1,g(),Promise.resolve(c(w)).then(h).catch(()=>h(de(w?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,S()})}function S(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)x(p.shift());g()}function O(){u.closed||(h(de(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",w=>{if(u.closed)return;let _=String(w).split(`
|
|
23
|
+
`);for(let k=0;k<_.length;k+=1){if(d+=Buffer.byteLength(_[k]),d>o){O();return}k<_.length-1&&(d=0)}}),l.on("line",w=>{if(u.closed)return;if(Buffer.byteLength(w)>o){O();return}let _;try{_=JSON.parse(w)}catch{h(de(null,-32700,"parse error"));return}if(p.length>=a){h(de(_?.id,-32e3,"server busy"));return}p.push(_),S()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ba=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),Ym=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function ct(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function 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 pr(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Ee(o)}return`${r} raw`}return Ee(e)}var Qm=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Jm(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Qm[String(e||"").toUpperCase()]}function Fa(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((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=Jm(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let l=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=pr(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??pr(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?pr(d,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",pr(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let x=Number(d),S=Number(m);Number.isFinite(x)&&Number.isFinite(S)&&x>0&&S>0&&S<=x&&s("SLIPPAGE",`${((1-S/x)*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(x=>x!==a).slice(0,3):[];for(let x of h){let S=x?.provider||x?.venue||x?.source,O=pr(x?.netOut??x?.amountOut??x?.toAmount,u);S&&O&&s(`vs ${S}`,O,{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 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,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 d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ee(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((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(l=>Number(l?.priceEth??l?.price??l?.costEth)).filter(l=>Number.isFinite(l)&&l>0);u.length>0&&s("AVG BUY",`${Ee(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ee(o.owners??o.numOwners))}return i}function Zm(e,t,r){let n=Ba[e]||Ba.generic,o=Fa(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=ct(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${ct(u.label)}</span><b>${ct(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
|
|
24
24
|
:root{color-scheme:dark}
|
|
25
25
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
26
26
|
body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
@@ -61,4 +61,4 @@ ${i?`<div class="hero">${ct(i.value)}</div><div class="herolabel">${ct(i.label)}
|
|
|
61
61
|
${c}
|
|
62
62
|
<details><summary>details \xB7 ${ct(t)}</summary><pre>${a}</pre></details>
|
|
63
63
|
<div class="foot"><span>${ct(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
|
|
64
|
-
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Da(e,t){let r=Ym[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Fa(r,t).some(i=>i.hero))return null;let o=Zm(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Qo();function ja(e){let t=String(e||"").replace(/[^a-z0-9]/gi,"").toLowerCase();return/authorization|cookie|password|credential|privatekey|mnemonic|seedphrase|apikey|accesstoken|refreshtoken|clientsecret|signertoken|bearer/.test(t)||t.endsWith("secret")?!0:t.endsWith("token")&&!new Set(["tokenin","tokenout","tokenid","tokens"]).has(t)}var fh=[/\bsk-[A-Za-z0-9_-]{10,}\b/g,/\bsk_(?:live|test)_[A-Za-z0-9_-]{10,}\b/g,/\b(?:ghp_|github_pat_|gho_|ghs_|xox[baprs]-|AIza|AKIA|pplx-|hf_|xai-|gsk_|npm_|tvly-)[A-Za-z0-9_-]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,/\bBearer\s+[^\s,"'}]+/gi,/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi];function an(e){let t=String(e??"");for(let r of fh)r.lastIndex=0,t=t.replace(r,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(r,n,o)=>ja(n)?`${n}${o}[REDACTED]`:r),mh(wt(t,{force:!0}))}function mh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Ma(t);return r.ok?r.href:t})}function fr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(ja(n))return"[REDACTED]";if(typeof e=="string"){let i=an(e);return i.length<=2e4?i:`${i.slice(0,2e4)}\u2026[truncated]`}if(e==null||typeof e=="boolean"||typeof e=="number")return e;if(t>=12)return"[max-depth]";if(typeof e!="object")return wt(String(e),{force:!0}).slice(0,240);if(r.has(e))return"[circular]";if(r.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>fr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=fr(s,{depth:t+1,seen:r,key:i});return o}function qA(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let r=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!r||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var Oa=qA(Xo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),UA=2*1024*1024;async function BA(e,t=UA){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Cm={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},cr={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Nm=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],Tm=String(_a.env.ORACLE_DEFAULT_ADDRESS||_a.env.MAD_OPERATOR_ADDRESS||"").trim(),FA=Object.freeze(["data_call","address_book_remember","address_book_list","address_book_lookup","address_book_forget","vault_status","signer_status","signer_pending","signer_queue","signer_ack","signer_deny","skill_list","skill_load"]),DA=new Set(Nm.map(e=>e.name));for(let e of FA)if(DA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var MA={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||Tm||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||Tm;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Ca(e,{method:t="GET",body:r,signal:n}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0,signal:n}),i=await BA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function jA(e,t,r={},n={}){try{return await Ca(`${Oa}/data/call`,{method:"POST",body:{provider:e,op:t,args:r},signal:n.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function Rm(e,t={},r={}){let n={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(n){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(nu(),ru));return i(n.operation,{...t,...n.action?{action:n.action}:{},nowMs:t.nowMs??Date.now()},{signal:r.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(zi(),yu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Nl(),Tl)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:r.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(tr(),nd));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(id(),od));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(ad(),sd));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(dd(),ld));return i({...t,amount:t.amount??t.amountIn},{signal:r.signal,...r.quoteFn?{quoteFn:r.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(rp(),tp));return i(t,r)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(op(),np));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(ap(),sp));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(up(),cp));s.vertex=await a(r)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(dp(),lp));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(mp(),fp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(yp(),hp));return s(t,r)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(bp(),gp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(xp(),wp));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Sp(),Ep)),Promise.resolve().then(()=>(Ap(),kp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Oo(),_o));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,r),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,r).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,r).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,r),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},r).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(kf(),Sf));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(jf(),Mf));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(vm(),Am));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(_m(),Im));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(cs(),cl));return{ok:!0,chains:Object.entries(i).map(([s,a])=>({id:s,chainId:a.chainId,name:a.name,evm:a.evm===!0}))}}if(e==="data_catalog")return Ca(`${Oa}/data/catalog`,{signal:r.signal});if(e==="data_health")return Ca(`${Oa}/data/health`,{signal:r.signal});let o=MA[e];if(o){let{provider:i,op:s,args:a}=o(t);return jA(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Pm(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=an(JSON.stringify(fr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=fr(e),o=an(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Da(t,e):null;s&&i.push(s)}catch{}return{content:i}}var $m=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Nm,async call(e,t,r={}){return Pm(await Rm(e,t,r),e)}});function HA(){return Ua($m)}function zA(){let e=_a.argv[1];if(!e)return!1;try{return Om.realpathSync(e)===Om.realpathSync(LA(import.meta.url))}catch{return!1}}zA()&&HA();function VA({timeoutMs:e,callToolOptions:t={}}={}){return Yo({...$m,async call(r,n,o={}){return Pm(await Rm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var X2=VA();export{FA as PUBLIC_MCP_FORBIDDEN_TOOLS,Rm as callTool,VA as createPublicMcpHandler,Pm as formatMcpResult,X2 as handle,Ca as httpJson,BA as readBoundedJsonResponse,qA as resolveDataUrl,HA as startStdioLoop,Nm as tools};
|
|
64
|
+
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Da(e,t){let r=Ym[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Fa(r,t).some(i=>i.hero))return null;let o=Zm(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Qo();function ja(e){let t=String(e||"").replace(/[^a-z0-9]/gi,"").toLowerCase();return/authorization|cookie|password|credential|privatekey|mnemonic|seedphrase|apikey|accesstoken|refreshtoken|clientsecret|signertoken|bearer/.test(t)||t.endsWith("secret")?!0:t.endsWith("token")&&!new Set(["tokenin","tokenout","tokenid","tokens"]).has(t)}var fh=[/\bsk-[A-Za-z0-9_-]{10,}\b/g,/\bsk_(?:live|test)_[A-Za-z0-9_-]{10,}\b/g,/\b(?:ghp_|github_pat_|gho_|ghs_|xox[baprs]-|AIza|AKIA|pplx-|hf_|xai-|gsk_|npm_|tvly-)[A-Za-z0-9_-]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,/\bBearer\s+[^\s,"'}]+/gi,/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi];function an(e){let t=String(e??"");for(let r of fh)r.lastIndex=0,t=t.replace(r,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(r,n,o)=>ja(n)?`${n}${o}[REDACTED]`:r),mh(wt(t,{force:!0}))}function mh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Ma(t);return r.ok?r.href:t})}function fr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(ja(n))return"[REDACTED]";if(typeof e=="string"){let i=an(e);return i.length<=2e4?i:`${i.slice(0,2e4)}\u2026[truncated]`}if(e==null||typeof e=="boolean"||typeof e=="number")return e;if(t>=12)return"[max-depth]";if(typeof e!="object")return wt(String(e),{force:!0}).slice(0,240);if(r.has(e))return"[circular]";if(r.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>fr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=fr(s,{depth:t+1,seen:r,key:i});return o}function zA(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let r=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!r||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var Oa=zA(Xo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),VA=2*1024*1024;async function WA(e,t=VA){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Cm={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},cr={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Cm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Nm=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:cr,conversionGasEvidence:cr,gasPriceEvidence:cr,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],Tm=String(_a.env.ORACLE_DEFAULT_ADDRESS||_a.env.MAD_OPERATOR_ADDRESS||"").trim(),GA=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"]),KA=new Set(Nm.map(e=>e.name));for(let e of GA)if(KA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var XA={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||Tm||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||Tm;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Ca(e,{method:t="GET",body:r,signal:n}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0,signal:n}),i=await WA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function YA(e,t,r={},n={}){try{return await Ca(`${Oa}/data/call`,{method:"POST",body:{provider:e,op:t,args:r},signal:n.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function Rm(e,t={},r={}){let n={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(n){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(nu(),ru));return i(n.operation,{...t,...n.action?{action:n.action}:{},nowMs:t.nowMs??Date.now()},{signal:r.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(zi(),yu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Nl(),Tl)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:r.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(tr(),nd));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(id(),od));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(ad(),sd));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(dd(),ld));return i({...t,amount:t.amount??t.amountIn},{signal:r.signal,...r.quoteFn?{quoteFn:r.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(rp(),tp));return i(t,r)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(op(),np));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(ap(),sp));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(up(),cp));s.vertex=await a(r)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(dp(),lp));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(mp(),fp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(yp(),hp));return s(t,r)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(bp(),gp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(xp(),wp));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Ep(),Sp)),Promise.resolve().then(()=>(Ap(),kp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Io(),vo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Oo(),_o));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,r),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,r).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,r).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(Oo(),_o));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,r),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},r).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(aa(),sa));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(kf(),Ef));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(jf(),Mf));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(vm(),Am));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(_m(),Im));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(cs(),cl));return{ok:!0,chains:Object.entries(i).map(([s,a])=>({id:s,chainId:a.chainId,name:a.name,evm:a.evm===!0}))}}if(e==="data_catalog")return Ca(`${Oa}/data/catalog`,{signal:r.signal});if(e==="data_health")return Ca(`${Oa}/data/health`,{signal:r.signal});let o=XA[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 $m(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=an(JSON.stringify(fr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=fr(e),o=an(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Da(t,e):null;s&&i.push(s)}catch{}return{content:i}}var Pm=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Nm,async call(e,t,r={}){return $m(await Rm(e,t,r),e)}});function QA(){return Ua(Pm)}function JA(){let e=_a.argv[1];if(!e)return!1;try{return Om.realpathSync(e)===Om.realpathSync(HA(import.meta.url))}catch{return!1}}JA()&&QA();function ZA({timeoutMs:e,callToolOptions:t={}}={}){return Yo({...Pm,async call(r,n,o={}){return $m(await Rm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var nN=ZA();export{GA as PUBLIC_MCP_FORBIDDEN_TOOLS,Rm as callTool,ZA as createPublicMcpHandler,$m as formatMcpResult,nN as handle,Ca as httpJson,WA as readBoundedJsonResponse,zA as resolveDataUrl,QA as startStdioLoop,Nm as tools};
|