@oracle-agent/oracle 0.35.4 → 0.35.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +25 -23
- package/dist/bin/oracle-data-mcp.mjs +13 -11
- package/dist/bin/oracle-gateway.mjs +35 -35
- package/dist/bin/oracle-mev-arb-shadow.mjs +7 -5
- package/dist/bin/oracle-mev-shadow.mjs +7 -5
- package/dist/bin/oracle-public-server.mjs +6 -4
- package/dist/bin/oracle-route.mjs +22 -20
- package/dist/bin/oracle-scan.mjs +14 -12
- package/dist/bin/oracle-telegram-mcp.mjs +10 -10
- package/dist/bin/oracle.mjs +7 -5
- package/dist/cli/commands/chat.mjs +166 -164
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +113 -113
- package/dist/cli/commands/farm.mjs +14 -14
- package/dist/cli/commands/follow.mjs +16 -14
- package/dist/cli/commands/model.mjs +170 -168
- package/dist/cli/commands/project.mjs +17 -0
- package/dist/cli/commands/resolve.mjs +8 -6
- package/dist/cli/commands/shadow.mjs +21 -0
- package/dist/cli/commands/signer.mjs +10 -10
- package/dist/cli/commands/snipe.mjs +10 -8
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +27 -25
- package/dist/cli/commands/telegram.mjs +10 -10
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +23 -21
- package/dist/data/names.mjs +4 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +37 -35
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +9 -9
- package/dist/nft/universal-mint-router.mjs +5 -3
- package/dist/router/index.mjs +4 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +5 -3
- package/dist/strategy/index.mjs +3 -3
- package/package.json +1 -1
- package/public/oracle-splash/index.html +2 -2
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`),c=Ah("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Ph(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ga):Math.min(250*2**e,Ga)+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 qh(e){return e?e.byteLength??e.length??0:0}async function Xa(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+=qh(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 Ya(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Uh(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,E=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,E);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 za(x,b,k.addresses);return k};try{let w=String(e),_={...n||{}};c&&await O(w);for(let k=0;k<=Ka;k+=1){let b=await x(w,{method:r,headers:_,body:o,signal:g,redirect:"manual"});if(_h.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let $=await Xa(b,u??Oh,{url:w,truncate:!0}),q=new Error(`HTTP ${b.status} ${r} ${w} redirected non-idempotent request`);throw q.status=b.status,q.body=Ya($)??$.slice(0,300),q}if(k===Ka)throw hr(b),new Error(`HTTP redirect loop for ${e}`);let S=b.headers?.get?.("location"),R;try{R=Nh(S,w)}catch($){throw hr(b),$}let I=!Rh(R,w);if(hr(b),I&&(_=Th(_)),c)await O(R,{status:b.status});else if(I){let $=await ei(R,E);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(S){throw hr(b),mr(S?.message||String(S))}let y=await Xa(b,u,{url:w,onOversize:()=>f.abort()}),A=Ya(y);if(!b.ok){let S=new Error(`HTTP ${b.status} ${r} ${w}`);throw S.status=b.status,S.retryAfter=b.headers?.get?.("retry-after")??null,S.body=A??y.slice(0,300),S}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):Ih,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 Uh(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,S=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?S.has(y)||vh.has(y)&&Wa.has(o):!A&&Wa.has(o);if(k===a||!R)throw b;let I=Ph(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 Lh(I)}}throw _};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let E=$h(o,e,i,{untrustedUrl:l,maxResponseBytes:g}),O=oi.get(E);if(O)return O;let w=h().finally(()=>oi.delete(E));return oi.set(E,w),w}async function ln(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 vh,Wa,Ih,Ga,Qa,_h,Ka,Oh,oi,Lh,W=v(()=>{Va();vh=new Set([408,425,429,500,502,503,504]),Wa=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ih=2,Ga=4e3,Qa=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],_h=new Set([301,302,303,307,308]),Ka=3,Oh=64*1024;oi=new Map;Lh=e=>new Promise(t=>setTimeout(t,e))});function Dh({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"?Fh:Bh}async function si(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Dh(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ja(e={}){return si({type:"meta"},e)}async function Za({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 ec({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 Bh,Fh,ai=v(()=>{W();Bh="https://api.hyperliquid.xyz/info",Fh="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Mh}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 tc(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Hh(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function zh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Vh(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 nc(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!jh.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 oc(e){return Mh("sha256").update(JSON.stringify(nc(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 Wh(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`),E=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||E>=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 ic(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=nc(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=oc(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Wh(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={})=>rc({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,E;try{x=ut(a,g,r),E=ut(a,h,r)}catch(B){return d([{type:"backtest_error",message:String(B.message||B)}])}let O={metrics:ci(x),costs:tc(x),tradeCount:x.metrics.tradeCount},w={metrics:ci(E),costs:tc(E),tradeCount:E.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),tn;try{tn=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 rn=ci(tn),nn=Vh(rn,a.risk,i);k.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:nn,reason:nn?"pass":"fail_metrics",metrics:rn})}let y=k.filter(B=>B.passed).length,A=k.length===0?0:y/k.length,S={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=Hh(w.costs),I=zh(E);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"),rc({status:j,strategy:a,sHash:c,barsHash:u,split:_,train:O,holdout:w,walkForward:S,flags:s})}function rc({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=oc(u),li(Et(JSON.parse(JSON.stringify(u))))}var jh,pi=v(()=>{At();St();dn();jh=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as Gh,createHmac as Kh,timingSafeEqual as Tv}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 sc(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function ac(e=process.env){return sc(process.env)||sc(e)}function Jh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Zh(e){let t=Jh(e);return Gh("sha256").update(fi(t)).digest("hex")}function e0(e,t=ac()){return t?Kh("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+Yh:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>Qh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:Xh},f=Zh(p),m=ac(n),g=m?e0(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var Xh,Yh,Qh,ge=v(()=>{Xh=2,Yh=300*1e3,Qh=(()=>{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 r0(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=r0(r);if(t0.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 cc({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(ic(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 t0,uc=v(()=>{At();pi();St();ge();t0=["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 o0(e){let t=n0[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function i0(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 s0(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 a0({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 ec({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 s0(o,r)}function c0(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 lc(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=o0(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([Za({coin:r,interval:n,startTime:a,endTime:i},t),a0({coin:r,startTime:a,endTime:i},t)]),l=i0(c,{endTime:i}),d=wr(c0(l,u,o));return wr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var n0,dc=v(()=>{ai();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})});function d0(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))l0.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"||!u0.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 p0(e={}){let t=await Ja(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 u0,l0,pc,fc=v(()=>{ai();uc();dc();u0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),l0=new Set(["coin","interval"]);pc=Object.freeze({id:"hyperliquid",validateMarket:d0,fetchBars:lc,listMarkets:p0,prepareIntent(e){return cc(e)}})});function m0(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 f0.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:h0.get(e)??null}function gi(e){let t=yi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var f0,mc,h0,zv,bi=v(()=>{fc();f0=Object.freeze(["id","validateMarket","prepareIntent"]);mc=[pc].map(m0),h0=new Map(mc.map(e=>[e.id,e])),zv=Object.freeze([...mc])});import{createHash as y0}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 Ic(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(_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 kc(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 pn(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 v0(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 pn(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 I0(e,t){if(!_e(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>wc)return C(t,"parameters",`too many parameters (max ${wc})`),null;let n={};for(let o of r){if(!Ac.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,yc,s,t);for(let d of yc)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&&(Ic(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 _0(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"||!bc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),lt(e,A0,o,n),null;switch(lt(e,bc[e.type],o,n),(typeof e.id!="string"||!vc.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"||!g0.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=kc(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!b0.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?S0.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be line|signal|histogram"):C(n,`${o}.output`,"required field is missing"),"period"in e&&C(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(n,`${o}.stdDev`,"required field is missing");else{let a=kc(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?k0.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"||!w0.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"||!x0.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"||!E0.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 O0(e,t,r){if(!_e(e))return C(t,"risk","must be a plain object"),null;lt(e,gc,"risk",t);for(let p of gc)(!(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,hc,"",r);for(let d of hc)(!(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"||!Ac.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>Ec)&&C(r,"name",`must be a non-empty string max ${Ec}`);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=I0(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>xc)C(r,"nodes",`too many nodes (max ${xc})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=_0(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&vc.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 pn(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 pn(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 pn(p)){let g=a.get(m);g&&!xi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}v0(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,Ei,"rules",r);for(let d of Ei)d in e.rules||C(r,`rules.${d}`,"required field is missing");c={};for(let d of Ei){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=O0(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 C0(e){let t=me(e);return JSON.stringify(Ai(t))}function Ut(e){let t=C0(e);return y0("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(!Ic(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,Ac,vc,g0,b0,w0,x0,E0,S0,k0,xi,hc,yc,Ei,gc,A0,bc,wc,xc,Ec,Dt,St=v(()=>{bi();wi=1,Ac=/^[a-z0-9][a-z0-9._-]{0,63}$/,vc=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,g0=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),b0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),w0=new Set(["gt","gte","lt","lte","eq"]),x0=new Set(["and","or","not"]),E0=new Set(["above","below"]),S0=new Set(["line","signal","histogram"]),k0=new Set(["upper","middle","lower"]),xi=new Set(["compare","logic","cross"]),hc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),yc=new Set(["value","min","max","step"]),Ei=new Set(["entryLong","entryShort","exitLong","exitShort"]),gc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),A0=new Set(["id","type"]),bc={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"])},wc=16,xc=128,Ec=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 T0(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 Oc(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 fn(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 Cc(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]=_c(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]=_c(i,s)}return r}function _c(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Tc(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=fn(e,r),s=fn(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 Nc(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 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 Rc(e,t){T0(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 $c=v(()=>{});import{createHash as N0}from"node:crypto";var Ii,R0,$0,P0,Pc,Lc=v(()=>{Ii=3,R0="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",$0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",P0="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",Pc=N0("sha256").update(JSON.stringify({version:Ii,compilerSourceHash:R0,indicatorsSourceHash:$0,schemaSourceHash:P0})).digest("hex")});function ke(e){return typeof e=="number"&&Number.isFinite(e)}function U0(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 B0(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!==q0[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=L0[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=Rc(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=Oc(l,c);else if(s.indicator==="ema")a=fn(l,c);else if(s.indicator==="rsi")a=Cc(l,c);else if(s.indicator==="macd")a=Tc(l,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Nc(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(U0(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 E=f.get(x);g[x]=E[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){B0(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,L0,q0,At=v(()=>{St();$c();Lc();br=Ii,kt=Pc,L0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),q0=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 F0}from"node:crypto";function M0(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 mn(e){if(Array.isArray(e))return e.map(mn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=mn(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 Uc(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&&Uc(e),F0("sha256").update(JSON.stringify(mn(e)),"utf8").digest("hex")}function j0(e){if(e==null&&(e={}),!M0(e))throw new TypeError("options must be a plain object");let t={...D0},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 hn(e){return e/1e4}function H0(e,t,r){let n=hn(r);return t==="long"?e*(1+n):e*(1-n)}function z0(e,t,r){let n=hn(r);return t==="long"?e*(1-n):e*(1+n)}function qc(e,t,r){let n=Math.abs(e)*hn(t),o=Math.abs(e)*hn(r);return{taker:n,builder:o,total:n+o}}function V0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function W0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function G0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function K0(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 X0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Y0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function Q0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Sr(e,t){for(let r of e.requiredSeries)if(J0.includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function Z0(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 ey(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=j0(r);Uc(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,l=n.takerFeeBps,d=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,g=0,h=0,x=0,E=[],O=[],w=[],_=[],k=[],b=null,y=0,A=null,S=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=V0(p,s);if(!(z>0)||!(ee>0))return;let te=H0(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=qc(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:W0(te,D,s.stopLossPct),take:G0(te,D,s.takeProfitPct),liq:K0(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=z0(te,z,u));let se=b.qty,ur=se*Q;if(P!=="liquidation"){let qa=B(T),Vm=Q*qa;if(se>qa)return w.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ur,maxFillNotionalUsd:Vm,reason:"volume_participation",triggerReason:P}),!1;j[T]+=se}let He=qc(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 zm={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 E.push(zm),P==="liquidation"&&O.push({barIndex:T,time:t[T].t,side:z,price:Q,tradeIndex:E.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 tn(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 rn(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 nn(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Na(T){if(!b)return;let D=t[T],P=b.side,ee=Q0(D,P,b.liq),z=X0(D,P,b.stop),te=Y0(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,S=H(t[T].o),R=!1),nn(T),tn(T),Na(T),rn(T),!R&&H(t[T].c)<=S*(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 Ra=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);Ra={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 $a=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Dm=$a/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,Mm=zo===0?0:Pa/zo,Vo=0;Ho>0?Vo=jo/Ho:jo>0&&(Vo=1e12);let jm={netPnlUsd:$a,netPnlPct:Dm,maxDrawdownPct:ey(k),winRate:Mm,profitFactor:Vo,tradeCount:zo,sharpe:Z0(k),turnoverUsd:x,exposurePct:y/t.length*100},Hm={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},La={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:br,config:Hm,trades:E,equityCurve:k,metrics:jm,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:O,missedFills:w,openPositionAtEnd:Ra,flags:_};return Oi(La),_i(mn(La))}var D0,J0,dn=v(()=>{At();St();D0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});J0=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as ty}from"node:crypto";function uy(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 ly(e){return String(e).trim().replace(/\s+/g," ")}function dy(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function py(e){for(let r of ny)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 fy(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 ry.has(r)?r:null}function my(e){let t={...iy},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 hy(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 yy(e){let t=ty("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 gy(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 by(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 wy(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 xy(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 Ey(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 Sy(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 ky(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 Ay(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 Bc(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 vy({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:Bc(a.fast),ema_right_period:Bc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Iy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function _y({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 Oy({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 Ty({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Cy[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 Fc(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(!uy(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=cy;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<sy||n>ay)throw new ue("expiresInMs must be between 1h and 30d")}if(oy.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=ly(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(hy(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=dy(o),s=py(o),a=fy(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=my(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=yy(o),d=`Draft ${s} ${i}`.slice(0,100),p=gy(o),f=by(o),m=wy(o),g=xy(o),h=Ey(o),x=Sy(o),E=ky(o),O=[p,f,m,g,h,x,E].filter(Boolean);if(O.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!Ay(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=vy(k):_.kind==="rsi"?w=Iy(k):_.kind==="open_interest"?w=Oy(k):_.kind==="funding"?w=_y(k):w=Ty(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,ry,ny,oy,jt,iy,sy,ay,cy,Cy,Dc=v(()=>{St();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},ry=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),ny=new Set(["BTC","ETH","SOL","HYPE"]),oy=/\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.",iy=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),sy=36e5,ay=30*864e5,cy=864e5;Cy=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Ny}from"node:crypto";function Hc(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 zc(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 yn(e){return JSON.stringify(kr(e))}function Ry(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 $y(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=yn(n),s=yn(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=yn(r),a=yn(o);return s<a}function Vc(e,t,r={}){if(!zc(r))throw new TypeError("options must be a plain object");for(let w of Object.keys(r))if(Hc(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>Mc)throw new TypeError(`maxTrials must be an integer 1..${Mc}`);o=w}let i=r.objective??"netPnlUsd";if(!jc.has(i))throw new TypeError(`objective must be one of ${[...jc].join("|")}`);let s=r.backtestOptions??{};if(!zc(s))throw new TypeError("backtestOptions must be a plain object");for(let w of Object.keys(s))if(Hc(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 _=Ry(a.parameters[w]);if(_.length===0)throw new Error(`parameter "${w}" produces an empty grid`);u[w]=_,l*=_.length}let d=$y(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),E={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:Ny("sha256").update(JSON.stringify(kr(E)),"utf8").digest("hex"),...E};return Ni(kr(JSON.parse(JSON.stringify(O))))}var Mc,jc,Wc=v(()=>{At();St();dn();Mc=256,jc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import gn from"node:path";function bn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ly(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(bn(e))for(let[r,n]of Object.entries(e)){let o=Ly(r);if(Py.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function qy(e){if(typeof e!="string"||!e||!gn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Gc(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 Uy(){return{version:$i,runners:[]}}function Kc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!bn(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,gn.basename(t)),{version:$i,runners:r.runners.map(n=>Ge(n))}}function Xc(e,t){Ht(t,"store");let r=gn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=gn.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 Yc(e={}){let t=e.path;if(qy(t),Gc(t),et.existsSync(t)?Kc(et.readFileSync(t,"utf8"),t):Xc(t,Uy()),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 Gc(t),Kc(et.readFileSync(t,"utf8"),t)}function a(m){Xc(t,m)}function c(m){if(!bn(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 E=Ge(h.runners[x]),O=g(E);if(!bn(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(E=>E.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,Py,Ri,Qc=v(()=>{$i=1,Py=["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 Zc(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 By(e,t,r,n,o){return qi("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Fy(e,t,r,n){return qi("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Dy(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Jc(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=Yc({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,E)=>x.createdAt-E.createdAt||x.id.localeCompare(E.id))[0];if(p)return Pi(p);let f=t(),m=Fy(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])),E=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=Dy(I),X=By(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 S(I,$,q){if(E.has(I.id))return;let j={orderId:I.id,action:Jc(I.action)?"entry":"exit",side:I.side,price:$.o,barT:$.t,signalBarT:I.signalBarT,barIndex:q};if(d.fills.push(j),E.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)),Jc(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(E.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"||E.has(I.id))continue;let $=m.get(I.signalBarT);if($==null)continue;let q=$+1;q<u.length&&(g==null||u[q].t>g)&&S(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?S(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?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&&$.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 eu=v(()=>{At();Qc()});var nu={};M(nu,{runStrategyOperation:()=>Ky});import My from"node:os";import jy from"node:path";function Ar(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function zy(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(Hy.some(n=>zy(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Fi(r)}}function Vy(e){if(!Ar(e))throw new TypeError("strategy input must be a plain object");return Fi(e),e}function Wy(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 tu(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 ru(){return jy.join(My.homedir(),".oracle","strategy-shadow.json")}function Gy(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 Ky(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Vy(t),o=Wy(n,r);if(e==="draft")return{strategy:Fc(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(tu(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 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=Vc(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Di(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:di(tu(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ui({storePath:r.storePath??ru(),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??ru(),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??Gy(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Zc(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 Hy,ou=v(()=>{dn();At();pi();Dc();Wc();eu();bi();Hy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var gu={};M(gu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>du,DEFAULT_SAME_CHAIN_SOURCES:()=>lu,NATIVE_TOKEN:()=>Mi,canonicalJson:()=>fu,hashFirmQuote:()=>yu,hashRfqIntent:()=>hu,normalizeFirmQuote:()=>Hi,normalizeRfqIntent:()=>eg,sha256Hex:()=>vr});import{createHash as Xy}from"node:crypto";import{getAddress as uu,isAddress as ji}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function su(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function wn(e,t){let r=String(e??"").trim();return(!Yy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function Qy(e,t){return e==null||e===""?null:wn(e,t)}function au(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"),uu(r))}function pu(e,t){let r=String(e??"").trim();return ji(r)||re(t,"must be an EVM address"),uu(r)}function Jy(e,t){return e==null||e===""?null:pu(e,t)}function cu(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 Zy(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 fu(e){return JSON.stringify(zt(e))}function vr(e){return`0x${Xy("sha256").update(fu(e)).digest("hex")}`}function mu(e,t){let r={...e};for(let n of t)delete r[n];return r}function hu(e){return vr(mu(e,["intentHash"]))}function yu(e){return vr(mu(e,["firmQuoteHash"]))}function eg(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=su(e.fromChainId??e.fromChain,"fromChainId"),i=su(e.toChainId??e.toChain,"toChainId"),a=o===i?lu:du,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:au(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:au(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:wn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:pu(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Zy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:Qy(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:cu(e.allowedSources,"allowedSources",a),allowedRouters:cu(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=hu(c),Object.freeze(c)}function tg(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!iu.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!iu.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=wn(t.amountOut??t.buyAmount,"amountOut"),a=wn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=tg(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=Jy(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=yu(d),Object.freeze(d)}var Mi,lu,du,iu,Yy,zi=v(()=>{Mi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",lu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),du=Object.freeze(["lifi"]),iu=/^0x[0-9a-fA-F]{64}$/,Yy=/^\d+$/});import{readFileSync as rg}from"node:fs";import{homedir as ng}from"node:os";import{join as xn}from"node:path";function og(){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=ng();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||xn(t,".config","oracle")).trim();return[e,xn(r,"exec.env")].filter(Boolean)}return[e,xn(t,".config","oracle","exec.env"),xn(t,".config","mad-desk","exec.env")].filter(Boolean)}function bu(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of og())try{let i=rg(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 wu=v(()=>{});var xu=v(()=>{});import{createHash as ig,createHmac as Su,timingSafeEqual as sg}from"node:crypto";function En(e){return Array.isArray(e)?`[${e.map(En).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${En(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function ku(e,{required:t=!1}={}){try{return bu(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 Au(e,{secret:t}={}){let r=ku(t);return r?{...e,signature:Su("sha256",r).update(En(Wi(e))).digest("hex")}:e}function ag(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 ig("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=ku(o);if(i){let f=Su("sha256",i).update(En(Wi(e))).digest("hex");if(!cg(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=lg(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 Au({...Wi(e),calldataHash:ag(n)},{secret:o})}function cg(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:sg(r,n)}function Vi(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function ug(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=ug(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=Eu,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)||Eu)),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 Au({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 lg(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,Eu,Re=v(()=>{wu();xu();tt=100,Eu=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 dg,JsonRpcProvider as pg}from"ethers";function bg(e){return gg.test(String(e||""))}async function vu(e,{contract:t=fg,rpc:r=hg,chainId:n=mg,balanceOf:o}={}){if(!bg(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new pg(r,n,{staticNetwork:!0}),s=new dg(t,yg,i);return BigInt(await s.balanceOf(e))}var fg,mg,hg,yg,gg,Iu=v(()=>{fg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",mg=999,hg="https://rpc.hyperliquid.xyz/evm",yg=["function balanceOf(address owner) view returns (uint256)"],gg=/^0x[a-fA-F0-9]{40}$/});import{existsSync as wg,readFileSync as xg,lstatSync as Eg}from"node:fs";import{homedir as _u}from"node:os";import{join as Xi}from"node:path";function Ag(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Ou,t)?Ou[t]:kg}function Cg(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Cu])return String(e[Cu]);let t=e.ORACLE_CONFIG_DIR||Xi(_u(),".config","oracle");return Xi(t,"fee-recipient")}return Xi(_u(),".config","oracle","fee-recipient")}function Tg(e=process.env){try{let t=Cg(e);if(!wg(t)||Eg(t).isSymbolicLink())return"";let r=xg(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Ng(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),Sg)}function Rg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ig]||"").trim(),o=String(e[_g]||Og).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Ag(t),s=Ng(e[vg],{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=Tg(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 kn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Rg({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 vu(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Tu(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 Nu(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Ru(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Sg,kg,Ou,vg,Ig,_g,Cu,Og,An=v(()=>{Iu();Sg=100,kg=5,Ou=Object.freeze({swap:5,bridge:5,perps:0,nft:0});vg="ORACLE_INTEGRATOR_FEE_BPS",Ig="ORACLE_INTEGRATOR_FEE_RECIPIENT",_g="ORACLE_INTEGRATOR_ID",Cu="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Og="oracle"});var Ji={};M(Ji,{LIFI_API:()=>Pu,lifiChains:()=>Ug,lifiHealth:()=>Lg,lifiPrepare:()=>qg,lifiQuote:()=>It});function Qi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Pu).replace(/\/$/,"")}function Pg(e){let t=String(e||Yi).toLowerCase();return t===Yi.toLowerCase()||t===$g}function $u(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 Lg(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 kn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,x]of Object.entries(Nu(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 qg(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(!Pg(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:$u(a,"approval token"),spender:$u(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 Ug(e={}){return N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Pu,Yi,$g,Ir=v(()=>{W();Re();Sn();ge();An();Pu="https://li.quest/v1";Yi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",$g="0x0000000000000000000000000000000000000000"});var Uu={};M(Uu,{PARASWAP_API:()=>Lu,paraswapHealth:()=>Fg,paraswapPrepare:()=>Bg,paraswapPrice:()=>Wt,paraswapTokens:()=>qu});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 qu(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 kn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Ru(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 Bg(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 Fg(e={}){let t=await qu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Lu,Zi,vn=v(()=>{W();Re();ge();An();Lu="https://api.paraswap.io",Zi=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Lu).replace(/\/$/,"")});function In({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:Fu(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([Fu(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[Bu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Bu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Fu(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function _n(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 Bu,es=v(()=>{Bu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Vu={};M(Vu,{ZEROX_API:()=>Du,zeroxHealth:()=>Dg,zeroxPrepare:()=>Mg,zeroxPrice:()=>zu,zeroxQuote:()=>Gt});function Mu(e={}){return In({provider:"zerox",defaultUrl:Du,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function ju(e={}){return Mu(e).baseUrl}function On(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Hu(e={}){return _n({"0x-version":"v2",accept:"application/json"},{"0x-api-key":On(e)},Mu(e).trusted)}async function Dg(e={}){if(!On(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await zu({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 zu(e={},t={}){if(!On(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(`${ju(t)}/swap/allowance-holder/price?${a}`,{headers:Hu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!On(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(`${ju(t)}/swap/allowance-holder/quote?${c}`,{headers:Hu(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 Mg(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 Du,Cn=v(()=>{W();Re();es();ge();Du="https://api.0x.org"});var dI,Wu=v(()=>{dI=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Tn from"node:fs";import jg from"node:os";import Xt from"node:path";import{fileURLToPath as Hg}from"node:url";function Gu(){return process.env.ORACLE_FAKE_HOME||jg.homedir()}function Vg(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Nn(){return Vg()?process.env.ORACLE_CONFIG_DIR||Xt.join(Gu(),".config","oracle"):Xt.join(Gu(),".config","oracle")}function Wg(){return Xt.join(Nn(),"desk.json")}function Gg(){return Xt.join(Nn(),"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=Gg();if(Tn.existsSync(o))for(let i of Tn.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=Wg();if(Tn.existsSync(o)){let i=JSON.parse(Tn.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 zg,gI,Ku=v(()=>{zg=Xt.dirname(Hg(import.meta.url)),gI=Xt.resolve(zg,"../..");try{Kt()}catch{}});var Qu={};M(Qu,{armPreparedAction:()=>tb,callSigner:()=>Xu,queueOwnerAction:()=>Yu});import{existsSync as Kg,readFileSync as Xg}from"node:fs";import{request as Yg}from"node:http";import Qg from"node:path";function Zg(e=process.env){let t=String(e.ORACLE_SIGNER_URL||Jg).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 eb(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Qg.join(Nn(),"signer","signer-token");return Kg(t)?Xg(t,"utf8").trim():null}function Xu(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=Zg(n),s=eb(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=Yg({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 Yu(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Xu("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function tb(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 Yu(r,t)}var Jg,Ju=v(()=>{Ku();Jg="http://127.0.0.1:9462"});var al={};M(al,{COW_CANCEL_TYPES:()=>rl,COW_HOSTS:()=>$n,COW_ORDER_TYPES:()=>Rn,COW_SETTLEMENT:()=>Zu,COW_VAULT_RELAYER:()=>el,armCowOrder:()=>cb,buildArmedCowOrder:()=>os,cowCancelOrders:()=>mb,cowChains:()=>gb,cowHealth:()=>sb,cowOrder:()=>sl,cowOrderStatus:()=>il,cowOrderUid:()=>ub,cowPrepareCancel:()=>pb,cowPrepareOrder:()=>ab,cowQuote:()=>_t,cowSignCancel:()=>fb,cowSignOrder:()=>lb,cowSubmitSignedOrder:()=>db,cowVerifyOrderFill:()=>yb});import{TypedDataEncoder as rs,getAddress as _r,isAddress as rb}from"ethers";function Pn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=$n[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function nb(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(!rb(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 nl(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 ol(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 ob({digest:e,owner:t,validTo:r}={}){let n=nl(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=Zu[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 ib(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=nl(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 sb(e={}){try{let t=await _t({chainId:1,sellToken:ts[1],buyToken:tl[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||tl[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 ab(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=ib(o?.quote||o,r,n),s=ns(r),a={domain:s,types:Rn,primaryType:"Order",message:i},c=rs.hash(s,Rn,i),u=el[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=$n[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 cb(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Ju(),Qu)),n=e.localSignerEnvelope||os(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function il(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 sl(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 ub(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),Rn,n),i=e.owner||e.from||e.signer||n.receiver;return ob({digest:o,owner:i,validTo:n.validTo})}async function lb(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 db(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 pb(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)=>ol(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:rl,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function fb(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function mb(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function hb(e={}){return Yt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function yb(e={},t={}){let r=Number(e.chainId??1),n=ol(e.uid||e.orderUid),o=t.order||await sl({chainId:r,uid:n},t),i=t.status||o.status||await il({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${nb(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(hb(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 gb(){return Object.keys($n).map(Number)}var $n,Zu,el,ts,tl,Rn,rl,Ln=v(()=>{W();Re();Wu();Sn();ge();$n={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"},Zu=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),el=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ts={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},tl={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Rn=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"}]}),rl=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var ul={};M(ul,{CHAINS:()=>qn,chainById:()=>ss,isSupportedChain:()=>cl,registerChain:()=>bb,rpcUrlFor:()=>as});function ss(e){return is.get(Number(e))||null}function bb({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 qn[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 cl(e){return is.has(Number(e))}var qn,is,cs=v(()=>{qn={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(qn).map(e=>[e.chainId,e]))});import{Interface as wb,getAddress as xb}from"ethers";function Or(e,t){try{return xb(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Sb(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=as(e,r);return n||Eb[Number(e)]||null}function Ab(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!kb.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||"");Ab(o);let i=Sb(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 Bn(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ll(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function dl(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 pl(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=Un.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=Un.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 fl(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=Un.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=Un.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 Un,Eb,kb,ot=v(()=>{W();cs();Un=new wb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Eb={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"};kb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function ml(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 Fn(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=ml(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)||vb.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 hl(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&ml(e,r[0]).address||null}var vb,us=v(()=>{vb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function Cb(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 Tb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Nb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Ib).replace(/\/$/,"")}async function Dn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Nb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function yl({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(_b[Number(e)]||e),s=new Set(Ob(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Dn(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=>Cb(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:Tb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function gl(e,{chainSlug:t="solana",stables:r=Rb}={},n={}){let o=await Dn(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=Fn(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Ib,_b,$e,Ob,Rb,Tr=v(()=>{W();us();Ib="https://api.dexscreener.com",_b=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(),Ob=e=>Array.isArray(e)?e:e==null?[]:[e];Rb=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var Il={};M(Il,{PANCAKE_FEE_TIERS:()=>Mn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>El,UNI_V3_VENUES:()=>Al,uniV3Chains:()=>Fb,uniV3EthUsdc:()=>vl,uniV3Health:()=>Bb,uniV3PrepareExactIn:()=>Ub,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>qb});import{Interface as wl,getAddress as Nr,isAddress as xl}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=Al[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===kl||/^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(!xl(n))throw new Error(`invalid token address: ${e}`);return Nr(n)}function Pb(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 Lb(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:El,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=jn.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=jn.decodeFunctionResult("quoteExactInputSingle",y),S={fee:k,ok:!0,amountOut:A[0].toString(),sqrtPriceX96After:A[1].toString(),initializedTicksCrossed:Number(A[2]),gasEstimate:A[3].toString()};d.push(S),(!p||BigInt(S.amountOut)>BigInt(p.amountOut))&&(p=S)}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:Pb(e.venue)},t).catch(()=>[]):[],m={};for(let k of f.slice(0,8))if(!(!k.pairAddress||!xl(k.pairAddress)))try{let b=await Y(r,"eth_call",[{to:k.pairAddress,data:$b},"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,S)=>m[S.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,E=f[0]??null,O=x??E,w=e.liquidityUsd??x?.liquidityUsd??E?.liquidityUsd??null,_=e.liquidityUsd!=null?"caller":x?"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: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 qb(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=Lb(i,s),u=jn.encodeFunctionData("quoteExactInput",[c,a]),l=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),d=jn.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 vl(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 Ub(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===kl||/^eth$/i.test(i),a=await Ot(e,t),c=bl.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=bl.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 Bb(e={}){let t=Number(e.chainId??8453);try{let r=await vl({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 Fb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,El,$b,jn,bl,Sl,kl,Mn,Al,Hn=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"}},El=[100,500,3e3,1e4],$b="0xddca3f43",jn=new wl(["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)"]),bl=new wl(["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",kl="0x0000000000000000000000000000000000000000",Mn=[100,500,2500,1e4],Al={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Mn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Mn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Mn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Nl={};M(Nl,{executeRfqCandidates:()=>Cl,rankRfqQuotes:()=>Tl,requestRfqQuotes:()=>jb,sourceCandidates:()=>Ol});function Rr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function _l(e,t){return String(e?.[t]??"").trim()}function $r(e,t){return Object.freeze({source:e,run:t})}function Ol(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 Db(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")&&(_l(r,"ZEROX_API_KEY")||_l(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 Db(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Mb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Cl(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Mb(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 Tl(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 jb(e,t={}){let r=Ol(e,t),{quotes:n,failed:o}=await Cl(e,r,t),i=Tl(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 Rl=v(()=>{Ir();vn();Cn();Ln();Hn();zi()});function $l(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}Hb.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}=$l(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
2
|
+
var Ym=Object.defineProperty;var I=(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)Ym(e,r,{get:t[r],enumerable:!0})};import{homedir as Ko}from"node:os";import{join as Xo}from"node:path";function Yo(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 an(e,t,r=!1){return String(Yo(e,t,r?"1":"")).trim()==="1"}var Ba,Jm,bv,cn=I(()=>{Ba=process.env.ORACLE_PUBLIC_DESKTOP==="1",Jm=Ba?process.env.ORACLE_CONFIG_DIR||Xo(Ko(),".config","oracle"):Xo(Ko(),".config","oracle"),bv=Ba?Jm:Xo(Ko(),".config","mad-desk")});function xh(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function Eh(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||lh))return r;let n=t.fileRead?Eh:xh;r=r.replace(fh,"[REDACTED_PRIVATE_KEY]"),r=r.replace(ph,"[REDACTED_EVM_KEY]"),r=r.replace(mh,o=>n(o));for(let o of dh)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(hh,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(yh,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(gh,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function Ha(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();wh.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var uh,lh,dh,ph,fh,mh,hh,yh,gh,bh,wh,Qo=I(()=>{uh=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),lh=["1","true","yes","on"].includes(uh),dh=[/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],ph=/\b0x[a-fA-F0-9]{64}\b/g,fh=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,mh=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,hh=/\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,yh=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,gh=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,bh=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"]),wh=new Set([...bh].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import xt from"node:net";import Ah from"node:dns";function dn(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 Zo(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 ei(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=dn(e);if(!t)return!1;let r=dn("::ffff:0:0");return Zo(t,r,96)?ei([...t.slice(12)].join(".")):Zo(t,dn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Zo(t,dn(o),i)):!1}return!1}function Ih(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(vh.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xt.isIP(r);return n!==0&&!ei(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function ti(e,{lookupFn:t=Ah.promises.lookup}={}){let r=Ih(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=>!ei(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function ri({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(y){return f(y)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),l=_h((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 _h(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[ni]=Object.freeze({pin:t}),e}function oi(e){return typeof e=="function"&&typeof e[ni]?.pin=="function"}function Va(e,t,r){if(!oi(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ni].pin(t,r)}var vh,ni,Wa=I(()=>{vh=new Set(["localhost","metadata.google.internal","metadata.goog"]);ni=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Ga}from"node:crypto";function Rh(e){let t=String(e||"").toLowerCase();return ec.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Ph(e){let t={};for(let[r,n]of Object.entries(e||{}))Rh(r)||(t[r]=n);return t}function $h(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 Lh(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Ja(e){let t=String(e?.method||"");return t?!qh.test(t):!1}function Bh(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}return Array.isArray(r)?r.length>0&&r.every(Ja):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?Ja(r):typeof r.type=="string"&&Uh.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function Fh(e,t,r,n={},o=null){let i={};for(let[p,f]of Object.entries(r||{}))i[p.toLowerCase()]=f;let s=Object.keys(i).filter(p=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(p)),c=[...new Set([...ec,...s])].sort().map(p=>`${p}=${i[p]??""}`).join(`
|
|
3
|
+
`),u=Ga("sha256").update(c).digest("hex").slice(0,32),l=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,d=o==null?"-":Ga("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function Dh(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Xa):Math.min(250*2**e,Xa)+Math.floor(Math.random()*100)}function hr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function si(e,t,r){return hr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function yr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function jh(e){return e?e.byteLength??e.length??0:0}async function Qa(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&&(yr(e),!n))throw si(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 si(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+=jh(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 si(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Za(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Hh(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),y=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,h=null,x=t,k=s?{lookupFn:s}:{};if(c&&!a&&!oi(x))throw hr(`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(w,{status:O=null}={})=>{let A=await ti(w,k);if(!A.ok)throw hr(O==null?`HTTP refused ${w}: ${A.error}`:`HTTP redirect to ${w} ${A.error}`,O==null?{}:{status:O});let b=new URL(w).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await ri({requireUndici:!0,...l?{importUndici:l}:{}})}catch(g){throw hr(O==null?`HTTP refused ${w}: ${g?.message||g}`:`HTTP redirect to ${w} refused: ${g?.message||g}`,O==null?{}:{status:O})}h.pin(b,A.addresses),x=h.fetch}else Va(x,b,A.addresses);return A};try{let w=String(e),O={...n||{}};c&&await _(w);for(let A=0;A<=Ya;A+=1){let b=await x(w,{method:r,headers:O,body:o,signal:y,redirect:"manual"});if(Th.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let P=await Qa(b,u??Nh,{url:w,truncate:!0}),q=new Error(`HTTP ${b.status} ${r} ${w} redirected non-idempotent request`);throw q.status=b.status,q.body=Za(P)??P.slice(0,300),q}if(A===Ya)throw yr(b),new Error(`HTTP redirect loop for ${e}`);let E=b.headers?.get?.("location"),R;try{R=$h(E,w)}catch(P){throw yr(b),P}let v=!Lh(R,w);if(yr(b),v&&(O=Ph(O)),c)await _(R,{status:b.status});else if(v){let P=await ti(R,k);if(!P.ok){let q=new Error(`HTTP redirect from ${w} ${P.error}`);throw q.status=b.status,q.retryable=!1,q}a&&P.addresses?.length&&(h||(h=await ri(l?{importUndici:l}:{})),h&&(h.pin(new URL(R).hostname,P.addresses),x=h.fetch))}w=R;continue}if(typeof d=="function")try{await d(b,{url:w})}catch(E){throw yr(b),hr(E?.message||String(E))}let g=await Qa(b,u,{url:w,onOversize:()=>f.abort()}),S=Za(g);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=S??g.slice(0,300),E}return S??g}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):Ch,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),y=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 Hh(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:y,importUndici:d,validateResponse:p,signal:f})}catch(b){O=b;let g=b?.status,S=b?.name==="AbortError"||b?.name==="TimeoutError"||f?.aborted,E=new Set([408,425,429]),R=b?.retryable===!1?!1:g!=null?E.has(g)||Oh.has(g)&&Ka.has(o):!S&&Ka.has(o);if(A===a||!R)throw b;let v=Dh(A,b?.retryAfter);f?await new Promise((P,q)=>{let j=setTimeout(P,v);f.addEventListener("abort",()=>{clearTimeout(j),q(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Mh(v)}}throw O};if(!(t.dedupe!==!1&&!f&&Bh(o,s)))return h();let k=Fh(o,e,i,{untrustedUrl:l,maxResponseBytes:y},s),_=ii.get(k);if(_)return _;let w=h().finally(()=>ii.delete(k));return ii.set(k,w),w}async function qt(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 Oh,Ka,Ch,Xa,ec,Th,Ya,Nh,ii,qh,Uh,Mh,W=I(()=>{Wa();Oh=new Set([408,425,429,500,502,503,504]),Ka=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ch=2,Xa=4e3,ec=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Th=new Set([301,302,303,307,308]),Ya=3,Nh=64*1024;ii=new Map,qh=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,Uh=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Mh=e=>new Promise(t=>setTimeout(t,e))});function Wh({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"?Vh:zh}async function ai(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Wh(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function tc(e={}){return ai({type:"meta"},e)}async function rc({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 ai(i,o)}async function nc({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return ai({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var zh,Vh,ci=I(()=>{W();zh="https://api.hyperliquid.xyz/info",Vh="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Gh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e){return typeof e=="number"&&Number.isFinite(e)}function di(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)di(t);return Object.freeze(e)}for(let t of Object.keys(e))di(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 ui(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 oc(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Xh(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Yh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Jh(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 sc(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Kh.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 ac(e){return Gh("sha256").update(JSON.stringify(sc(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 li(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(!Ut(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 Qh(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(!Ut(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");li(e.train,"train");let u=li(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Ut(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 y=0;y<d.length;y++){let h=d[y];if(!Ve(h)||h.index!==y||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let x=Ne(h.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),k=Ne(h.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),_=Ne(h.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),w=Ne(h.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(x!==0||k>=_||_>w||_<=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 O=li({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${y}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Ut(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/d.length;if(!Ut(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 cc(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=sc(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=ac(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Qh(e,t),e}function pi({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(!Ut(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=Bt(a),u=gr(t),l=t.length,d=(B=[],H={})=>ic({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 y=t.slice(0,p),h=t.slice(f),x,k;try{x=ut(a,y,r),k=ut(a,h,r)}catch(B){return d([{type:"backtest_error",message:String(B.message||B)}])}let _={metrics:ui(x),costs:oc(x),tradeCount:x.metrics.tradeCount},w={metrics:ui(k),costs:oc(k),tradeCount:k.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},A=[],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){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),nn;try{nn=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 on=ui(nn),sn=Jh(on,a.risk,i);A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:sn,reason:sn?"pass":"fail_metrics",metrics:on})}let g=A.filter(B=>B.passed).length,S=A.length===0?0:g/A.length,E={windows:A,passRate:S,windowsRun:A.length};w.metrics.tradeCount===0&&_.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"}),_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(w.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=Xh(w.costs),v=Yh(k);v>0&&R>v&&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 w.metrics.tradeCount>=i&&w.metrics.netPnlUsd>0&&w.metrics.profitFactor>1&&w.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&S>=.6&&!(v>0&&R>v)&&!q&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?j="pass_live_eligible":!P&&w.metrics.tradeCount>0&&_.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&&_.metrics.netPnlUsd>0?j="fail":w.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!P?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"),ic({status:j,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:w,walkForward:E,flags:s})}function ic({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=ac(u),di(Et(JSON.parse(JSON.stringify(u))))}var Kh,fi=I(()=>{At();St();pn();Kh=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as Zh,createHmac as e0,timingSafeEqual as Dv}from"node:crypto";function mi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(mi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${mi(e[r])}`).join(",")}}`}function uc(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function lc(e=process.env){return uc(process.env)||uc(e)}function o0(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function i0(e){let t=o0(e);return Zh("sha256").update(mi(t)).digest("hex")}function s0(e,t=lc()){return t?e0("sha256",t).update(String(e)).digest("hex"):""}function Q(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+r0:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>n0)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:t0},f=i0(p),m=lc(n),y=m?s0(f,m):void 0,h={...p,prepareHash:f};return y&&(h.prepareMac=y),h}var t0,r0,n0,ge=I(()=>{t0=2,r0=300*1e3,n0=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function br(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function c0(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function yi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>yi(r,`${t}[${n}]`));return}if(br(e))for(let[r,n]of Object.entries(e)){let o=c0(r);if(a0.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);yi(n,`${t}.${r}`)}}function hi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function dc({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(yi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!br(e))throw new Error("handoff: strategy required");if(!br(t))throw new Error("handoff: evidence required");if(!br(r))throw new Error("handoff: shadow required");if(!br(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(cc(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(!hi(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(!hi(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(!hi(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:wr,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 Q(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var a0,pc=I(()=>{At();fi();St();ge();a0=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Ft(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Dt(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function xr(e){if(Array.isArray(e))for(let t of e)xr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))xr(t);return Object.freeze(e)}function l0(e){let t=u0[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function d0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Dt(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=Dt(Number(o.t),`candles[${n}].t`);if(Dt(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Ft(o.o,`candles[${n}].o`),h:Ft(o.h,`candles[${n}].h`),l:Ft(o.l,`candles[${n}].l`),c:Ft(o.c,`candles[${n}].c`),v:Ft(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 xr([...r.values()].sort((n,o)=>n.t-o.t))}function p0(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=Dt(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Ft(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function f0({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 nc({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 p0(o,r)}function m0(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 fc(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=l0(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Dt(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):Dt(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([rc({coin:r,interval:n,startTime:a,endTime:i},t),f0({coin:r,startTime:a,endTime:i},t)]),l=d0(c,{endTime:i}),d=xr(m0(l,u,o));return xr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var u0,mc=I(()=>{ci();u0=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 g0(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))y0.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"||!h0.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 b0(e={}){let t=await tc(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 h0,y0,hc,yc=I(()=>{ci();pc();mc();h0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),y0=new Set(["coin","interval"]);hc=Object.freeze({id:"hyperliquid",validateMarket:g0,fetchBars:fc,listMarkets:b0,prepareIntent(e){return dc(e)}})});function x0(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 w0.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 gi(e){return typeof e!="string"?null:E0.get(e)??null}function bi(e){let t=gi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var w0,gc,E0,e1,wi=I(()=>{yc();w0=Object.freeze(["id","validateMarket","prepareIntent"]);gc=[hc].map(x0),E0=new Map(gc.map(e=>[e.id,e])),e1=Object.freeze([...gc])});import{createHash as S0}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 vc(e){return Number.isInteger(e)&&e>0}function Ai(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ai(t);return Object.freeze(e)}for(let t of Object.keys(e))Ai(e[t]);return Object.freeze(e)}function vi(e){if(Array.isArray(e))return e.map(vi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=vi(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 Cc(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 ki(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(vc)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return vc(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function Ic(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 fn(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 N0(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 fn(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 R0(e,t){if(!_e(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>Sc)return C(t,"parameters",`too many parameters (max ${Sc})`),null;let n={};for(let o of r){if(!_c.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,wc,s,t);for(let d of wc)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&&(Cc(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 P0(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"||!Ec[e.type])return C(n,`${o}.type`,"unknown or missing node type"),lt(e,T0,o,n),null;switch(lt(e,Ec[e.type],o,n),(typeof e.id!="string"||!Oc.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"||!k0.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=Ic(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!A0.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=ki(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=ki(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=ki(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?O0.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=Ic(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?C0.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"||!v0.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"||!I0.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"||!_0.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 $0(e,t,r){if(!_e(e))return C(t,"risk","must be a plain object"),null;lt(e,xc,"risk",t);for(let p of xc)(!(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 Ii(e,t={}){let r=[];if(!_e(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};lt(e,bc,"",r);for(let d of bc)(!(d in e)||e[d]==null)&&C(r,d,"required field is missing");e.version!==xi&&C(r,"version",`must be ${xi}`),(typeof e.id!="string"||!_c.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>Ac)&&C(r,"name",`must be a non-empty string max ${Ac}`);let n=gi(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=R0(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>kc)C(r,"nodes",`too many nodes (max ${kc})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=P0(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Oc.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 fn(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 fn(p)){let y=a.get(m);y&&Ei.has(y.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of fn(p)){let y=a.get(m);y&&!Ei.has(y.type)&&C(r,f,`node ref "${m}" must be boolean`)}}N0(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);Ei.has(f.type)||C(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=$0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Ai({version:xi,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=Ii(e,t);if(!r.ok)throw new Mt(r.errors);return r.strategy}function L0(e){let t=me(e);return JSON.stringify(vi(t))}function Bt(e){let t=L0(e);return S0("sha256").update(t,"utf8").digest("hex")}function Er(e,t){if(!_e(e))throw new Mt([{path:"",message:"strategy must be a plain object"}]);if(!_e(t))throw new Mt([{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(!Cc(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 Mt(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 xi,_c,Oc,k0,A0,v0,I0,_0,O0,C0,Ei,bc,wc,Si,xc,T0,Ec,Sc,kc,Ac,Mt,St=I(()=>{wi();xi=1,_c=/^[a-z0-9][a-z0-9._-]{0,63}$/,Oc=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,k0=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),A0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),v0=new Set(["gt","gte","lt","lte","eq"]),I0=new Set(["and","or","not"]),_0=new Set(["above","below"]),O0=new Set(["line","signal","histogram"]),C0=new Set(["upper","middle","lower"]),Ei=new Set(["compare","logic","cross"]),bc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),wc=new Set(["value","min","max","step"]),Si=new Set(["entryLong","entryShort","exitLong","exitShort"]),xc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),T0=new Set(["id","type"]),Ec={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"])},Sc=16,kc=128,Ac=100,Mt=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 q0(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 Nc(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 mn(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 Rc(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]=Tc(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]=Tc(i,s)}return r}function Tc(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Pc(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=mn(e,r),s=mn(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 y=0;y<o;y++)d+=a[l[y]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let y=o;y<l.length;y++){let h=l[y];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function $c(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 Lc(e,t){q0(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 qc=I(()=>{});import{createHash as U0}from"node:crypto";var _i,B0,F0,D0,Uc,Bc=I(()=>{_i=3,B0="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",F0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",D0="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",Uc=U0("sha256").update(JSON.stringify({version:_i,compilerSourceHash:B0,indicatorsSourceHash:F0,schemaSourceHash:D0})).digest("hex")});function ke(e){return typeof e=="number"&&Number.isFinite(e)}function H0(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 jt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function z0(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!==j0[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=M0[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=jt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?jt(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=Lc(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=Nc(l,c);else if(s.indicator==="ema")a=mn(l,c);else if(s.indicator==="rsi")a=Rc(l,c);else if(s.indicator==="macd")a=Pc(l,{fastPeriod:jt(s.fastPeriod,r),slowPeriod:jt(s.slowPeriod,r),signalPeriod:jt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=$c(l,{period:c,stdDev:jt(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=Er(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(H0(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=Bt(r);function u(f,m){let y={};for(let x of o){let k=f.get(x);y[x]=k[m]}let h=x=>x!=null&&y[x]===!0;return{values:y,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){z0(f,m,r.market.interval);let y=new Map;for(let h of o)vt(h,n,i,f,m,y);return y}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,y=l(f,m);return Object.freeze(f.map((h,x)=>Object.freeze(u(y,x))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:wr,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var wr,kt,M0,j0,At=I(()=>{St();qc();Bc();wr=_i,kt=Uc,M0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),j0=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 V0}from"node:crypto";function G0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function Oi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Oi(t);return Object.freeze(e)}for(let t of Object.keys(e))Oi(e[t]);return Object.freeze(e)}function hn(e){if(Array.isArray(e))return e.map(hn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=hn(e[r]);return t}return e}function Ci(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)=>Ci(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Ci(n,`${t}.${r}`)}}function Dc(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 gr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Dc(e),V0("sha256").update(JSON.stringify(hn(e)),"utf8").digest("hex")}function K0(e){if(e==null&&(e={}),!G0(e))throw new TypeError("options must be a plain object");let t={...W0},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 yn(e){return e/1e4}function X0(e,t,r){let n=yn(r);return t==="long"?e*(1+n):e*(1-n)}function Y0(e,t,r){let n=yn(r);return t==="long"?e*(1-n):e*(1+n)}function Fc(e,t,r){let n=Math.abs(e)*yn(t),o=Math.abs(e)*yn(r);return{taker:n,builder:o,total:n+o}}function J0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function Q0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function Z0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function ey(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 ty(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ry(e,t,r){return t==="long"?e.h>=r:e.l<=r}function ny(e,t,r){return t==="long"?e.l<=r:e.h>=r}function kr(e,t){for(let r of e.requiredSeries)if(oy.includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function iy(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 sy(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=K0(r);Dc(t);let o=gr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(kr(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,y=0,h=0,x=0,k=[],_=[],w=[],O=[],A=[],b=null,g=0,S=null,E=p,R=!1,v=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=J0(p,s);if(!(z>0)||!(ee>0))return;let te=X0(ee,D,u),J=z/te,se=B(T),lr=te*se;if(J>se){w.push({kind:"entry",barIndex:T,time:$.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:lr,reason:"volume_participation"});return}j[T]+=J;let He=Math.abs(te-ee)*J,Ze=Fc(z,l,d);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,x+=z,b={lifecycleEpoch:++P,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:J,notionalUsd:z,stop:Q0(te,D,s.stopLossPct),take:Z0(te,D,s.takeProfitPct),liq:ey(te,D,s.maxLeverage,l+d),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,J=te;$!=="liquidation"&&ee&&(J=Y0(te,z,u));let se=b.qty,lr=se*J;if($!=="liquidation"){let Ua=B(T),Xm=J*Ua;if(se>Ua)return w.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:lr,maxFillNotionalUsd:Xm,reason:"volume_participation",triggerReason:$}),!1;j[T]+=se}let He=Fc(lr,l,d),Ze=$==="liquidation"?0:Math.abs(J-te)*se,dr,Go;z==="long"?(dr=(te-b.entryReferencePrice)*se,Go=(J-b.entryPrice)*se):(dr=(b.entryReferencePrice-te)*se,Go=(b.entryPrice-J)*se),p+=Go,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,x+=lr;let Km={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:J,exitReason:$,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:dr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:dr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return k.push(Km),$==="liquidation"&&_.push({barIndex:T,time:t[T].t,side:z,price:J,tradeIndex:k.length-1}),b=null,P+=1,v=T+1+(s.cooldownBars||0),!0}function je(T,D,$,ee){let z=T+1;if(z>=t.length)return;q.some(J=>J.kind==="exit"&&J.side===D&&J.fillBar===z&&J.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:$,epoch:ee})}function nn(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<v)continue;ie(T,$.side,t[T])}}function on(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,y+=z):(p+=z,b.fundingAccrued-=z,y-=z)}function sn(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Ra(T){if(!b)return;let D=t[T],$=b.side,ee=ny(D,$,b.liq),z=ty(D,$,b.stop),te=ry(D,$,b.take),J=se=>$==="long"?Math.min(se,D.o):Math.max(se,D.o);if(ee){K(T,J(b.liq),"liquidation",!1);return}if(z&&te){K(T,J(b.stop),"stop_loss",!0)||je(T,$,"stop_loss",b.lifecycleEpoch);return}if(z){K(T,J(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!==S&&(S=D,E=H(t[T].o),R=!1),sn(T),nn(T),Ra(T),on(T),!R&&H(t[T].c)<=E*(1-s.maxDailyLossPct/100)&&(R=!0,O.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=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,J=$.entryShort===!0;te&&J?O.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!R&&(te||J)&&ee<t.length&&T>=v&&X({kind:"entry",side:te?"long":"short",signalBar:T,fillBar:ee,epoch:P})}let z=p;b&&(g+=1,z=H(t[T].c)),A.push({barIndex:T,time:t[T].t,equity:z,positionSide:b?b.side:null})}let Pa=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);Pa={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 $a=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,zm=$a/n.initialEquityUsd*100,La=0,Ho=0,zo=0;for(let T of k)T.netPnlUsd>0?(La+=1,Ho+=T.netPnlUsd):T.netPnlUsd<0&&(zo+=-T.netPnlUsd);let Vo=k.length,Vm=Vo===0?0:La/Vo,Wo=0;zo>0?Wo=Ho/zo:Ho>0&&(Wo=1e12);let Wm={netPnlUsd:$a,netPnlPct:zm,maxDrawdownPct:sy(A),winRate:Vm,profitFactor:Wo,tradeCount:Vo,sharpe:iy(A),turnoverUsd:x,exposurePct:g/t.length*100},Gm={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},qa={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:wr,config:Gm,trades:k,equityCurve:A,metrics:Wm,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:y,slippageUsd:h},liquidations:_,missedFills:w,openPositionAtEnd:Pa,flags:O};return Ci(qa),Oi(hn(qa))}var W0,oy,pn=I(()=>{At();St();W0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});oy=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as ay}from"node:crypto";function hy(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ti(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ti(t);return Object.freeze(e)}for(let t of Object.keys(e))Ti(e[t]);return Object.freeze(e)}function yy(e){return String(e).trim().replace(/\s+/g," ")}function gy(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function by(e){for(let r of uy)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 wy(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 cy.has(r)?r:null}function xy(e){let t={...dy},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 Ey(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 Sy(e){let t=ay("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 ky(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 Ay(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 vy(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 Iy(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 _y(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 Oy(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 Cy(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 Ty(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 Mc(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 Ny({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:Mc(a.fast),ema_right_period:Mc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Ry({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 Py({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 $y({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 qy({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Ly[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 jc(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(!hy(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=my;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<py||n>fy)throw new ue("expiresInMs must be between 1h and 30d")}if(ly.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${Ht}`);let o=yy(e);if(!o)throw new ue(`empty prompt. ${Ht}`);if(Ey(o))throw new ue(`duplicate interval or risk clause. ${Ht}`);let i=gy(o),s=by(o),a=wy(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${Ht}`);let c=xy(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=Sy(o),d=`Draft ${s} ${i}`.slice(0,100),p=ky(o),f=Ay(o),m=vy(o),y=Iy(o),h=_y(o),x=Oy(o),k=Cy(o),_=[p,f,m,y,h,x,k].filter(Boolean);if(_.length!==1)throw new ue(`unsupported or ambiguous prompt. ${Ht}`);if(!Ty(o,_[0]))throw new ue(`unsupported or ambiguous prompt. ${Ht}`);let w,O=_[0],A={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:O};O.kind==="ema_cross"?w=Ny(A):O.kind==="rsi"?w=Ry(A):O.kind==="open_interest"?w=$y(A):O.kind==="funding"?w=Py(A):w=qy(A);let b=Ii(w,{nowMs:r});if(!b.ok)throw new ue(`draft failed validation: ${b.errors.map(g=>g.message).join("; ")}`);return Ti(me(w,{nowMs:r}))}var ue,cy,uy,ly,Ht,dy,py,fy,my,Ly,Hc=I(()=>{St();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},cy=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),uy=new Set(["BTC","ETH","SOL","HYPE"]),ly=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Ht="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.",dy=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),py=36e5,fy=30*864e5,my=864e5;Ly=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Uy}from"node:crypto";function Wc(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 Gc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ri(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ri(t);return Object.freeze(e)}for(let t of Object.keys(e))Ri(e[t]);return Object.freeze(e)}function Ar(e){if(Array.isArray(e))return e.map(Ar);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ar(e[r]);return t}return e}function gn(e){return JSON.stringify(Ar(e))}function By(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 Fy(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=gn(n),s=gn(o);return i<s?-1:i>s?1:0}),r}function Ni(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=gn(r),a=gn(o);return s<a}function Kc(e,t,r={}){if(!Gc(r))throw new TypeError("options must be a plain object");for(let w of Object.keys(r))if(Wc(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>zc)throw new TypeError(`maxTrials must be an integer 1..${zc}`);o=w}let i=r.objective??"netPnlUsd";if(!Vc.has(i))throw new TypeError(`objective must be one of ${[...Vc].join("|")}`);let s=r.backtestOptions??{};if(!Gc(s))throw new TypeError("backtestOptions must be a plain object");for(let w of Object.keys(s))if(Wc(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 O=By(a.parameters[w]);if(O.length===0)throw new Error(`parameter "${w}" produces an empty grid`);u[w]=O,l*=O.length}let d=Fy(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,y=null;for(let w of p){let O=Er(a,w),A=ut(O,t,s);y==null&&(y=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},g={parameters:{...w},metrics:b};f.push(g),(!m||Ni(i,b,w,m.metrics,m.parameters))&&(m=g)}f.sort((w,O)=>Ni(i,w.metrics,w.parameters,O.metrics,O.parameters)?-1:Ni(i,O.metrics,O.parameters,w.metrics,w.parameters)?1:0);let h={...m.parameters},x=Er(a,h),k={strategyHash:Bt(a),compilerHash:kt,trainBarsHash:gr(t),backtestConfig:y,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:x},_={id:Uy("sha256").update(JSON.stringify(Ar(k)),"utf8").digest("hex"),...k};return Ri(Ar(JSON.parse(JSON.stringify(_))))}var zc,Vc,Xc=I(()=>{At();St();pn();zc=256,Vc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import bn from"node:path";function wn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function My(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function zt(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>zt(r,`${t}[${n}]`));return}if(wn(e))for(let[r,n]of Object.entries(e)){let o=My(r);if(Dy.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);zt(n,`${t}.${r}`)}}function jy(e){if(typeof e!="string"||!e||!bn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Yc(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 Hy(){return{version:$i,runners:[]}}function Jc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!wn(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 zt(r,bn.basename(t)),{version:$i,runners:r.runners.map(n=>Ge(n))}}function Qc(e,t){zt(t,"store");let r=bn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=bn.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 Zc(e={}){let t=e.path;if(jy(t),Yc(t),et.existsSync(t)?Jc(et.readFileSync(t,"utf8"),t):Qc(t,Hy()),Pi.has(t))return Pi.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let y=m.fn();r=!1,m.resolve(y),o()}catch(y){r=!1,m.reject(y),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((y,h)=>{n.push({fn:m,resolve:y,reject:h}),queueMicrotask(o)})}function s(){return Yc(t),Jc(et.readFileSync(t,"utf8"),t)}function a(m){Qc(t,m)}function c(m){if(!wn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");zt(m,"record");let y=s();if(y.runners.some(x=>x.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=Ge(m);return y.runners.push(h),a(y),Ge(h)}function u(m){let y=s().runners.find(h=>h.id===m);return y?Ge(y):null}function l(){return s().runners.map(m=>Ge(m))}function d(m,y){if(typeof y!="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 k=Ge(h.runners[x]),_=y(k);if(!wn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return zt(_,"record"),h.runners[x]=Ge(_),a(h),Ge(h.runners[x])}function p(m){let y=s(),h=y.runners.findIndex(k=>k.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let x=Ge(y.runners[h]);return x.status!=="stopped"&&(x.status="stopped",y.runners[h]=x,a(y)),Ge(y.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,y){return i(()=>d(m,y))},stop(m){return i(()=>p(m))}};return Pi.set(t,f),f}var $i,Dy,Pi,eu=I(()=>{$i=1,Dy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Pi=new Map});import{createHash as Ui}from"node:crypto";function Li(e){return e==null?e:JSON.parse(JSON.stringify(e))}function qi(e){return Array.isArray(e)?e.map(qi):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,qi(e[t])])):e}function ru(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Ui("sha256").update(JSON.stringify(qi(e))).digest("hex")}function zy(e,t,r,n,o){return Ui("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Vy(e,t,r,n){return Ui("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Wy(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function tu(e){return e==="entryLong"||e==="entryShort"}function Bi({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Zc({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,k)=>x.createdAt-k.createdAt||x.id.localeCompare(k.id))[0];if(p)return Li(p);let f=t(),m=Vy(f,l.strategyHash,l.compilerHash,d),y=r.get(m);if(y)return Li(y);let h={id:m,strategy:Li(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 v=0;v<u.length;v++)m.set(u[v].t,v);let y=d.cursor,h=[];for(let v=0;v<u.length;v++){let P=u[v].t;(y==null||P>y)&&h.push(v)}if(h.length===0)return d;let x=new Map(d.intendedOrders.map(v=>[v.id,v])),k=new Set(d.fills.map(v=>v.orderId)),_=new Map(d.missedFills.map(v=>[v.orderId,v])),w=(v,P)=>`${v}|${P}`,O=new Map(d.markouts.map(v=>[w(v.orderId,v.horizon),v])),A=d.position?{...d.position}:null,b=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,g=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function S({action:v,signalBarT:P,signalIndex:q}){let j=Wy(v),X=zy(d.id,d.strategyHash,P,j,v);if(x.has(X))return x.get(X);let B=q+1,H=B<u.length,ie={id:X,action:v,type:v,side:j,signalBarT:P,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return x.set(X,ie),d.intendedOrders.push(ie),ie}function E(v,P,q){if(k.has(v.id))return;let j={orderId:v.id,action:tu(v.action)?"entry":"exit",side:v.side,price:P.o,barT:P.t,signalBarT:v.signalBarT,barIndex:q};if(d.fills.push(j),k.add(v.id),v.status="filled",v.fillBarT=P.t,_.has(v.id)&&(_.delete(v.id),d.missedFills=d.missedFills.filter(X=>X.orderId!==v.id)),tu(v.action)){A={side:v.action==="entryLong"?"long":"short",entryOrderId:v.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:q};for(let X of l){let B=w(v.id,X);if(O.has(B))continue;let H={orderId:v.id,horizon:X,entryBarT:P.t,entryPrice:P.o,side:A.side,status:"pending",close:null,barT:null};O.set(B,H),d.markouts.push(H)}}else A=null,b=Number(d.strategy?.risk?.cooldownBars)||0,g=P.t}function R(v){if(k.has(v.id)||_.has(v.id))return;let P={orderId:v.id,action:v.action,side:v.side,signalBarT:v.signalBarT,status:"missed"};_.set(v.id,P),d.missedFills.push(P),v.status="missed"}for(let v of d.intendedOrders){if(v.status==="filled"||k.has(v.id))continue;let P=m.get(v.signalBarT);if(P==null)continue;let q=P+1;q<u.length&&(y==null||u[q].t>y)&&E(v,u[q],q)}for(let v of h){let P=u[v],q=f[v].signals,j=A,X=H=>{if(A||b>0&&(g==null||P.t>=g))return;let K=S({action:H,signalBarT:P.t,signalIndex:v}),je=v+1;je<u.length?E(K,u[je],je):R(K)},B=H=>{if(!A||A.side==="long"&&H!=="exitLong"||A.side==="short"&&H!=="exitShort")return;let ie=S({action:H,signalBarT:P.t,signalIndex:v}),K=v+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&&g!=null&&P.t>=g&&(b-=1,b===0&&(g=null)),d.cursor=P.t,d.lastProcessedBarIndex=v}for(let v of d.markouts){if(v.status!=="pending")continue;let P=d.fills.find(X=>X.orderId===v.orderId&&X.action==="entry");if(!P)continue;let q=m.get(P.barT);if(q==null)continue;let j=q+v.horizon;if(j<u.length){v.close=u[j].c,v.barT=u[j].t,v.status="filled";let X=v.entryPrice;v.markout=v.side==="long"?(v.close-X)/X:(X-v.close)/X}}return d.position=A,d.cooldownBarsRemaining=b,d.cooldownStartT=g,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var nu=I(()=>{At();eu()});var su={};M(su,{runStrategyOperation:()=>eg});import Gy from"node:os";import Ky from"node:path";function vr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Di(e){if(Array.isArray(e)){for(let t of e)Di(t);return}if(vr(e))for(let[t,r]of Object.entries(e)){if(Xy.some(n=>Yy(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Di(r)}}function Jy(e){if(!vr(e))throw new TypeError("strategy input must be a plain object");return Di(e),e}function Qy(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 Fi(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=bi(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 Mi(e,t){let r=e.backtestOptions??{};if(!vr(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function ou(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!vr(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:Mi(e,n)}}function iu(){return Ky.join(Gy.homedir(),".oracle","strategy-shadow.json")}function Zy(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 eg(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Jy(t),o=Qy(n,r);if(e==="draft")return{strategy:jc(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 Fi(i.strategy,n,r,o);kr(i,s);let a=pi(ou(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ut(i.strategy,s,Mi(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await Fi(i.strategy,n,r,o);kr(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(!vr(d))throw new TypeError("options must be a plain object");let p=Kc(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Mi(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:pi(ou(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Bi({storePath:r.storePath??iu(),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 Fi(a.strategy,n,r,o);return kr(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=bi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Bi({storePath:r.storePath??iu(),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??Zy(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:ru(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 Xy,au=I(()=>{pn();At();fi();Hc();Xc();nu();wi();Xy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var xu={};M(xu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>mu,DEFAULT_SAME_CHAIN_SOURCES:()=>fu,NATIVE_TOKEN:()=>ji,canonicalJson:()=>yu,hashFirmQuote:()=>wu,hashRfqIntent:()=>bu,normalizeFirmQuote:()=>zi,normalizeRfqIntent:()=>sg,sha256Hex:()=>Ir});import{createHash as tg}from"node:crypto";import{getAddress as pu,isAddress as Hi}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function uu(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function xn(e,t){let r=String(e??"").trim();return(!rg.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function ng(e,t){return e==null||e===""?null:xn(e,t)}function lu(e,t){let r=String(e??"").trim();return r.toLowerCase()===ji.toLowerCase()?ji:(Hi(r)||re(t,"must be an EVM address or native token sentinel"),pu(r))}function hu(e,t){let r=String(e??"").trim();return Hi(r)||re(t,"must be an EVM address"),pu(r)}function og(e,t){return e==null||e===""?null:hu(e,t)}function du(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 ig(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 Vt(e){if(Array.isArray(e))return e.map(Vt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=Vt(e[r]));return t}return e}function yu(e){return JSON.stringify(Vt(e))}function Ir(e){return`0x${tg("sha256").update(yu(e)).digest("hex")}`}function gu(e,t){let r={...e};for(let n of t)delete r[n];return r}function bu(e){return Ir(gu(e,["intentHash"]))}function wu(e){return Ir(gu(e,["firmQuoteHash"]))}function sg(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=uu(e.fromChainId??e.fromChain,"fromChainId"),i=uu(e.toChainId??e.toChain,"toChainId"),a=o===i?fu:mu,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:lu(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:lu(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:xn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:hu(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:ig(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:ng(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:du(e.allowedSources,"allowedSources",a),allowedRouters:du(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)?Vt(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):Ir({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=bu(c),Object.freeze(c)}function ag(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!cu.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!cu.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!Hi(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"),Vt(e)}function zi(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=xn(t.amountOut??t.buyAmount,"amountOut"),a=xn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=ag(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=og(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)?Vt(t.metadata):{}};return d.quoteId||(d.quoteId=Ir({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=wu(d),Object.freeze(d)}var ji,fu,mu,cu,rg,Vi=I(()=>{ji="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",fu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),mu=Object.freeze(["lifi"]),cu=/^0x[0-9a-fA-F]{64}$/,rg=/^\d+$/});import{readFileSync as cg}from"node:fs";import{homedir as ug}from"node:os";import{join as En}from"node:path";function lg(){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=ug();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||En(t,".config","oracle")).trim();return[e,En(r,"exec.env")].filter(Boolean)}return[e,En(t,".config","oracle","exec.env"),En(t,".config","mad-desk","exec.env")].filter(Boolean)}function Eu(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of lg())try{let i=cg(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 Su=I(()=>{});var ku=I(()=>{});import{createHash as dg,createHmac as vu,timingSafeEqual as pg}from"node:crypto";function Sn(e){return Array.isArray(e)?`[${e.map(Sn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Sn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Iu(e,{required:t=!1}={}){try{return Eu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Gi(e){let{signature:t,...r}=e;return r}function _u(e,{secret:t}={}){let r=Iu(t);return r?{...e,signature:vu("sha256",r).update(Sn(Gi(e))).digest("hex")}:e}function fg(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 dg("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=Iu(o);if(i){let f=vu("sha256",i).update(Sn(Gi(e))).digest("hex");if(!mg(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=yg(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 _u({...Gi(e),calldataHash:fg(n)},{secret:o})}function mg(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:pg(r,n)}function Wi(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function hg(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=Wi(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(Wi(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Wi(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=hg(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function Ki({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=Au,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)||Au)),y=d*BigInt(1e4-p.selectedBps),h=y/10000n;if(y%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 _u({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 yg(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=Ki({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,Au,Re=I(()=>{Su();ku();tt=100,Au=2e4});function Xi(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:pt}var pt,kn=I(()=>{pt="0x000000000000000000000000000000000000dEaD"});import{Contract as gg,JsonRpcProvider as bg}from"ethers";function Ag(e){return kg.test(String(e||""))}async function Ou(e,{contract:t=wg,rpc:r=Eg,chainId:n=xg,balanceOf:o}={}){if(!Ag(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new bg(r,n,{staticNetwork:!0}),s=new gg(t,Sg,i);return BigInt(await s.balanceOf(e))}var wg,xg,Eg,Sg,kg,Cu=I(()=>{wg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",xg=999,Eg="https://rpc.hyperliquid.xyz/evm",Sg=["function balanceOf(address owner) view returns (uint256)"],kg=/^0x[a-fA-F0-9]{40}$/});import{existsSync as vg,readFileSync as Ig,lstatSync as _g}from"node:fs";import{homedir as Tu}from"node:os";import{join as Yi}from"node:path";function Tg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Nu,t)?Nu[t]:Cg}function Lg(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Ru])return String(e[Ru]);let t=e.ORACLE_CONFIG_DIR||Yi(Tu(),".config","oracle");return Yi(t,"fee-recipient")}return Yi(Tu(),".config","oracle","fee-recipient")}function qg(e=process.env){try{let t=Lg(e);if(!vg(t)||_g(t).isSymbolicLink())return"";let r=Ig(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Ug(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),Og)}function Bg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Rg]||"").trim(),o=String(e[Pg]||$g).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Tg(t),s=Ug(e[Ng],{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=qg(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 An({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Bg({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 Ou(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Pu(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 $u(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Lu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Og,Cg,Nu,Ng,Rg,Pg,Ru,$g,vn=I(()=>{Cu();Og=100,Cg=5,Nu=Object.freeze({swap:5,bridge:5,perps:0,nft:0});Ng="ORACLE_INTEGRATOR_FEE_BPS",Rg="ORACLE_INTEGRATOR_FEE_RECIPIENT",Pg="ORACLE_INTEGRATOR_ID",Ru="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",$g="oracle"});var Zi={};M(Zi,{LIFI_API:()=>Uu,lifiChains:()=>Hg,lifiHealth:()=>Mg,lifiPrepare:()=>jg,lifiQuote:()=>It});function Qi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Uu).replace(/\/$/,"")}function Dg(e){let t=String(e||Ji).toLowerCase();return t===Ji.toLowerCase()||t===Fg}function qu(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 Mg(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=Ji,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 An({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,x]of Object.entries($u(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}),y=d?.estimate?.toAmountMin||d?.toAmountMin;if(y!=null&&BigInt(y)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function jg(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(!Dg(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:qu(a,"approval token"),spender:qu(s,"approval spender"),amount:String(e.fromAmount)}}return Q({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 Hg(e={}){return N(`${Qi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Uu,Ji,Fg,_r=I(()=>{W();Re();kn();ge();vn();Uu="https://li.quest/v1";Ji="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Fg="0x0000000000000000000000000000000000000000"});var Du={};M(Du,{PARASWAP_API:()=>Bu,paraswapHealth:()=>Vg,paraswapPrepare:()=>zg,paraswapPrice:()=>Gt,paraswapTokens:()=>Fu});function Wt(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 Fu(e={},t={}){let r=Number(e.chainId||1);return N(`${es(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Gt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Wt(e.srcToken,"srcToken"),destToken:Wt(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 An({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Lu(o)))n.set(a,c);let i=await N(`${es(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 zg(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=Wt(e.userAddress,"userAddress"),o=await Gt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Wt(e.srcToken,"srcToken"),destToken:Wt(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=Wt(e.receiver,"receiver"));let c=await N(`${es(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 Q({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 Vg(e={}){let t=await Fu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Bu,es,In=I(()=>{W();Re();ge();vn();Bu="https://api.paraswap.io",es=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Bu).replace(/\/$/,"")});function _n({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:ju(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([ju(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[Mu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Mu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function ju(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function On(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 Mu,ts=I(()=>{Mu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Ku={};M(Ku,{ZEROX_API:()=>Hu,zeroxHealth:()=>Wg,zeroxPrepare:()=>Gg,zeroxPrice:()=>Gu,zeroxQuote:()=>Kt});function zu(e={}){return _n({provider:"zerox",defaultUrl:Hu,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Vu(e={}){return zu(e).baseUrl}function Cn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Wu(e={}){return On({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Cn(e)},zu(e).trusted)}async function Wg(e={}){if(!Cn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Gu({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 Gu(e={},t={}){if(!Cn(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(`${Vu(t)}/swap/allowance-holder/price?${a}`,{headers:Wu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Kt(e={},t={}){if(!Cn(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(`${Vu(t)}/swap/allowance-holder/quote?${c}`,{headers:Wu(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 Gg(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await Kt(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 Q({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 Hu,Tn=I(()=>{W();Re();ts();ge();Hu="https://api.0x.org"});var EI,Xu=I(()=>{EI=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Nn from"node:fs";import Kg from"node:os";import Yt from"node:path";import{fileURLToPath as Xg}from"node:url";function Yu(){return process.env.ORACLE_FAKE_HOME||Kg.homedir()}function Jg(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Rn(){return Jg()?process.env.ORACLE_CONFIG_DIR||Yt.join(Yu(),".config","oracle"):Yt.join(Yu(),".config","oracle")}function Qg(){return Yt.join(Rn(),"desk.json")}function Zg(){return Yt.join(Rn(),"env")}function Xt({force:e=!1}={}){if(Xt._done&&!e)return Xt._result||null;Xt._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=Zg();if(Nn.existsSync(o))for(let i of Nn.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=Qg();if(Nn.existsSync(o)){let i=JSON.parse(Nn.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)),Xt._result=Object.keys(t).length?t:null,Xt._result}var Yg,_I,Ju=I(()=>{Yg=Yt.dirname(Xg(import.meta.url)),_I=Yt.resolve(Yg,"../..");try{Xt()}catch{}});var el={};M(el,{armPreparedAction:()=>ab,callSigner:()=>Qu,queueOwnerAction:()=>Zu});import{existsSync as eb,readFileSync as tb}from"node:fs";import{request as rb}from"node:http";import nb from"node:path";function ib(e=process.env){let t=String(e.ORACLE_SIGNER_URL||ob).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 sb(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=nb.join(Rn(),"signer","signer-token");return eb(t)?tb(t,"utf8").trim():null}function Qu(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=ib(n),s=sb(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=rb({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 Zu(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Qu("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function ab(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 Zu(r,t)}var ob,tl=I(()=>{Ju();ob="http://127.0.0.1:9462"});var ll={};M(ll,{COW_CANCEL_TYPES:()=>il,COW_HOSTS:()=>$n,COW_ORDER_TYPES:()=>Pn,COW_SETTLEMENT:()=>rl,COW_VAULT_RELAYER:()=>nl,armCowOrder:()=>mb,buildArmedCowOrder:()=>is,cowCancelOrders:()=>xb,cowChains:()=>kb,cowHealth:()=>pb,cowOrder:()=>ul,cowOrderStatus:()=>cl,cowOrderUid:()=>hb,cowPrepareCancel:()=>bb,cowPrepareOrder:()=>fb,cowQuote:()=>_t,cowSignCancel:()=>wb,cowSignOrder:()=>yb,cowSubmitSignedOrder:()=>gb,cowVerifyOrderFill:()=>Sb});import{TypedDataEncoder as ns,getAddress as Or,isAddress as cb}from"ethers";function Ln(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=$n[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function ub(e,t="v1",r={}){let n=Ln(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function nt(e,t){let r=String(e||"").trim();if(!cb(r))throw new Error(`cowswap: ${t} must be an address`);return Or(r).toLowerCase()}function Jt(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 sl(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 al(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 lb({digest:e,owner:t,validTo:r}={}){let n=sl(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 os(e){let t=rl[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:Or(t)}}function db(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=sl(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Jt(e.sellAmount,"sellAmount"),buyAmount:Jt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Jt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function pb(e={}){try{let t=await _t({chainId:1,sellToken:rs[1],buyToken:ol[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=Xi(e.from||e.owner),o=e.sellToken||rs[r],i=e.buyToken||ol[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=rs[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(`${Ln(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 fb(e={},t={}){let r=Number(e.chainId??1),n=nt(Xi(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=db(o?.quote||o,r,n),s=os(r),a={domain:s,types:Pn,primaryType:"Order",message:i},c=ns.hash(s,Pn,i),u=nl[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return Q({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Or(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:Or(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:Or(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:is({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 is(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=$n[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=nt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=ns.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 mb(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(tl(),el)),n=e.localSignerEnvelope||is(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function cl(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(`${Ln(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ul(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(`${Ln(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function hb(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||ns.hash(os(r),Pn,n),i=e.owner||e.from||e.signer||n.receiver;return lb({digest:o,owner:i,validTo:n.validTo})}async function yb(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 gb(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 bb(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)=>al(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=os(t);return Q({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:il,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function wb(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function xb(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function Eb(e={}){return Jt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function Sb(e={},t={}){let r=Number(e.chainId??1),n=al(e.uid||e.orderUid),o=t.order||await ul({chainId:r,uid:n},t),i=t.status||o.status||await cl({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${ub(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(Eb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Jt(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(Jt(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 kb(){return Object.keys($n).map(Number)}var $n,rl,nl,rs,ol,Pn,il,qn=I(()=>{W();Re();Xu();kn();ge();$n={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"},rl=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),nl=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),rs={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ol={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Pn=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"}]}),il=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var pl={};M(pl,{CHAINS:()=>Un,chainById:()=>as,isSupportedChain:()=>dl,registerChain:()=>Ab,rpcUrlFor:()=>cs});function as(e){return ss.get(Number(e))||null}function Ab({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 Un[e]=o,ss.set(o.chainId,o),o}function cs(e,t=process.env){let r=as(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function dl(e){return ss.has(Number(e))}var Un,ss,us=I(()=>{Un={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}},ss=new Map(Object.values(Un).map(e=>[e.chainId,e]))});import{Interface as vb,getAddress as Ib}from"ethers";function Tr(e,t){try{return Ib(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Ob(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=cs(e,r);return n||_b[Number(e)]||null}function Tb(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Cb.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function Nb(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Rb(e){if(e?.error)throw Nb(e.error);return e?.result}function Pb(e,t,r){return`${e}
|
|
5
|
+
${t}
|
|
6
|
+
${JSON.stringify(r??[])}`}async function $b(e,t,r){return N(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Y(e,t,r=[],n={}){let o=String(t||""),i=Tb(o),s=Ob(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let l=fl.get(s);if(l!=null)return l}let c=n.dedupe!==!1&&!n.signal?Pb(s,o,r):null;if(c&&Cr.has(c))return Cr.get(c);let u=(async()=>{let l=await $b(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=Rb(l);return i==="eth_chainid"&&typeof d=="string"&&fl.set(s,d),d})();return c&&(Cr.set(c,u),u.finally(()=>{Cr.get(c)===u&&Cr.delete(c)}).catch(()=>{})),u}async function Fn(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ml(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function hl(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 yl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Tr(e.token||e.tokenAddress,"token"),o=Tr(e.owner,"owner"),i=Tr(e.spender,"spender"),s=Bn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=Bn.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 gl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Tr(e.token||e.tokenAddress,"token"),o=Tr(e.account||e.owner||e.address,"account"),i=Bn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=Bn.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 Bn,_b,Cb,Cr,fl,ot=I(()=>{W();us();Bn=new vb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);_b={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"};Cb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Cr=new Map,fl=new Map});function bl(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 Dn(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=bl(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,y=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(d)||Lb.has(p)?h=300:s&&d===s&&(h=100),y.includes("v4")?h+=20:y.includes("v3")?h+=10:(y.includes("v2")||y.includes("raydium")||y.includes("orca")||y.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 wl(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&bl(e,r[0]).address||null}var Lb,ls=I(()=>{Lb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function Fb(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 Db(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Mb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||qb).replace(/\/$/,"")}async function Mn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Mb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function xl({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Nr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Nr({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(Ub[Number(e)]||e),s=new Set(Bb(n).filter(Boolean).map(Pe)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Mn(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=`${Pe(f?.chainId)}:${Pe(f?.dexId)}:${Pe(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>Pe(p?.chainId)===i).filter(p=>Fb(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:Db(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function El(e,{chainSlug:t="solana",stables:r=jb}={},n={}){let o=await Mn(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=Dn(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var qb,Ub,Pe,Bb,jb,Rr=I(()=>{W();ls();qb="https://api.dexscreener.com",Ub=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(),Bb=e=>Array.isArray(e)?e:e==null?[]:[e];jb=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var Tl={};M(Tl,{PANCAKE_FEE_TIERS:()=>jn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>vl,UNI_V3_VENUES:()=>Ol,uniV3Chains:()=>Xb,uniV3EthUsdc:()=>Cl,uniV3Health:()=>Kb,uniV3PrepareExactIn:()=>Gb,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>Wb});import{Interface as kl,getAddress as Pr,isAddress as Al}from"ethers";function ps(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=Ol[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 ds(e,t){let r=be[Number(t)];if(!e||e===Il||e===_l||/^eth$/i.test(String(e)))return Pr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Pr(r.weth);if(/^usdc$/i.test(n))return Pr(r.usdc);if(!Al(n))throw new Error(`invalid token address: ${e}`);return Pr(n)}function zb(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 Vb(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}=ps(e.chainId??8453,e.venue),s=ds(e.tokenIn||"WETH",r),a=ds(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:vl,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],p=await Promise.all(l.map(async b=>{let g=Hn.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:b,sqrtPriceLimitX96:0n}]);try{let S=await Y(r,"eth_call",[{to:n,data:g},"latest"],t);if(!S||S==="0x")return{fee:b,ok:!1,error:"empty result"};let E=Hn.decodeFunctionResult("quoteExactInputSingle",S);return{fee:b,ok:!0,amountOut:E[0].toString(),sqrtPriceX96After:E[1].toString(),initializedTicksCrossed:Number(E[2]),gasEstimate:E[3].toString()}}catch(S){return{fee:b,ok:!1,error:String(S.message||S).slice(0,160)}}})),f=null;for(let b of p)b.ok&&(!f||BigInt(b.amountOut)>BigInt(f.amountOut))&&(f=b);if(!f){let b=p.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${b}`)}let m=e.liquidityUsd==null?await Nr({chainId:r,tokenA:s,tokenB:a,dexIds:zb(e.venue)},t).catch(()=>[]):[],y={};await Promise.all(m.slice(0,8).map(async b=>{if(!(!b.pairAddress||!Al(b.pairAddress)))try{let g=await Y(r,"eth_call",[{to:b.pairAddress,data:Hb},"latest"],t),S=g&&g!=="0x"&&g.length<=66?Number.parseInt(g,16):NaN;if(!Number.isFinite(S)||S<=0||S>1e6)return;let E=y[S];(E==null||b.liquidityUsd>E.liquidityUsd)&&(y[S]=b)}catch{}}));let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(e.fee==null&&h>0&&BigInt(f.amountOut)>0n){let b=BigInt(f.amountOut),S=p.filter(E=>E.ok&&Number((b-BigInt(E.amountOut))*10000n/b)<=h).filter(E=>y[E.fee]?.liquidityUsd!=null).sort((E,R)=>y[R.fee].liquidityUsd-y[E.fee].liquidityUsd)[0];S&&S.fee!==f.fee&&(x={priceBestFee:f.fee,chosenFee:S.fee,chosenPoolUsd:y[S.fee].liquidityUsd,bandBps:h},f=S)}let k=y[f.fee]??null,_=m[0]??null,w=k??_,O=e.liquidityUsd??k?.liquidityUsd??_?.liquidityUsd??null,A=e.liquidityUsd!=null?"caller":k?"pool":_?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:O,liquiditySource:w,liquidityAttribution:A,liquidityPick:x,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:p,best:!0},{chainId:r,venue:o,amountOut:f.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Wb(e={},t={}){let{chainId:r,quoter:n,router:o}=ps(e.chainId??8453),i=(e.tokens||[]).map(p=>ds(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=Vb(i,s),u=Hn.encodeFunctionData("quoteExactInput",[c,a]),l=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),d=Hn.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 Cl(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 Gb(e={},t={}){let r=Number(e.chainId??8453),n=ps(r,e.venue),o=Pr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Il||i===_l||/^eth$/i.test(i),a=await Ot(e,t),c=Sl.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=Sl.encodeFunctionData("multicall",[d,[c]]);return Q({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 Kb(e={}){let t=Number(e.chainId??8453);try{let r=await Cl({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 Xb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,vl,Hb,Hn,Sl,Il,_l,jn,Ol,zn=I(()=>{ot();Rr();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"}},vl=[100,500,3e3,1e4],Hb="0xddca3f43",Hn=new kl(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),Sl=new kl(["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)"]),Il="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",_l="0x0000000000000000000000000000000000000000",jn=[100,500,2500,1e4],Ol={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:jn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:jn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:jn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Ll={};M(Ll,{executeRfqCandidates:()=>Pl,rankRfqQuotes:()=>$l,requestRfqQuotes:()=>Qb,sourceCandidates:()=>Rl});function $r(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Nl(e,t){return String(e?.[t]??"").trim()}function Lr(e,t){return Object.freeze({source:e,run:t})}function Rl(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 $r(e,"lifi")&&s.push(Lr("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 Yb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&($r(e,"paraswap")&&s.push(Lr("paraswap",async()=>{let c=await(n.paraswapPrice??Gt)({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}}})),$r(e,"0x")&&(Nl(r,"ZEROX_API_KEY")||Nl(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Lr("0x",async()=>{let c=await(n.zeroxQuote??Kt)({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}}})),$r(e,"cow")&&s.push(Lr("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}}})),$r(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Lr("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 Yb(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Jb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Pl(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Jb(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(zi(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 $l(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 Qb(e,t={}){let r=Rl(e,t),{quotes:n,failed:o}=await Pl(e,r,t),i=$l(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 ql=I(()=>{_r();In();Tn();qn();zn();Vi()});function Ul(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}Zb.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 Bl(e){let{ok:t,errors:r,warnings:n}=Ul(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
7
|
- ${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 zn(e){let t=Pl(e);return Jt.set(t.chainId,t),t}function ps(e){return Jt.get(Number(e))||null}function Ll(){return[...Jt.values()]}function zb(){Jt.clear()}function Vb(){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,Hb,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"}),Hb=/^0x[0-9a-fA-F]{40}$/;Jt=new Map});function ql(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 Bl(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 Fl(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),S=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&&(S=BigInt(Math.floor(K)),R=!0)}else B===0&&(R=!0)}let j=S+q,X=A>j?A-j:0n;return{...y,grossOut:A.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,A)=>BigInt(A.netOut)>y?BigInt(A.netOut):y,0n),h=y=>g>0n?Number((g-BigInt(y))*10000n/g):0,x=[],E=f.slice().sort((y,A)=>BigInt(A.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,A)=>{let S=h(y.netOut)<=m?0:1,R=h(A.netOut)<=m?0:1;if(n&&m>0&&S!==R)return S-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&&E&&f[0]&&f[0].source!==E.source&&x.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.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 Vn(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"?ql({source:s,error:String(o.reason?.message||o.reason)}):ql({source:s,...o.value})})}var Pe,Ul,Pr,ms=v(()=>{ft();Pe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Ul={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 Dl(e={}){return In({provider:"oneinch",defaultUrl:Wb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Gb(e={}){return Dl(e).baseUrl}function Ml(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Kb(e={}){let t=Ml(e);return _n({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Dl(e).trusted)}async function jl(e={},t={}){if(!Ml(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(`${Gb(t)}/${r}/quote?${s}`,{headers:Kb(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 Wb,Hl=v(()=>{W();Re();es();ge();Wb="https://api.1inch.dev/swap/v6.0"});var Wl={};M(Wl,{UNI_V4_CHAINS:()=>Le,UNI_V4_FEE_TIERS:()=>gs,computeV4PoolId:()=>Kn,decodeV4HookPermissions:()=>ws,uniV4Chains:()=>aw,uniV4Health:()=>cw,uniV4InspectHook:()=>ow,uniV4PrepareExactIn:()=>sw,uniV4QuoteExactIn:()=>Xn,uniV4QuoteExactOut:()=>iw});import{AbiCoder as Xb,Interface as hs,getAddress as Ke,isAddress as ys,keccak256 as Yb}from"ethers";function ws(e){let t=Br(e),r=Number(BigInt(t)&Jb),n=Object.fromEntries(zl.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(zl.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===rw.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function Kn({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 Yb(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 nw({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 ow(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=Kn(c),l=t.rpcCall||Y,d=Wn.encodeFunctionData("getSlot0",[u]),p=Wn.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=Wn.decodeFunctionResult("getSlot0",f),x=Wn.decodeFunctionResult("getLiquidity",m)[0],E=h[0],O=E>0n,w=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,_=!!(i&bs),k=nw({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:E.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 Xn(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}),S=Gn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:A,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:S},"latest"],t);if(!R||R==="0x"){d.push({...b,ok:!1,error:"empty result"});continue}let I=Gn.decodeFunctionResult("quoteExactInputSingle",R),$={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:A,poolId:Kn({...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:Vl},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(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];A&&A.poolId!==p.poolId&&(x={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:g(A).liquidityUsd,bandBps:h},p=A)}let E=g(p),O=f[0]??null,w=E??O,_=e.liquidityUsd??E?.liquidityUsd??O?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":E?"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 iw(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=Gn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let E=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:x},"latest"],t);if(!E||E==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let O=Gn.decodeFunctionResult("quoteExactOutputSingle",E),w={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:O[0].toString(),gasEstimate:O[1].toString(),poolKey:g,zeroForOne:h,poolId:Kn({...g})};d.push(w),(!p||BigInt(w.amountIn)<BigInt(p.amountIn))&&(p=w)}catch(E){d.push({...m,ok:!1,error:String(E.message||E).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 yl({chainId:r,tokenA:s,tokenB:a,dexIds:Vl},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 sw(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 Xn(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[]"],[ew,[f,m,g]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,O=Qb.encodeFunctionData("execute",[Zb,[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:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:tw,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 aw(){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 cw(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,Gn,Qb,Wn,zl,Jb,bs,Zb,ew,tw,rw,Vl,Es=v(()=>{ot();Tr();Re();ge();Lr=Xb.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}],Gn=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)"]),Qb=new hs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Wn=new hs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),zl=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"]]),Jb=(1n<<14n)-1n,bs=8388608;Zb="0x10",ew="0x060c0f",tw="0x000000000022D473030F116dDEE9F6B43aC78BA3",rw="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Vl=["uniswap-v4","uniswapv4"]});function dw(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||uw).replace(/\/$/,"")}function pw(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||lw).replace(/\/$/,"")}async function Yn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${dw(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Gl(e={}){return N(`${pw(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var uw,lw,Ss=v(()=>{W();uw="https://coins.llama.fi",lw="https://api.llama.fi"});var Qn={};M(Qn,{ACROSS_API:()=>Kl,HOP_API:()=>Xl,RELAY_API:()=>Yl,acrossHealth:()=>mw,acrossSuggestedFees:()=>Ql,hopHealth:()=>hw,hopQuote:()=>Jl,relayHealth:()=>yw,relayPrepare:()=>gw,relayQuote:()=>ks});async function mw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ql({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 Ql(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||Kl).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function hw(e={}){try{let t=await Jl({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 Jl(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||Xl).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||fw[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 yw(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||Yl).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 gw(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 Kl,Xl,Yl,fw,Jn=v(()=>{W();Re();Sn();ge();Kl="https://across.to/api",Xl="https://api.hop.exchange/v1",Yl="https://api.relay.link",fw={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Zn(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 ed(e,t={}){let r=Ul[Number(e)];if(!r)return null;try{let n=await Yn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function bw(e={}){try{let t=await Gl({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function ww(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Zl[r]||[r]),n.push(...Zl[mt(e)]||[e]),n}function xw(e,t,r={}){let n=Array.isArray(e)?e:[],o=ww(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:Zn(f?.gasCosts),feeUsd:Zn(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 jl({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 Xn({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 td({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=bw(s),xw(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:Zn(d?.gasCosts),feeUsd:Zn(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(()=>(Jn(),Qn)),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(()=>(Jn(),Qn)),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,Zl,rd=v(()=>{Ir();vn();Cn();Hl();Ln();Hn();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,""),Zl=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 od={};M(od,{QUALITY:()=>Pe,bestBridgeRoute:()=>Fr,bestSwapRoute:()=>er,formatComparisonNote:()=>eo});async function nd(e,t,r){let n=Ew[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await Yn([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=ed(r,t),a=nd(r,o,t),c=ll(r,t).catch(()=>null),u=As({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([Vn(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,E=await Bl(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 Vn(w,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let O=Fl(m,{[h]:E},{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:eo(O,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:l.filter(h=>h.quality!==Pe.FAILED).length,note:eo(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=nd(n,i,t),c=td({...e,opts:t}),[u,l]=await Promise.all([Vn(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:eo(d,c.length)}}function Sw(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Tu(t)}`:""}function eo(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=Sw(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 Ew,tr=v(()=>{ms();rd();An();Ss();ot();Ew={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var id={};M(id,{ARTIFACT:()=>it,prepareBestRoute:()=>Ow,supportedPreparers:()=>Aw});function Aw(){return Object.keys(to)}async function Ow(e,t={}){if(_w.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(!Iw.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. 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=to[o];if(!s){let h=n.routes.find(x=>to[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):"",E=[String(h?.message||h),x].filter(Boolean).join(" :: "),O=/allowance/i.test(E),w=!O&&/not enough|insufficient|balance/i.test(E),_,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: ${E}`):w?(k="taker-not-funded",_=`${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.`):(k="provider-error",_=`${o} prepare failed: ${E}`);let b=n.routes.find(y=>to[y.source]&&y.source!==o);return{ok:!1,reason:_,failureKind:k,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??kw,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,kw,to,vw,Iw,_w,sd=v(()=>{tr();ge();it=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),kw=100,to={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Hn(),Il)),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(()=>(Es(),Wl)),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(()=>(vn(),Uu)),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(()=>(Cn(),Vu)),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(()=>(Ln(),al)),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"}}};vw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Iw=/^0x[0-9a-fA-F]{40}$/,_w=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var ad={};M(ad,{prepareBestBridgeRoute:()=>$w,supportedBridgePreparers:()=>Rw});function Rw(){return Object.keys(ro)}async function $w(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(!Cw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Tw.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=ro[s];if(!c){let h=i.routes.find(x=>ro[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):"",E=[String(h?.message||h),x].filter(Boolean).join(" :: "),O=/allowance/i.test(E),w=!O&&/not enough|insufficient|balance/i.test(E),_=i.routes.find(k=>ro[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: ${E}`:w?`${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: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??Nw,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 Cw,Tw,Nw,ro,cd=v(()=>{tr();ge();Cw=/^0x[0-9a-fA-F]{40}$/,Tw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Nw=100,ro={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Jn(),Qn)),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 dd={};M(dd,{buildTwapSchedule:()=>ld,normalizeTwapParams:()=>ud,prepareTwapChunk:()=>Fw,simulateTwap:()=>Dw});function ud(e={}){let t=Math.max(Pw,Math.min(Lw,Number(e.splits)||Uw)),r=Math.max(.1,Number(e.windowHours)||Bw),n=Math.max(qw,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 ld(e){let t=ud(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 Fw(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 Dw(e,{quoteFn:t=er,...r}={}){let n=ld(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 Pw,Lw,qw,Uw,Bw,pd=v(()=>{tr();ge();Pw=2,Lw=100,qw=60,Uw=10,Bw=6});async function hd({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(!fd.has(Number(e))||!fd.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(`${md}/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 yd(){try{return{ok:!0,chainCount:(await N(`${md}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var md,fd,gd=v(()=>{W();ge();md="https://dln.debridge.finance/v1.0",fd=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function wd({active:e=!0}={},t={}){let r=Date.now();if(rr.size&&r-bd<Mw)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 bd=r,n??[]}catch(n){return rr.size?[...rr.values()]:{error:String(n.message||n).slice(0,200)}}}async function jw(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 Hw(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 xd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await jw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Hw(e,t,s,{flow:n},o);if(a.error)return a;let c=await wd({},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 Ed(){try{let e=await wd();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,bd,Mw,Sd=v(()=>{W();vs="https://api.changenow.io/v2",rr=new Map,bd=0,Mw=6e5});async function kd({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(`${zw}/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 zw,Ad=v(()=>{W();zw="https://api.squidrouter.com/v1"});async function vd({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(`${Vw}/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 Vw,Id=v(()=>{W();Vw="https://api.stargate.finance"});async function _d({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(`${Ww}/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 Ww,Od=v(()=>{W();Ww="https://midgard.ninerealms.com/v2"});async function Cd({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(`${Gw}/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 Gw,Td=v(()=>{W();Gw="https://api.socket.tech/v2"});async function Nd({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(`${Kw}/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 Kw,Rd=v(()=>{W();Kw="https://api.connext.network"});async function $d({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(`${Xw}/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 Xw,Pd=v(()=>{W();Xw="https://api.portalbridge.com/v1"});function Yw(e,t){return`0x${_s.getAmountsOut}`+Oe(e)+Oe(64)+Oe(t.length)+t.map(Dr).join("")}function Qw(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 Jw(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 Ld(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:Yw(i,s)},"latest"],a);return Qw(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=Jw(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)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,O=E?`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:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Os,deadline:x.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,Oe,Dr,Os,qd=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 ex(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 Fd(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Ud.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 Zw){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(!Bd.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)),S=L.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return A<5e3?(S=L.FAIL,R=`round trip vs dollar book returns only ${(A/100).toFixed(2)}% -- punitive tax or no real liquidity`):A<9e3&&(S=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:S,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)),S=L.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return A<5e3?(S=L.FAIL,R=`dollar-book round trip returns only ${(A/100).toFixed(2)}%`):A<9e3&&(S=L.CAUTION,R=`dollar-book round trip returns ${(A/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:S,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,E=Number(x*10000n/BigInt(s)),O=L.PASS,w="round trip completes with expected fee/impact loss";return E<5e3?(O=L.FAIL,w=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(O=L.CAUTION,w=`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:O,reason:w,amountIn:String(s),bought:g.best.amountOut.toString(),returned:x.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: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(!Bd.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=ex(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${Ud.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 Zw,Ud,Ct,Mr,Bd,Ts,Dd=v(()=>{ot();ft();Zw=[100,500,3e3,1e4],Ud={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Mr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Bd=/^0x[0-9a-fA-F]{40}$/,Ts=100});function Md(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function jd(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 tx(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 Bn(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await dl(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 fl({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,no.decimals,o).catch(()=>null),r(n,no.symbol,o).catch(()=>null),r(n,no.name,o).catch(()=>null),r(n,no.totalSupply,o).catch(()=>null)]),u=Md(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:jd(s?.result??s),name:jd(a?.result??a),totalSupply:(Md(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 Dn(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=Fn(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:hl(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={...tx(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Fd({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,Ld({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 no,Hd=v(()=>{ot();Tr();ft();qd();Dd();us();no={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function oo(){return jr.map(e=>zn(Ns(e)))}function zd(e){return zn(Ns(e))}var jr,io=v(()=>{Hd();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 Yd,getAddress as rx,id as Qd}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 so(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 wx(e,t){try{return rx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function xx(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Xd(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Ex({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>fx)return"stale"}return"scoped"}function Sx(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 kx(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(nr(r)){let a=Ps(Gd,o,mx);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Vd.encodeFunctionData(d,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:Vd.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)&&so(Gd,o,l,gx),l})();return n?.set(o,s),s}async function Ax(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||ox,1),ix),o=await Bn(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:[nx,xx(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}:${Xd(l)}`,{token:u,spender:Xd(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function vx(e){return(lx[e]||[]).flatMap(r=>ax.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function Ix(e,t,r={}){let n=[],o="direct-probe",i=null,s=vx(e),a=$s(e),c=nr(r)&&Ps(Rs,e,hx)?.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 Ax(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},nr(r)&&so(Rs,e,!0,64)}catch{if(nr(r)&&so(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 ln(n,r.concurrency||4,async f=>{try{let m=await pl({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 kx(e,f.token,r,u),x=g>=px,E=sx[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:Sx(g,h.decimals,x),unlimited:x,lastActivityAt:null,risk:Ex({unlimited:x,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await Ox(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 _x(e,t,r,n,o){try{let i=Wd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Wd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function $s(e){return(ux[e]||[]).flatMap(r=>cx.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function Ox(e,t,r){let n=$s(e);return n.length===0?[]:(await ln(n,r.concurrency||4,async i=>await _x(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 Jd(e={},t={}){let r=wx(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(Kd,i,yx);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await ln(o,e.concurrency||3,f=>Ix(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&&so(Kd,i,p,bx),{...p,cached:!1,cachedAgeMs:0}}var Vd,Wd,nx,EO,ox,ix,sx,ax,cx,ux,lx,dx,px,fx,mx,hx,yx,gx,bx,Gd,Rs,Kd,Zd=v(()=>{io();W();ot();Vd=new Yd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Wd=new Yd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),nx=Qd("Approval(address,address,uint256)"),EO=Qd("ApprovalForAll(address,address,bool)"),ox=1e4,ix=2e5,sx=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)"}),ax=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"}]),cx=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"}]),ux=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"}]}),lx=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}]}),dx=(1n<<256n)-1n,px=dx/2n,fx=4320*60*60*1e3,mx=360*60*1e3,hx=600*1e3,yx=45*1e3,gx=512,bx=128,Gd=new Map,Rs=new Map,Kd=new Map});var rp={};M(rp,{aggregateBridgeQuotes:()=>ep,bridgeAggregatorHealth:()=>Tx,checkRevokeNeeded:()=>tp,scanBridgeRoutes:()=>Cx});async function ep(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=hd({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=kd({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,S)=>A+(Number(S.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),x=vd({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=_d({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 xd({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=Cd({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)),_=Nd({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=$d({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,E,w,_,k,O]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,A)=>{let S=Number(y.amountOut??0),R=Number(A.amountOut??0);return S!==R?R-S: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 tp({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Jd({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 Cx(e={},t={}){let[r,n]=await Promise.all([ep(e,t),tp({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 Tx(){let[e,t]=await Promise.all([yd().catch(r=>({ok:!1,error:r.message})),Ed().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var GO,np=v(()=>{tr();gd();Sd();Ad();Id();Od();Td();Rd();Pd();Zd();GO=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var op={};M(op,{DYDX_API:()=>ao,dydxHealth:()=>Px,dydxMarkets:()=>Rx,dydxOrderbook:()=>$x});function Hr(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Nx(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Rx(e=50,t={}){try{let r=await N(`${ao}/v4/perpetualMarkets?limit=${e}`,t);return Nx(r).map(o=>{let i=Hr(o?.nextFundingRate),s=Hr(o?.oraclePrice),a=Hr(o?.openInterest),c=Hr(o?.volume24H),u=Hr(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&u!=null?u/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function $x(e){try{let t=await N(`${ao}/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 Px(){try{return{ok:!0,serverTime:(await N(`${ao}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ao,ip=v(()=>{W();ao="https://indexer.dydx.trade"});var up={};M(up,{DRIFT_API:()=>ap,driftHealth:()=>Lx,driftMarkets:()=>cp});async function cp(e={}){try{let r=(await N(`${ap}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:sp,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${sp} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function Lx(){let e=await cp();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var ap,sp,lp=v(()=>{W();ap="https://dlob.drift.trade",sp="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified."});var fp={};M(fp,{VERTEX_API:()=>Ls,vertexHealth:()=>Ux,vertexMarkets:()=>pp,vertexOrderbook:()=>qx});async function pp(e={}){try{let r=(await N(`${Ls}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:dp,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${dp} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function qx(e){try{let r=(await N(`${Ls}/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),quality:"FAILED"}}}async function Ux(){let e=await pp();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var Ls,dp,mp=v(()=>{W();Ls="https://gateway.prod.vertexprotocol.com/v2",dp="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified."});var hp={};M(hp,{pancakeHealth:()=>Dx,pancakeQuote:()=>Fx});async function Fx({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(`${Bx}/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 Dx(){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 Bx,yp=v(()=>{W();Bx="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var bp={};M(bp,{sushiHealth:()=>Hx,sushiQuote:()=>jx});async function jx({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(`${Mx(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 Hx(){try{return{ok:!0,chains:Object.keys(gp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Mx,gp,wp=v(()=>{W();Mx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${gp[e]||"ethereum"}`,gp={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 xp={};M(xp,{raydiumHealth:()=>Wx,raydiumQuote:()=>Vx});async function Vx({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(`${zx}/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 Wx(){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 zx,Ep=v(()=>{W();zx="https://quote-api.jup.ag/v6"});var Sp={};M(Sp,{AEVO_API:()=>qs,aevoHealth:()=>Kx,aevoMarkets:()=>Gx});async function Gx(e={}){try{return(await N(`${qs}/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 Kx(){try{return{ok:(await N(`${qs}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var qs,kp=v(()=>{W();qs="https://api.aevo.xyz"});var Ap={};M(Ap,{compoundHealth:()=>Qx,compoundMarkets:()=>Yx});async function Yx(e={}){try{return((await N(`${Xx}/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 Qx(){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 Xx,vp=v(()=>{W();Xx="https://api.compound.finance/api/v2"});var Ip={};M(Ip,{yearnHealth:()=>eE,yearnVaults:()=>Zx});async function Zx(e={}){try{return(await N(`${Jx}/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 eE(){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 Jx,_p=v(()=>{W();Jx="https://api.yearn.fi/v1"});var Op={};M(Op,{convexHealth:()=>nE,convexPools:()=>rE});async function rE(e={}){try{return(await N(`${tE}/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 nE(){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 tE,Cp=v(()=>{W();tE="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 zr(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 Us(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[zr(e,r),zr(t,r),r]}function yt(e,t){let[r,n,o]=Us(e,t);return Ye(r.mantissa+n.mantissa,o)}function Vr(e,t){let[r,n,o]=Us(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]=Us(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var oC,Ce=v(()=>{oC=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Np,readFileSync as oE}from"node:fs";import{dirname as Tp,join as Bs}from"node:path";import{fileURLToPath as iE}from"node:url";function sE(e){let t=Tp(iE(e));for(let r=0;r<8;r+=1){let n=Bs(t,"package.json");if(Np(n))try{let i=JSON.parse(oE(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Tp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Rp(e,t){let r=sE(t),n=Bs(r,e);return Np(n)?n:Bs(r,"dist","assets",e)}var $p=v(()=>{});import{readFileSync as aE,existsSync as cE}from"node:fs";import{fileURLToPath as uE}from"node:url";import{dirname as lE,join as Lp}from"node:path";function pE(){try{let e=Rp("equities-fixtures",import.meta.url);if(e&&cE(e))return e}catch{}return dE}function mE(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){mE(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 hE(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 yE(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 gE(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 bE(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 wE(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 xE(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 EE(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 SE(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 kE(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 AE(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 IE(e,t){let r=qp[t],n=Lp(e,r),o;try{o=aE(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 vE[t](i,r),i}function Up(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Up(t)}return e}function Fs({fixtureDir:e=fE}={}){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(qp))t[r]=IE(e,r);return Up(t)}function st(){return Pp??=Fs(),Pp}function Ie(){return st().venues}function Bp(){return st().universe}function Fp(){return st().oracles}function Dp(){return st().nyseHolidays}function Mp(){return st().dstTransitions}function uo(){return st().rhPoolState}function jp(){return st().solanaXstocks}function Hp(){return st().tonXstocks}function zp(){return st().hip3L2Books}var dE,fE,qp,vE,Pp,Be=v(()=>{$p();dE=Lp(lE(uE(import.meta.url)),"fixtures");fE=pE(),qp=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"});vE=Object.freeze({venues:hE,universe:yE,oracles:gE,nyseHolidays:bE,dstTransitions:wE,equityDexPools:xE,rhPoolState:EE,solanaXstocks:kE,tonXstocks:AE,hip3L2Books:SE})});function CE(){let e=Mp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ms,endMs:n.endUtc*Ms}));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 Jp(){return Wp??=CE(),Wp}function TE(){return Ds===void 0&&(Ds=new Set(Dp().holidayDayIndex)),Ds}function Zp(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function NE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Jp();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 RE(e){for(let t of Jp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function $E(e){return RE(e)?OE:_E}function PE(e){let t=e+$E(e),r=Math.floor(t/Vp),n=t-r*Vp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Gp),msIntoDay:n,weekday:o.getUTCDay()}}function LE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!TE().has(e)}function qE(e){return e<Kp?"dark":e<Xp?"extended":e<Yp?"core":e<Qp?"extended":"dark"}function Wr(e){Zp(e,"sessionState"),NE(e,"sessionState");let t=PE(e);return LE(t)?qE(t.minuteOfDay):"dark"}function Hs(e){return Zp(e,"isDark"),Wr(e)==="dark"}var Ms,Gp,js,Vp,_E,OE,Kp,Xp,Yp,Qp,yC,gC,Wp,Ds,lo=v(()=>{Be();Ms=1e3,Gp=60*Ms,js=60*Gp,Vp=24*js,_E=-5*js,OE=-4*js,Kp=240,Xp=570,Yp=960,Qp=1200,yC=Object.freeze([Kp,Xp,Yp,Qp]),gC=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 FE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function DE(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function ef(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??UE,o=t.oracleFreshnessMs??BE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(FE(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(DE(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(ef(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=Wr(r),l=u==="core"?o:o*2;if(ef(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,UE,BE,zs=v(()=>{Ce();lo();po=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),UE=12e4,BE=6e5});function ME(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(ME(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 nf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){nf(e)||Z(t,"must be an object")}function of(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 Gr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Ws(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function Vs(e,t,r=!1){e===null&&r||(nf(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 rf(e,t){Rt(e,t),or(e.venue,`${t}.venue`),or(e.reason,`${t}.reason`),KE.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",...tf,"costAccounted","capturedAt","blockOrSeq","raw"])of(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"),Gr(e.instrument,jE,"quote.instrument"),Gr(e.tier,HE,"quote.tier"),or(e.symbolRaw,"quote.symbolRaw"),or(e.symbol,"quote.symbol"),Gr(e.side,zE,"quote.side"),Vs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of GE)Object.hasOwn(e,r)&&(Vs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of tf)Vs(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"),Ws(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"])of(e,t,"rankResult");return Gr(e.rankedOn,VE,"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"),Ws(e.sourcesAnswered,"rankResult.sourcesAnswered"),Ws(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)=>rf(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>rf(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),Gr(e.instrumentMix,WE,"rankResult.instrumentMix"),ho(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var jE,HE,zE,VE,WE,GE,tf,KE,at=v(()=>{jE=new Set(["spot","perp"]),HE=new Set(["read-only","quote-only","prepare","intent"]),zE=new Set(["buy","sell"]),VE=new Set(["net-of-cost","gross"]),WE=new Set(["homogeneous","heterogeneous"]),GE=["bid","ask","mid","mark"],tf=["fees","gasEstimate","priceImpact","fundingHourly"],KE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function sf(){return Ie().venues.arcus}function JE(){return Object.keys(sf().markets).sort()}function ZE({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=sf().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:XE,chain:YE,instrument:"perp",tier:QE,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 JE().map(r=>ZE({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var XE,YE,QE,go,Gs=v(()=>{Be();Nt();Ce();at();XE="arcus_perp",YE="robinhood-4663",QE="quote-only",go="0.00000480324074074"});function Ks(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 cf(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=eS(n,t),c=t-a,u=F(go),l=Ks(i,c),d=Ks(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=Ks(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 eS(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)Hs(e+o*af)&&(r+=1);return t>n&&Hs(e+n*af)&&(r+=t-n),r}var af,PC,uf=v(()=>{Ce();Gs();lo();af=36e5,PC=24*365});function tS(e){return e.mid??e.mark??e.ask??e.bid??null}function rS(e){let t=tS(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 nS(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 oS(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=Vr(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=rS(b);if(y===null)continue;let A=null;if(u&&b.instrument==="perp"&&(A=cf(b,c,{nowMs:r}),A.carryBps!==null)){let S=yt(F("1"),Ue(A.carryBps,we(10000n,0),12));y.net=ve(y.net,S),y.costAccounted=!1}l.push(nS(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:oS(f,m[0]),E=l.find(b=>b.tier==="prepare")??null,O=Wr(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&&(_=iS(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:E,carry:f?.carry??null,breakEvenHorizonHours:_};return yo(k)}function iS(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=Vr(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 Xs=v(()=>{zs();uf();lo();Ce();at()});function Ys(){return uo()}function dS(e){return{mantissa:e*e*10n**BigInt(ir)/uS,scale:ir}}function pS(e){let t=dS(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 fS(e){let t=Fp(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function mS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,hS(r,t),ir)}function hS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:zr(e,r).mantissa+zr(t,r).mantissa,scale:r}}function yS(e){let t=Ys(),r=lS[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Qs(){return Object.keys(Ys().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=Ys(),o=n.pools[e];if(!o)return null;let i=pS(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"):mS(s,a),l=yS(o.version),f={venue:sS,chain:aS,instrument:"spot",tier:cS,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=fS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=qe(Ue(ve(Vr(i,m),we(10000n,0)),m,4))),xe(f)}function lf({side:e="buy",sizeUsd:t=null}={}){return Qs().map(r=>sr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var sS,aS,cS,uS,ir,lS,Js=v(()=>{Be();Nt();Ce();at();sS="rh_uniswap",aS=4663,cS="prepare",uS=1n<<192n,ir=18,lS=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>df)throw new Error(`quote is stale (${a}ms old, bound ${df}ms); re-quote before preparing`);let u=uo().pools[t],l=u.version==="v4"?bS:gS,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 df,gS,bS,Zs=v(()=>{Js();Be();df=12e4,gS="0x0000000000000000000000000000000000000000",bS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Kr(){return Ie().venues.hyperliquid_hip3}function pf(){return Object.keys(Kr().dexs).sort()}function SS(){let e=[];for(let[t,r]of Object.entries(Kr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function kS(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=Kr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Kr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function AS(e,t){try{return zp().books[`${e}:${t}`]??null}catch{return null}}function vS(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 IS(e,t,r,n){let o=vS(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 ff({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=AS(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let h=IS(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:wS,chain:xS,instrument:"perp",tier:ES,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 mf({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=kS(e);return n.length===0||n.length>1?null:ff({...n[0],side:t,size:r})}function Eo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of SS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Kr().dexs[i][s];n.push(ff({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var wS,xS,ES,hf=v(()=>{Be();Nt();Ce();at();wS="hyperliquid_hip3",xS="hyperliquid",ES="quote-only"});function yf(){return Ie().venues.arcus_spot}function TS(){return Object.keys(yf().pairs).sort()}function NS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=yf().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:_S,chain:OS,instrument:"spot",tier:CS,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 So({side:e="buy",sizeUsd:t=null}={}){return TS().map(r=>NS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var _S,OS,CS,gf=v(()=>{Be();Nt();Ce();at();_S="arcus_spot",OS="robinhood-4663",CS="quote-only"});function ko(){return jp()}function ea(){return Object.keys(ko().tokens).sort()}function LS(e){let t=ko().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function qS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ta({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=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=LS(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"):qS(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=bf&&(p=!1);let f={venue:RS,chain:$S,instrument:"spot",tier:PS,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)<bf}};return xe(f)}function wf({side:e="buy",sizeUsd:t=null}={}){return ea().map(r=>ta({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var RS,$S,PS,bf,xf=v(()=>{Be();Nt();Ce();at();RS="solana_xstocks",$S="solana",PS="quote-only",bf=25e3});function Ao(){return Hp()}function ra(){return Object.keys(Ao().tokens).sort()}function jS(e){let t=Ao().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function HS(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 na({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=jS(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"):HS(u,l),f={venue:US,chain:BS,instrument:"spot",tier:FS,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)<DS,impactSizeFractionHint:MS}};return xe(f)}function Ef({side:e="buy",sizeUsd:t=null}={}){return ra().map(r=>na({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var US,BS,FS,DS,MS,Sf=v(()=>{Be();Nt();Ce();at();US="ton_stonfi",BS="ton",FS="quote-only",DS=25e3,MS=.01});var vo={};M(vo,{bestEquityRoute:()=>zS,collectEquityQuotes:()=>Af,equityVenues:()=>VS,getUniverse:()=>Bp,getVenues:()=>Ie,loadFixtures:()=>Fs,prepareEquity:()=>xo,prepareEquityRoute:()=>WS,rankEquityQuotes:()=>wo,toJsonSafe:()=>GS,validateQuote:()=>xe,validateRankResult:()=>yo});function oa(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function Af(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=oa(t),o=[],i=mf({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=ta({symbol:r,sizeUsd:n});a&&o.push(a);let c=na({symbol:r,sizeUsd:n});return c&&o.push(c),o}function zS(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=oa(e.sizeUsd??e.size??null),n=Af(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>kf}}function VS(){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:Qs().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:ea().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ra().length}],t=[...Eo(),...bo(),...So(),...lf(),...wf(),...Ef()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=mo(t,{nowMs:r});return{inventory:e,hip3Dexs:pf(),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 WS(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=oa(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>kf}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function GS(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var kf,Io=v(()=>{Ce();Xs();Zs();zs();hf();gf();Gs();Js();xf();Sf();Be();Xs();Zs();at();Be();kf=3600*1e3});var _o={};M(_o,{CHAIN_CONFIGS:()=>jr,EVIDENCE:()=>U,RISK:()=>L,SCANNER_CAPABILITIES:()=>Qt,__clearScanners:()=>zb,createScanner:()=>Pl,getScanner:()=>ps,listScanners:()=>Ll,registerBuiltinScanners:()=>oo,registerCustomChain:()=>zd,registerScanner:()=>zn,scannerCoverage:()=>Vb,validateScanner:()=>$l});var Oo=v(()=>{ft();io()});var aa={};M(aa,{createWatch:()=>JS,listWatches:()=>QS,removeWatch:()=>ZS});import Xr from"node:fs";import ia from"node:path";import{randomUUID as KS}from"node:crypto";import{homedir as XS}from"node:os";function YS(e=process.env){return e.ORACLE_CONFIG_DIR||ia.join(XS(),".config","oracle")}function vf(e=process.env){return ia.join(YS(e),"watches.json")}function sa(e=process.env){let t=vf(e);if(!Xr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Xr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function If(e,t=process.env){let r=vf(t);Xr.mkdirSync(ia.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Xr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
-
`,{mode:384}),
|
|
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 tk,rk,nk,ok,Nf=v(()=>{tk=/\b0x[a-fA-F0-9]{40}\b/g,rk=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,nk=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),ok=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as sk}from"node:child_process";import Rf from"node:fs";import ua from"node:path";function lk(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Lf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function dk(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ua.isAbsolute(t)?Rf.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(ua.delimiter)){if(!n)continue;let o=ua.join(n,"xurl");try{if(Rf.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 pk(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 fk(e){for(let t of e){let r=String(t);if(Pf.includes(r))return r;if(Pf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function mk(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=fk(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(!Lf(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(!ck.includes(o))if(uk.includes(o)){if(!Lf(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 qf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!lk(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=mk(t,n);if(!o.ok)return o;let i=dk(n);if(!i.ok)return i;let a=(r.spawnFn||sk)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||$f,maxBuffer:1024*1024,env:pk(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||$f}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(d,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,ak),{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 $f,ak,ck,uk,Pf,GT,Uf=v(()=>{Qo();$f=45e3,ak=4e4,ck=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),uk=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Pf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);GT=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 bk(e){return!e||e==="0x"||e===gk}async function Bf(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(hk))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,l=null,d=null;for(let{label:m,slot:g}of yk)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!bk(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 hk,yk,gk,Ff=v(()=>{ot();hk=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"}}),yk=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),gk=`0x${"0".repeat(64)}`});function Co(e,t){let r=String(e||"").trim();if(!wk.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function la(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 Yr(e,t){return e==null||e===""?null:la(e,t)}function Ek({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=la(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Yr(l.gasLimit??c.gasLimit,"gasLimit"),g=Yr(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)),E=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(E,{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},_=Yr(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=Yr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(w.operatorFeeWei=Yr(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 Sk(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}oo();let r=ps(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function kk({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 Df(e={},t={}){let r=Number(e.chainId??xk);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:la(e.amountIn,"amountIn"),a=Sk(r,t.scanner),c=t.scanContractRisk||Bf,[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=kk({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),x=null,E=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{E=Ek({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:!!E,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:E,localSignerBlockedReason:O,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var wk,xk,Mf=v(()=>{io();ft();Re();Ff();wk=/^0x[0-9a-fA-F]{40}$/,xk=4663});var Wf={};M(Wf,{evaluateContracts:()=>Vf,fetchAccountTweets:()=>zf,snipeExecuteEnabled:()=>jf,tickTwitterCaWatch:()=>Ck,twitterSnipeEmitsCard:()=>Tk});function jf(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Hf(e){return String(e||"").trim().replace(/^@/,"")}async function zf({handle:e,limit:t=5,xurlFn:r=qf}={},n={}){let o=Hf(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:Tf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function _k(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Df({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function Ok(e,t){let r=await gl(e,{chainSlug:"solana",stables:[vk,Ik]},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 Vf(e,t={},r={}){let n=Number(t.chainId??Ak),o=[];for(let i of e.evm||[])o.push(await _k(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await Ok(i,r));return o}async function Ck(e={},t={}){let r=Hf(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await zf({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=Cf(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||Vf)(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:jf(t.env||process.env),hits:i,seen:[...n]}}function Tk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var Ak,vk,Ik,Gf=v(()=>{Nf();Uf();Mf();Tr();sn();Ak=4663,vk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Ik="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as Nk}from"ethers";function Lk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Pk.has(t.length)&&t.every(r=>Nk.en.getWordIndex(r)>=0)}function Fk(e){let t=Kf(e);return Bk.has(t)||Uk.test(t)}function Kf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Dk(e){let t=Kf(e);return[...Rk].some(r=>t.includes(r))}function Mk(e,t,r){if(typeof t=="string"){if($k.some(n=>n.test(t))||Lk(t))throw new Qr(r);if(qk.test(t)&&!Fk(e))throw new Qr(r)}}function da(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Mk(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)=>da(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(Dk(o))throw new Qr(i);e[o]!==void 0&&(n[o]=da(e[o],i,o))}return n}function ar(e){return da(e)}var Rk,$k,Pk,qk,Uk,Bk,Qr,pa=v(()=>{Rk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),$k=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Pk=new Set([12,15,18,21,24]);qk=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Uk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Bk=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Qr=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as jk,chmod as To,readFile as Hk,rename as zk,writeFile as Vk}from"node:fs/promises";import{homedir as Wk}from"node:os";import{dirname as Xf,join as fa}from"node:path";import Gk 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 Yf(e){if(!Kk.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 Qf(e={}){let t=e.path||Qk;await jk(Xf(t),{recursive:!0,mode:448}),await To(Xf(t),448);let r;try{r=await Hk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Gk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
8
|
+
- `)}`);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 Vn(e){let t=Bl(e);return Zt.set(t.chainId,t),t}function fs(e){return Zt.get(Number(e))||null}function Fl(){return[...Zt.values()]}function ew(){Zt.clear()}function tw(){let e={};for(let t of Zt.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:Zt.size,capabilities:[...Qt],chains:e}}var Qt,U,L,Zb,Zt,ft=I(()=>{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"}),Zb=/^0x[0-9a-fA-F]{40}$/;Zt=new Map});function Dl(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:$e.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=qr(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:qr(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 jl(e,t,{divisor:r=1000n}={}){let n=qr(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=qr(i),c=qr(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 Hl(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 ms(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(g=>g.quality!==$e.FAILED),c=e.filter(g=>g.quality===$e.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(g=>{let S=BigInt(g.amountOut),E=0n,R=!1,v=!1,P=BigInt(g.oracleFeeBps??0),q=P>0n?S*P/10000n:0n;if(u){let B=g.gasUsd,H=Number(g.meta?.gasUnits??g.estimatedGas);if(B==null&&p&&Number.isFinite(H)&&H>0){let K=H*l/1e18*d;Number.isFinite(K)&&K>=0&&(B=K,v=!0)}let ie=(B??0)+(g.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=S>j?S-j:0n;return{...g,grossOut:S.toString(),netOut:X.toString(),costInDest:E.toString(),oracleFeeInDest:q.toString(),costAccounted:R,gasEstimated:v}}),m=Number(o)>0?Number(o):0,y=f.reduce((g,S)=>BigInt(S.netOut)>g?BigInt(S.netOut):g,0n),h=g=>y>0n?Number((y-BigInt(g))*10000n/y):0,x=[],k=f.slice().sort((g,S)=>BigInt(S.netOut)>BigInt(g.netOut)?1:-1)[0]??null;f.sort((g,S)=>{let E=h(g.netOut)<=m?0:1,R=h(S.netOut)<=m?0:1;if(n&&m>0&&E!==R)return E-R;if(n&&m>0){let v=g.liquidityUsd??-1,P=S.liquidityUsd??-1;if(v!==P)return P-v}return BigInt(S.netOut)>BigInt(g.netOut)?1:-1}),n&&m>0&&k&&f[0]&&f[0].source!==k.source&&x.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${k.source} within ${m} bps`);let _=f.filter(g=>!g.costAccounted).map(g=>g.source);u?_.length&&x.push(`gas not reported by: ${_.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 g=f.find(S=>S.costAccounted&&h(S.netOut)<=m);g&&x.push(`winner ${w.source} has UNMEASURED gas; gas-measured ${g.source} is within ${m} bps and may net more once ${w.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(g=>g.gasEstimated).map(g=>g.source);O.length&&x.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 g=BigInt(f[0].netOut),S=BigInt(f[1].netOut);S>0n&&(A=Number((g-S)*10000n/S),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:x}}async function Wn(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"?Dl({source:s,error:String(o.reason?.message||o.reason)}):Dl({source:s,...o.value})})}var $e,Ml,qr,hs=I(()=>{ft();$e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Ml={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"},qr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function zl(e={}){return _n({provider:"oneinch",defaultUrl:rw,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function nw(e={}){return zl(e).baseUrl}function Vl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function ow(e={}){let t=Vl(e);return On({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},zl(e).trusted)}async function Wl(e={},t={}){if(!Vl(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(`${nw(t)}/${r}/quote?${s}`,{headers:ow(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 rw,Gl=I(()=>{W();Re();ts();ge();rw="https://api.1inch.dev/swap/v6.0"});var Yl={};M(Yl,{UNI_V4_CHAINS:()=>Le,UNI_V4_FEE_TIERS:()=>bs,computeV4PoolId:()=>Xn,decodeV4HookPermissions:()=>xs,uniV4Chains:()=>gw,uniV4Health:()=>bw,uniV4InspectHook:()=>mw,uniV4PrepareExactIn:()=>yw,uniV4QuoteExactIn:()=>Yn,uniV4QuoteExactOut:()=>hw});import{AbiCoder as iw,Interface as ys,getAddress as Ke,isAddress as gs,keccak256 as sw}from"ethers";function xs(e){let t=Dr(e),r=Number(BigInt(t)&cw),n=Object.fromEntries(Kl.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(Kl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Fr(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 Dr(e){if(e==null||e==="")return ye;let t=String(e);if(!gs(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function er(e,t){let r=Le[Number(t)];if(Br(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(!gs(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function Br(e){let t=String(e||"").trim().toLowerCase();return!t||t===pw.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function Xn({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=Dr(o);return sw(Ur.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function Es({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:Dr(o)},zeroForOne:u}}function fw({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=xs(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 mw(e={},t={}){let r=Fr(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=er(e.tokenIn||"WETH",r.chainId),o=er(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=Dr(e.hooks),{poolKey:c}=Es({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Xn(c),l=t.rpcCall||Y,d=Gn.encodeFunctionData("getSlot0",[u]),p=Gn.encodeFunctionData("getLiquidity",[u]),[f,m,y]=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=Gn.decodeFunctionResult("getSlot0",f),x=Gn.decodeFunctionResult("getLiquidity",m)[0],k=h[0],_=k>0n,w=a===ye?null:typeof y=="string"&&y!=="0x"&&y.length>4,O=!!(i&ws),A=fw({hook:a,codePresent:w,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:k.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:x.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:w,codeBytes:w?(y.length-2)/2:0,permissions:xs(a)}),risk:A})}async function Yn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Fr(e.chainId??8453),s=er(e.tokenIn||"WETH",r),a=er(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}]:[...bs],l=e.hooks||ye,p=await Promise.all(u.map(async g=>{let{poolKey:S,zeroForOne:E}=Es({tokenIn:s,tokenOut:a,fee:g.fee,tickSpacing:g.tickSpacing,hooks:l}),R=Kn.encodeFunctionData("quoteExactInputSingle",[{poolKey:S,zeroForOne:E,exactAmount:c,hookData:"0x"}]);try{let v=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:R},"latest"],t);if(!v||v==="0x")return{...g,ok:!1,error:"empty result"};let P=Kn.decodeFunctionResult("quoteExactInputSingle",v);return{fee:g.fee,tickSpacing:g.tickSpacing,ok:!0,amountOut:P[0].toString(),gasEstimate:P[1].toString(),poolKey:S,zeroForOne:E,poolId:Xn({...S})}}catch(v){return{...g,ok:!1,error:String(v.message||v).slice(0,160)}}})),f=null;for(let g of p)g.ok&&(!f||BigInt(g.amountOut)>BigInt(f.amountOut))&&(f=g);if(!f){let g=p.map(S=>`${S.fee}/${S.tickSpacing}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${g}`)}let m=e.liquidityUsd==null?await Nr({chainId:r,tokenA:s,tokenB:a,dexIds:Xl},t).catch(()=>[]):[],y=new Map;for(let g of m){let S=String(g.pairAddress||"").toLowerCase();S&&y.set(S,g)}let h=g=>y.get(String(g.poolId||"").toLowerCase())??null,x=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),k=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&x>0&&BigInt(f.amountOut)>0n){let g=BigInt(f.amountOut),E=p.filter(R=>R.ok&&Number((g-BigInt(R.amountOut))*10000n/g)<=x).filter(R=>h(R)?.liquidityUsd!=null).sort((R,v)=>h(v).liquidityUsd-h(R).liquidityUsd)[0];E&&E.poolId!==f.poolId&&(k={priceBestFee:f.fee,chosenFee:E.fee,chosenPoolUsd:h(E).liquidityUsd,bandBps:x},f=E)}let _=h(f),w=m[0]??null,O=_??w,A=e.liquidityUsd??_?.liquidityUsd??w?.liquidityUsd??null,b=e.liquidityUsd!=null?"caller":_?"pool":w?"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:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,zeroForOne:f.zeroForOne,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:A,liquiditySource:O,liquidityAttribution:b,liquidityPick:k,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&gs(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&&!Br(e.tokenIn)&&!Br(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===ye&&!(f.fee&ws)},{chainId:r,venue:i||n,amountOut:f.amountOut,liquidityUsd:A,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function hw(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Fr(e.chainId??8453),s=er(e.tokenIn||"WETH",r),a=er(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}]:[...bs],l=e.hooks||ye,p=await Promise.all(u.map(async y=>{let{poolKey:h,zeroForOne:x}=Es({tokenIn:s,tokenOut:a,fee:y.fee,tickSpacing:y.tickSpacing,hooks:l}),k=Kn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:x,exactAmount:c,hookData:"0x"}]);try{let _=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:k},"latest"],t);if(!_||_==="0x")return{...y,ok:!1,error:"empty result"};let w=Kn.decodeFunctionResult("quoteExactOutputSingle",_);return{fee:y.fee,tickSpacing:y.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:h,zeroForOne:x,poolId:Xn({...h})}}catch(_){return{...y,ok:!1,error:String(_.message||_).slice(0,160)}}})),f=null;for(let y of p)y.ok&&(!f||BigInt(y.amountIn)<BigInt(f.amountIn))&&(f=y);if(!f){let y=p.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${y}`)}let m=e.liquidityUsd==null?await xl({chainId:r,tokenA:s,tokenB:a,dexIds:Xl},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:f.amountIn,amountOut:c.toString(),gasEstimate:f.gasEstimate,fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,zeroForOne:f.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function yw(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=Fr(n);if(Dr(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)&ws)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(Br(e.tokenIn)||Br(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Yn(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=Ur.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=Ur.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),y=Ur.encode(["address","uint256"],[u.tokenOut,l]),h=Ur.encode(["bytes","bytes[]"],[lw,[f,m,y]]),k=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=aw.encodeFunctionData("execute",[uw,[h],k]);return Q({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:k,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:dw,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 gw(){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 bw(e={}){let t=Fr(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 Ur,ye,Le,bs,Kn,aw,Gn,Kl,cw,ws,uw,lw,dw,pw,Xl,Ss=I(()=>{ot();Rr();Re();ge();Ur=iw.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"}},bs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Kn=new ys(["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)"]),aw=new ys(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Gn=new ys(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Kl=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"]]),cw=(1n<<14n)-1n,ws=8388608;uw="0x10",lw="0x060c0f",dw="0x000000000022D473030F116dDEE9F6B43aC78BA3",pw="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Xl=["uniswap-v4","uniswapv4"]});function Ew(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||ww).replace(/\/$/,"")}function Sw(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||xw).replace(/\/$/,"")}async function Jn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${Ew(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jl(e={}){return N(`${Sw(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var ww,xw,ks=I(()=>{W();ww="https://coins.llama.fi",xw="https://api.llama.fi"});var Qn={};M(Qn,{ACROSS_API:()=>Ql,HOP_API:()=>Zl,RELAY_API:()=>ed,acrossHealth:()=>Aw,acrossSuggestedFees:()=>td,hopHealth:()=>vw,hopQuote:()=>rd,relayHealth:()=>Iw,relayPrepare:()=>_w,relayQuote:()=>As});async function Aw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await td({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 td(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||Ql).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function vw(e={}){try{let t=await rd({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 rd(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||Zl).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||kw[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 Iw(e={}){try{let t=await As({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 As(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||ed).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 _w(e={},t={}){let r=await As(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 Q({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 Ql,Zl,ed,kw,Zn=I(()=>{W();Re();kn();ge();Ql="https://across.to/api",Zl="https://api.hop.exchange/v1",ed="https://api.relay.link",kw={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function eo(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 od(e,t={}){let r=Ml[Number(e)];if(!r)return null;try{let n=await Jn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function Ow(e={}){try{let t=await Jl({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function Cw(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...nd[r]||[r]),n.push(...nd[mt(e)]||[e]),n}function Tw(e,t,r={}){let n=Array.isArray(e)?e:[],o=Cw(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 vs({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:eo(f?.gasCosts),feeUsd:eo(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 Gt({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 Kt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,y=await Promise.resolve(c);return m!=null&&y&&(f=Number(m)/1e18*y),{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 Wl({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"}}}}),Le[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await Yn({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}}}}),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}}}}),d}function id({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=Ow(s),Tw(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:eo(d?.gasCosts),feeUsd:eo(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(()=>(Zn(),Qn)),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(()=>(Zn(),Qn)),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 y=BigInt(String(o))-BigInt(String(p));y>0n&&(f=y.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,nd,sd=I(()=>{_r();In();Tn();Gl();qn();zn();Ss();ks();hs();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),nd=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 cd={};M(cd,{QUALITY:()=>$e,bestBridgeRoute:()=>Mr,bestSwapRoute:()=>tr,formatComparisonNote:()=>to});async function ad(e,t,r){let n=Nw[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await Jn([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 tr(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=od(r,t),a=ad(r,o,t),c=ml(r,t).catch(()=>null),u=vs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([Wn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=ms(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let h=m.best.source,k=await jl(async _=>{let w=vs({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(A=>A.source===h);return w.length?(await Wn(w,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(k){let _=Hl(m,{[h]:k},{maxImpactPct:y});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:l.filter(w=>w.quality!==$e.FAILED).length,note:to(_,u.length),priceImpact:{[h]:Number(k.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!==$e.FAILED).length,note:to(m,u.length)}}async function Mr(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=ad(n,i,t),c=id({...e,opts:t}),[u,l]=await Promise.all([Wn(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ms(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!==$e.FAILED).length,note:to(d,c.length)}}function Rw(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Pu(t)}`:""}function to(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=Rw(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 Nw,rr=I(()=>{hs();sd();vn();ks();ot();Nw={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var ud={};M(ud,{ARTIFACT:()=>it,prepareBestRoute:()=>Bw,supportedPreparers:()=>$w});function $w(){return Object.keys(ro)}async function Bw(e,t={}){if(Uw.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(!qw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Lw.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 tr(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=ro[o];if(!s){let h=n.routes.find(x=>ro[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):"",k=[String(h?.message||h),x].filter(Boolean).join(" :: "),_=/allowance/i.test(k),w=!_&&/not enough|insufficient|balance/i.test(k),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: ${k}`):w?(A="taker-not-funded",O=`${o} refused to build the transaction: ${k}. 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: ${k}`);let b=n.routes.find(g=>ro[g.source]&&g.source!==o);return{ok:!1,reason:O,failureKind:A,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??Pw,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,y=m!=null&&f>0?Math.round(m/f*100):null;return Q({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:y},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,Pw,ro,Lw,qw,Uw,ld=I(()=>{rr();ge();it=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),Pw=100,ro={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(zn(),Tl)),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(),Yl)),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(()=>(_r(),Zi)),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(()=>(In(),Du)),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(()=>(Tn(),Ku)),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(()=>(qn(),ll)),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"}}};Lw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),qw=/^0x[0-9a-fA-F]{40}$/,Uw=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var dd={};M(dd,{prepareBestBridgeRoute:()=>Hw,supportedBridgePreparers:()=>jw});function jw(){return Object.keys(no)}async function Hw(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(!Fw.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Dw.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 Mr(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=no[s];if(!c){let h=i.routes.find(x=>no[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):"",k=[String(h?.message||h),x].filter(Boolean).join(" :: "),_=/allowance/i.test(k),w=!_&&/not enough|insufficient|balance/i.test(k),O=i.routes.find(A=>no[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: ${k}`:w?`${s} refused to build: ${k}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${k}`,failureKind:_?"approval-required-first":w?"taker-not-funded":"provider-error",...O?{alternative:O.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??Mw,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 y=[...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&&y.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),Q({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:y,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 Fw,Dw,Mw,no,pd=I(()=>{rr();ge();Fw=/^0x[0-9a-fA-F]{40}$/,Dw=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Mw=100,no={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Zn(),Qn)),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(()=>(_r(),Zi)),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 hd={};M(hd,{buildTwapSchedule:()=>md,normalizeTwapParams:()=>fd,prepareTwapChunk:()=>Xw,simulateTwap:()=>Yw});function fd(e={}){let t=Math.max(zw,Math.min(Vw,Number(e.splits)||Gw)),r=Math.max(.1,Number(e.windowHours)||Kw),n=Math.max(Ww,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 md(e){let t=fd(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 Xw(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 tr({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=Q(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 Yw(e,{quoteFn:t=tr,...r}={}){let n=md(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 zw,Vw,Ww,Gw,Kw,yd=I(()=>{rr();ge();zw=2,Vw=100,Ww=60,Gw=10,Kw=6});async function wd({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(!gd.has(Number(e))||!gd.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(`${bd}/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 xd(){try{return{ok:!0,chainCount:(await N(`${bd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var bd,gd,Ed=I(()=>{W();ge();bd="https://dln.debridge.finance/v1.0",gd=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function kd({active:e=!0}={},t={}){let r=Date.now();if(nr.size&&r-Sd<Jw)return[...nr.values()];try{let n=await N(`${Is}/exchange/currencies?active=${e?"true":"false"}`,t);nr.clear();for(let o of n??[])nr.set(String(o.ticker).toLowerCase(),o);return Sd=r,n??[]}catch(n){return nr.size?[...nr.values()]:{error:String(n.message||n).slice(0,200)}}}async function Qw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${Is}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function Zw(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(`${Is}/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 Ad({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Qw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Zw(e,t,s,{flow:n},o);if(a.error)return a;let c=await kd({},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 vd(){try{let e=await kd();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 Is,nr,Sd,Jw,Id=I(()=>{W();Is="https://api.changenow.io/v2",nr=new Map,Sd=0,Jw=6e5});async function _d({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(`${ex}/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 ex,Od=I(()=>{W();ex="https://api.squidrouter.com/v1"});async function Cd({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(`${tx}/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 tx,Td=I(()=>{W();tx="https://api.stargate.finance"});async function Nd({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(`${rx}/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 rx,Rd=I(()=>{W();rx="https://midgard.ninerealms.com/v2"});async function Pd({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(`${nx}/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 nx,$d=I(()=>{W();nx="https://api.socket.tech/v2"});async function Ld({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(`${ox}/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 ox,qd=I(()=>{W();ox="https://api.connext.network"});async function Ud({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(`${ix}/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 ix,Bd=I(()=>{W();ix="https://api.portalbridge.com/v1"});function sx(e,t){return`0x${Os.getAmountsOut}`+Oe(e)+Oe(64)+Oe(t.length)+t.map(jr).join("")}function ax(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 _s(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function cx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Cs)throw new Error(`slippageBps ${r} exceeds the ${Cs} 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 Fd(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:sx(i,s)},"latest"],a);return ax(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=_s(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=_s(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)),y=L.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(y=L.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=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:y,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=_s(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],y=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(y.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let h=cx(y.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)),k=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,_=k?`0x${Os.swapExactETHForTokens}`+Oe(h)+Oe(128)+jr(a)+Oe(x)+Oe(m.length)+m.map(jr).join(""):`0x${Os.swapExactTokensForTokens}`+Oe(s)+Oe(h)+Oe(160)+jr(a)+Oe(x)+Oe(m.length)+m.map(jr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:k?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Cs,deadline:x.toString()},requires:k?[]:[{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 Os,Oe,jr,Cs,Dd=I(()=>{ot();ft();Os={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Oe=e=>BigInt(e).toString(16).padStart(64,"0"),jr=e=>e.slice(2).toLowerCase().padStart(64,"0");Cs=100});function lx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Ns)throw new Error(`slippageBps ${r} exceeds the ${Ns} 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 Ts(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Hd(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Md.quoteExactInputSingle}`+Hr(s)+Hr(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=await Promise.all(ux.map(async p=>{let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);return{fee:p,amountOut:f?f.toString():null,out:f}})),d=null;for(let p of l)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:l.map(({fee:p,amountOut:f})=>({fee:p,amountOut:f}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=Ts(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(!jd.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=Ts(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(O=>String(O).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 y=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!y.best){let O=l.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 g=b.best.amountOut,S=Number(g*10000n/BigInt(s)),E=L.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return S<5e3?(E=L.FAIL,R=`round trip vs dollar book returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(E=L.CAUTION,R=`round trip vs dollar book returns ${(S/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:E,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:g.toString(),retentionBps:S,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:y.best.amountOut},c);if(!h.best){let O=l.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 g=b.best.amountOut,S=Number(g*10000n/BigInt(s)),E=L.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return S<5e3?(E=L.FAIL,R=`dollar-book round trip returns only ${(S/100).toFixed(2)}%`):S<9e3&&(E=L.CAUTION,R=`dollar-book round trip returns ${(S/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:E,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:g.toString(),retentionBps:S,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:y.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,k=Number(x*10000n/BigInt(s)),_=L.PASS,w="round trip completes with expected fee/impact loss";return k<5e3?(_=L.FAIL,w=`round trip returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(_=L.CAUTION,w=`round trip returns ${(k/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:_,reason:w,amountIn:String(s),bought:y.best.amountOut.toString(),returned:x.toString(),retentionBps:k,buyFee:y.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=Ts(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(!jd.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,y=lx(f.amountOut,u);if(y<=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${Md.exactInputSingle}`+Hr(i)+Hr(s)+Ct(m)+Hr(c)+Ct(a)+Ct(y)+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:y.toString(),slippageBps:u,maxSlippageBps:Ns,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 ux,Md,Ct,Hr,jd,Ns,zd=I(()=>{ot();ft();ux=[100,500,3e3,1e4],Md={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Hr=e=>e.slice(2).toLowerCase().padStart(64,"0"),jd=/^0x[0-9a-fA-F]{40}$/,Ns=100});function Vd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Wd(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 dx(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 Fn(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await hl(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 gl({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,oo.decimals,o).catch(()=>null),r(n,oo.symbol,o).catch(()=>null),r(n,oo.name,o).catch(()=>null),r(n,oo.totalSupply,o).catch(()=>null)]),u=Vd(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Wd(s?.result??s),name:Wd(a?.result??a),totalSupply:(Vd(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 Mn(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=Dn(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:wl(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 p=n;p<=o;p+=a){let f=Math.min(p+a-1,o);l.push([p,f])}let d=await qt(l,4,async([p,f])=>{let m={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${f.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let y=await Y(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));return{start:p,end:f,res:y}});for(let{start:p,end:f,res:m}of d){if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[p,f],error:m.error,evidence:U.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}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,u]=await Promise.all([this.resolveToken(n,o),this.resolvePools(n,o)]);if(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`}),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 Rs(e){let r={...dx(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Hd({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,Fd({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 oo,Gd=I(()=>{ot();Rr();W();ft();Dd();zd();ls();oo={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function io(){return zr.map(e=>Vn(Rs(e)))}function Kd(e){return Vn(Rs(e))}var zr,so=I(()=>{Gd();ft();zr=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 ep,getAddress as px,id as tp}from"ethers";function or(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function Ls(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function ao(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 Cx(e,t){try{return px(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Tx(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Zd(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Nx({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>kx)return"stale"}return"scoped"}function Rx(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 Px(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(or(r)){let a=Ls(Jd,o,Ax);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Xd.encodeFunctionData(d,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:Xd.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 or(r)&&ao(Jd,o,l,_x),l})();return n?.set(o,s),s}async function $x(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||mx,1),hx),o=await Fn(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:[fx,Tx(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}:${Zd(l)}`,{token:u,spender:Zd(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function Lx(e){return(xx[e]||[]).flatMap(r=>gx.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function qx(e,t,r={}){let n=[],o="direct-probe",i=null,s=Lx(e),a=$s(e),c=or(r)&&Ls(Ps,e,vx)?.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 $x(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},or(r)&&ao(Ps,e,!0,64)}catch{if(or(r)&&ao(Ps,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 qt(n,r.concurrency||4,async f=>{try{let m=await yl({chainId:e,token:f.token,owner:t,spender:f.spender},r),y=BigInt(m.allowance);if(y<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await Px(e,f.token,r,u),x=y>=Sx,k=yx[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:k,allowance:y.toString(),allowanceDisplay:Rx(y,h.decimals,x),unlimited:x,lastActivityAt:null,risk:Nx({unlimited:x,spenderLabel:k,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await Bx(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 Ux(e,t,r,n,o){try{let i=Yd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Yd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function $s(e){return(wx[e]||[]).flatMap(r=>bx.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function Bx(e,t,r){let n=$s(e);return n.length===0?[]:(await qt(n,r.concurrency||4,async i=>await Ux(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 rp(e={},t={}){let r=Cx(e.owner||e.address,"owner"),n=new Map(zr.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=or(t)&&!e.refresh;if(s){let f=Ls(Qd,i,Ix);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await qt(o,e.concurrency||3,f=>qx(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&&ao(Qd,i,p,Ox),{...p,cached:!1,cachedAgeMs:0}}var Xd,Yd,fx,RO,mx,hx,yx,gx,bx,wx,xx,Ex,Sx,kx,Ax,vx,Ix,_x,Ox,Jd,Ps,Qd,np=I(()=>{so();W();ot();Xd=new ep(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Yd=new ep(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),fx=tp("Approval(address,address,uint256)"),RO=tp("ApprovalForAll(address,address,bool)"),mx=1e4,hx=2e5,yx=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)"}),gx=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"}]),bx=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"}]),wx=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"}]}),xx=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}]}),Ex=(1n<<256n)-1n,Sx=Ex/2n,kx=4320*60*60*1e3,Ax=360*60*1e3,vx=600*1e3,Ix=45*1e3,_x=512,Ox=128,Jd=new Map,Ps=new Map,Qd=new Map});var sp={};M(sp,{aggregateBridgeQuotes:()=>op,bridgeAggregatorHealth:()=>Dx,checkRevokeNeeded:()=>ip,scanBridgeRoutes:()=>Fx});async function op(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=wd({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(g=>g.error?(f.push(`debridge: ${g.error}`),null):{provider:"debridge",amountOut:g.estimation?.dstChainTokenOut?.amount??g.estimation?.toAmount,feeUsd:g.estimation?.fixFee??g.fixFee,estimatedTime:g.estimation?.execution?.estimatedTransferTime?`${g.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:g}).catch(g=>(f.push(`debridge: ${g.message}`),null)),y=Mr({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(g=>!g||g.error?(f.push(`lifi: ${g?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:g.amountOut??g.quote?.amountOut,feeUsd:g.feeUsd??g.totalFee,estimatedTime:g.estimatedTime??g.duration??"unknown",preparable:!!g.transaction,raw:g}).catch(g=>(f.push(`lifi: ${g.message}`),null)),h=_d({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(g=>g.error?(f.push(`squid: ${g.error}`),null):{provider:"squid",amountOut:g.toAmount,feeUsd:Array.isArray(g.fee)?g.fee.reduce((S,E)=>S+(Number(E.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:g}).catch(g=>(f.push(`squid: ${g.message}`),null)),x=Cd({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(g=>g.error?(f.push(`stargate: ${g.error}`),null):{provider:"stargate",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"1-5 min",preparable:!1,raw:g}).catch(g=>(f.push(`stargate: ${g.message}`),null)),k=Nd({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(g=>g.error?(f.push(`thorchain: ${g.error}`),null):{provider:"thorchain",amountOut:g.expectedAmountOut,feeUsd:g.fees?.total,estimatedTime:g.estimatedTime||"10-30 min",preparable:!1,raw:g}).catch(g=>(f.push(`thorchain: ${g.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let g=await Ad({fromTicker:c,toTicker:u,fromAmount:s},t);return g.error?(f.push(`changenow: ${g.error}`),null):{provider:"changenow",amountOut:g.toAmount,feeUsd:g.networkFee,estimatedTime:g.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:g.kycRequired,raw:g}}catch(g){return f.push(`changenow: ${g.message}`),null}})(),w=Pd({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(g=>g.error?(f.push(`bungee: ${g.error}`),null):{provider:"bungee",amountOut:g.amountOut,feeUsd:g.feeUsd,estimatedTime:g.estimatedTime,preparable:!1,raw:g}).catch(g=>(f.push(`bungee: ${g.message}`),null)),O=Ld({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(g=>g.error?(f.push(`connext: ${g.error}`),null):{provider:"connext",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-20 min",preparable:!1,raw:g}).catch(g=>(f.push(`connext: ${g.message}`),null)),A=Ud({fromChain:r,toChain:n,token:o,amount:s},t).then(g=>g.error?(f.push(`wormhole: ${g.error}`),null):{provider:"wormhole",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-15 min",preparable:!1,raw:g}).catch(g=>(f.push(`wormhole: ${g.message}`),null)),b=await Promise.allSettled([m,y,h,x,k,w,O,A,_]);for(let g of b)g.status==="fulfilled"&&g.value&&p.push(g.value);return p.sort((g,S)=>{let E=Number(g.amountOut??0),R=Number(S.amountOut??0);return E!==R?R-E:g.preparable&&!S.preparable?-1:!g.preparable&&S.preparable?1:0}),{providers:p.map(g=>g.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function ip({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await rp({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 Fx(e={},t={}){let[r,n]=await Promise.all([op(e,t),ip({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 Dx(){let[e,t]=await Promise.all([xd().catch(r=>({ok:!1,error:r.message})),vd().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var oC,ap=I(()=>{rr();Ed();Id();Od();Td();Rd();$d();qd();Bd();np();oC=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var cp={};M(cp,{DYDX_API:()=>co,dydxHealth:()=>zx,dydxMarkets:()=>jx,dydxOrderbook:()=>Hx});function Vr(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Mx(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function jx(e=50,t={}){try{let r=await N(`${co}/v4/perpetualMarkets?limit=${e}`,t);return Mx(r).map(o=>{let i=Vr(o?.nextFundingRate),s=Vr(o?.oraclePrice),a=Vr(o?.openInterest),c=Vr(o?.volume24H),u=Vr(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&u!=null?u/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function Hx(e){try{let t=await N(`${co}/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 zx(){try{return{ok:!0,serverTime:(await N(`${co}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var co,up=I(()=>{W();co="https://indexer.dydx.trade"});var fp={};M(fp,{DRIFT_API:()=>dp,driftHealth:()=>Vx,driftMarkets:()=>pp});async function pp(e={}){try{let r=(await N(`${dp}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:lp,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${lp} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function Vx(){let e=await pp();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var dp,lp,mp=I(()=>{W();dp="https://dlob.drift.trade",lp="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified."});var gp={};M(gp,{VERTEX_API:()=>qs,vertexHealth:()=>Gx,vertexMarkets:()=>yp,vertexOrderbook:()=>Wx});async function yp(e={}){try{let r=(await N(`${qs}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:hp,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${hp} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function Wx(e){try{let r=(await N(`${qs}/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),quality:"FAILED"}}}async function Gx(){let e=await yp();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var qs,hp,bp=I(()=>{W();qs="https://gateway.prod.vertexprotocol.com/v2",hp="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified."});var wp={};M(wp,{pancakeHealth:()=>Yx,pancakeQuote:()=>Xx});async function Xx({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(`${Kx}/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 Yx(){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 Kx,xp=I(()=>{W();Kx="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Sp={};M(Sp,{sushiHealth:()=>Zx,sushiQuote:()=>Qx});async function Qx({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(`${Jx(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 Zx(){try{return{ok:!0,chains:Object.keys(Ep).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Jx,Ep,kp=I(()=>{W();Jx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${Ep[e]||"ethereum"}`,Ep={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 Ap={};M(Ap,{raydiumHealth:()=>rE,raydiumQuote:()=>tE});async function tE({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(`${eE}/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 rE(){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 eE,vp=I(()=>{W();eE="https://quote-api.jup.ag/v6"});var Ip={};M(Ip,{AEVO_API:()=>Us,aevoHealth:()=>oE,aevoMarkets:()=>nE});async function nE(e={}){try{return(await N(`${Us}/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 oE(){try{return{ok:(await N(`${Us}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Us,_p=I(()=>{W();Us="https://api.aevo.xyz"});var Op={};M(Op,{compoundHealth:()=>aE,compoundMarkets:()=>sE});async function sE(e={}){try{return((await N(`${iE}/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 aE(){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 iE,Cp=I(()=>{W();iE="https://api.compound.finance/api/v2"});var Tp={};M(Tp,{yearnHealth:()=>lE,yearnVaults:()=>uE});async function uE(e={}){try{return(await N(`${cE}/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 lE(){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 cE,Np=I(()=>{W();cE="https://api.yearn.fi/v1"});var Rp={};M(Rp,{convexHealth:()=>fE,convexPools:()=>pE});async function pE(e={}){try{return(await N(`${dE}/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 fE(){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 dE,Pp=I(()=>{W();dE="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 uo(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 Wr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*uo(t-e.scale),t):Ye(e.mantissa/uo(e.scale-t),t)}function Bs(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Wr(e,r),Wr(t,r),r]}function yt(e,t){let[r,n,o]=Bs(e,t);return Ye(r.mantissa+n.mantissa,o)}function Gr(e,t){let[r,n,o]=Bs(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*uo(t.scale+r),o=t.mantissa*uo(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=Bs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var hC,Ce=I(()=>{hC=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Lp,readFileSync as mE}from"node:fs";import{dirname as $p,join as Fs}from"node:path";import{fileURLToPath as hE}from"node:url";function yE(e){let t=$p(hE(e));for(let r=0;r<8;r+=1){let n=Fs(t,"package.json");if(Lp(n))try{let i=JSON.parse(mE(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=$p(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function qp(e,t){let r=yE(t),n=Fs(r,e);return Lp(n)?n:Fs(r,"dist","assets",e)}var Up=I(()=>{});import{readFileSync as gE,existsSync as bE}from"node:fs";import{fileURLToPath as wE}from"node:url";import{dirname as xE,join as Fp}from"node:path";function SE(){try{let e=qp("equities-fixtures",import.meta.url);if(e&&bE(e))return e}catch{}return EE}function AE(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){AE(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 Je(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 vE(e,t){oe(e,t,"root"),Je(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 IE(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 _E(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Je(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 OE(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)=>Je(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 CE(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"])Je(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 TE(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 NE(e,t){oe(e,t,"root"),Je(e.capturedAt,t,"capturedAt"),Je(e.block,t,"block"),Je(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 RE(e,t){oe(e,t,"root"),Je(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 PE(e,t){oe(e,t,"root"),Je(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 $E(e,t){oe(e,t,"root"),Je(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 qE(e,t){let r=Dp[t],n=Fp(e,r),o;try{o=gE(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 LE[t](i,r),i}function Mp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Mp(t)}return e}function Ds({fixtureDir:e=kE}={}){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(Dp))t[r]=qE(e,r);return Mp(t)}function st(){return Bp??=Ds(),Bp}function Ie(){return st().venues}function jp(){return st().universe}function Hp(){return st().oracles}function zp(){return st().nyseHolidays}function Vp(){return st().dstTransitions}function lo(){return st().rhPoolState}function Wp(){return st().solanaXstocks}function Gp(){return st().tonXstocks}function Kp(){return st().hip3L2Books}var EE,kE,Dp,LE,Bp,Be=I(()=>{Up();EE=Fp(xE(wE(import.meta.url)),"fixtures");kE=SE(),Dp=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"});LE=Object.freeze({venues:vE,universe:IE,oracles:_E,nyseHolidays:OE,dstTransitions:CE,equityDexPools:TE,rhPoolState:NE,solanaXstocks:PE,tonXstocks:$E,hip3L2Books:RE})});function FE(){let e=Vp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*js,endMs:n.endUtc*js}));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 rf(){return Yp??=FE(),Yp}function DE(){return Ms===void 0&&(Ms=new Set(zp().holidayDayIndex)),Ms}function nf(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function ME(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=rf();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 jE(e){for(let t of rf().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function HE(e){return jE(e)?BE:UE}function zE(e){let t=e+HE(e),r=Math.floor(t/Xp),n=t-r*Xp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Jp),msIntoDay:n,weekday:o.getUTCDay()}}function VE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!DE().has(e)}function WE(e){return e<Qp?"dark":e<Zp?"extended":e<ef?"core":e<tf?"extended":"dark"}function Kr(e){nf(e,"sessionState"),ME(e,"sessionState");let t=zE(e);return VE(t)?WE(t.minuteOfDay):"dark"}function zs(e){return nf(e,"isDark"),Kr(e)==="dark"}var js,Jp,Hs,Xp,UE,BE,Qp,Zp,ef,tf,_C,OC,Yp,Ms,po=I(()=>{Be();js=1e3,Jp=60*js,Hs=60*Jp,Xp=24*Hs,UE=-5*Hs,BE=-4*Hs,Qp=240,Zp=570,ef=960,tf=1200,_C=Object.freeze([Qp,Zp,ef,tf]),OC=Object.freeze(["core","extended","dark"])});function mo(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function XE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function YE(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function of(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function ho(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??GE,o=t.oracleFreshnessMs??KE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(XE(c)){i?s.push(Object.freeze({...c,staleData:!0})):mo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:fo.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(YE(c)){mo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:fo.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(of(c,r,n)){mo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:fo.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=Kr(r),l=u==="core"?o:o*2;if(of(c,r,l)){mo(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:fo.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var fo,GE,KE,Vs=I(()=>{Ce();po();fo=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),GE=12e4,KE=6e5});function JE(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(JE(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=I(()=>{Ce()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function cf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){cf(e)||Z(t,"must be an object")}function uf(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function ir(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function Xr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Gs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function Ws(e,t,r=!1){e===null&&r||(cf(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 yo(e,t,r=!1){e===null&&r||Rt(e,t)}function af(e,t){Rt(e,t),ir(e.venue,`${t}.venue`),ir(e.reason,`${t}.reason`),oS.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&ir(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...sf,"costAccounted","capturedAt","blockOrSeq","raw"])uf(e,r,"quote");ir(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"),Xr(e.instrument,QE,"quote.instrument"),Xr(e.tier,ZE,"quote.tier"),ir(e.symbolRaw,"quote.symbolRaw"),ir(e.symbol,"quote.symbol"),Xr(e.side,eS,"quote.side"),Ws(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of nS)Object.hasOwn(e,r)&&(Ws(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of sf)Ws(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"),Gs(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 go(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])uf(e,t,"rankResult");return Xr(e.rankedOn,tS,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>yo(t,`rankResult.ranked[${r}]`)),yo(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)=>yo(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"),Gs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Gs(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)=>af(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>af(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),Xr(e.instrumentMix,rS,"rankResult.instrumentMix"),yo(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var QE,ZE,eS,tS,rS,nS,sf,oS,at=I(()=>{QE=new Set(["spot","perp"]),ZE=new Set(["read-only","quote-only","prepare","intent"]),eS=new Set(["buy","sell"]),tS=new Set(["net-of-cost","gross"]),rS=new Set(["homogeneous","heterogeneous"]),nS=["bid","ask","mid","mark"],sf=["fees","gasEstimate","priceImpact","fundingHourly"],oS=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function lf(){return Ie().venues.arcus}function cS(){return Object.keys(lf().markets).sort()}function uS({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=lf().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:iS,chain:sS,instrument:"perp",tier:aS,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:bo,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 wo({side:e="buy",sizeUsd:t=null}={}){return cS().map(r=>uS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var iS,sS,aS,bo,Ks=I(()=>{Be();Nt();Ce();at();iS="arcus_perp",sS="robinhood-4663",aS="quote-only",bo="0.00000480324074074"});function Xs(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 pf(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=lS(n,t),c=t-a,u=F(bo),l=Xs(i,c),d=Xs(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:bo,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=Xs(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 lS(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)zs(e+o*df)&&(r+=1);return t>n&&zs(e+n*df)&&(r+=t-n),r}var df,VC,ff=I(()=>{Ce();Ks();po();df=36e5,VC=24*365});function dS(e){return e.mid??e.mark??e.ask??e.bid??null}function pS(e){let t=dS(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 fS(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 mS(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=Gr(t.net,e.net);return Ue(ve(r,we(10000n,0)),t.net,4)}function xo(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=ho(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 g=pS(b);if(g===null)continue;let S=null;if(u&&b.instrument==="perp"&&(S=pf(b,c,{nowMs:r}),S.carryBps!==null)){let E=yt(F("1"),Ue(S.carryBps,we(10000n,0),12));g.net=ve(g.net,E),g.costAccounted=!1}l.push(fS(b,g,S))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let b=l.filter(S=>S.instrument==="spot"),g=l.filter(S=>S.instrument==="perp");b.length>0&&g.length>0?(d=b.length>=g.length?b:g,p="homogeneous"):(d=l,p="homogeneous")}d.sort((b,g)=>{let S=gt(b.net,g.net);return S!==0?S:b.venue<g.venue?-1:b.venue>g.venue?1:0});let f=d[0]??null,m=d.slice(1),y=d,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let x=m.length===0?null:mS(f,m[0]),k=l.find(b=>b.tier==="prepare")??null,_=Kr(r),w=_==="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=hS(l));let A={rankedOn:h,ranked:y,winner:f,runnersUp:m,improvementBps:x===null?null:Number(qe(x)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:f?.carry??null,breakEvenHorizonHours:O};return go(A)}function hS(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=Gr(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 Ys=I(()=>{Vs();ff();po();Ce();at()});function Js(){return lo()}function ES(e){return{mantissa:e*e*10n**BigInt(sr)/wS,scale:sr}}function SS(e){let t=ES(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),sr);return o.mantissa===0n?null:Ue(F("1"),o,sr)}return Ue(ve(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),sr)}function kS(e){let t=Hp(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function AS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,vS(r,t),sr)}function vS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Wr(e,r).mantissa+Wr(t,r).mantissa,scale:r}}function IS(e){let t=Js(),r=xS[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Qs(){return Object.keys(Js().pools).sort()}function ar({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=Js(),o=n.pools[e];if(!o)return null;let i=SS(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"):AS(s,a),l=IS(o.version),f={venue:yS,chain:gS,instrument:"spot",tier:bS,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=kS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=qe(Ue(ve(Gr(i,m),we(10000n,0)),m,4))),xe(f)}function mf({side:e="buy",sizeUsd:t=null}={}){return Qs().map(r=>ar({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var yS,gS,bS,wS,sr,xS,Zs=I(()=>{Be();Nt();Ce();at();yS="rh_uniswap",gS=4663,bS="prepare",wS=1n<<192n,sr=18,xS=Object.freeze({v3:180000n,v4:240000n})});function Eo(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=ar({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>hf)throw new Error(`quote is stale (${a}ms old, bound ${hf}ms); re-quote before preparing`);let u=lo().pools[t],l=u.version==="v4"?OS:_S,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 hf,_S,OS,ea=I(()=>{Zs();Be();hf=12e4,_S="0x0000000000000000000000000000000000000000",OS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Yr(){return Ie().venues.hyperliquid_hip3}function yf(){return Object.keys(Yr().dexs).sort()}function RS(){let e=[];for(let[t,r]of Object.entries(Yr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function PS(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=Yr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Yr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function $S(e,t){try{return Kp().books[`${e}:${t}`]??null}catch{return null}}function LS(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 qS(e,t,r,n){let o=LS(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 gf({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=$S(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let h=qS(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 y={venue:CS,chain:TS,instrument:"perp",tier:NS,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&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(y.bid=F(String(l.bids[0].px)),y.ask=F(String(l.asks[0].px))),xe(y)}function bf({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=PS(e);return n.length===0||n.length>1?null:gf({...n[0],side:t,size:r})}function So({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of RS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Yr().dexs[i][s];n.push(gf({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var CS,TS,NS,wf=I(()=>{Be();Nt();Ce();at();CS="hyperliquid_hip3",TS="hyperliquid",NS="quote-only"});function xf(){return Ie().venues.arcus_spot}function DS(){return Object.keys(xf().pairs).sort()}function MS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=xf().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:US,chain:BS,instrument:"spot",tier:FS,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 ko({side:e="buy",sizeUsd:t=null}={}){return DS().map(r=>MS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var US,BS,FS,Ef=I(()=>{Be();Nt();Ce();at();US="arcus_spot",BS="robinhood-4663",FS="quote-only"});function Ao(){return Wp()}function ta(){return Object.keys(Ao().tokens).sort()}function VS(e){let t=Ao().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function WS(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 return null;let s=i[n],a=VS(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"):WS(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=Sf&&(p=!1);let f={venue:jS,chain:HS,instrument:"spot",tier:zS,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ao().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)<Sf}};return xe(f)}function kf({side:e="buy",sizeUsd:t=null}={}){return ta().map(r=>ra({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var jS,HS,zS,Sf,Af=I(()=>{Be();Nt();Ce();at();jS="solana_xstocks",HS="solana",zS="quote-only",Sf=25e3});function vo(){return Gp()}function na(){return Object.keys(vo().tokens).sort()}function QS(e){let t=vo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function ZS(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 oa({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=vo().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=QS(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"):ZS(u,l),f={venue:GS,chain:KS,instrument:"spot",tier:XS,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:vo().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)<YS,impactSizeFractionHint:JS}};return xe(f)}function vf({side:e="buy",sizeUsd:t=null}={}){return na().map(r=>oa({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var GS,KS,XS,YS,JS,If=I(()=>{Be();Nt();Ce();at();GS="ton_stonfi",KS="ton",XS="quote-only",YS=25e3,JS=.01});var Io={};M(Io,{bestEquityRoute:()=>ek,collectEquityQuotes:()=>Of,equityVenues:()=>tk,getUniverse:()=>jp,getVenues:()=>Ie,loadFixtures:()=>Ds,prepareEquity:()=>Eo,prepareEquityRoute:()=>rk,rankEquityQuotes:()=>xo,toJsonSafe:()=>nk,validateQuote:()=>xe,validateRankResult:()=>go});function ia(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function Of(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=ia(t),o=[],i=bf({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 wo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of ko({sizeUsd:n}))u.symbol===r&&o.push(u);let s=ar({symbol:r,sizeUsd:n});s&&o.push(s);let a=ra({symbol:r,sizeUsd:n});a&&o.push(a);let c=oa({symbol:r,sizeUsd:n});return c&&o.push(c),o}function ek(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=ia(e.sizeUsd??e.size??null),n=Of(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=xo(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>_f}}function tk(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:So().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:wo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:ko().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Qs().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:ta().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:na().length}],t=[...So(),...wo(),...ko(),...mf(),...kf(),...vf()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=ho(t,{nowMs:r});return{inventory:e,hip3Dexs:yf(),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 rk(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=ia(e.sizeUsd??e.size??null),o=ar({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=Eo({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>_f}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function nk(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var _f,_o=I(()=>{Ce();Ys();ea();Vs();wf();Ef();Ks();Zs();Af();If();Be();Ys();ea();at();Be();_f=3600*1e3});var Oo={};M(Oo,{CHAIN_CONFIGS:()=>zr,EVIDENCE:()=>U,RISK:()=>L,SCANNER_CAPABILITIES:()=>Qt,__clearScanners:()=>ew,createScanner:()=>Bl,getScanner:()=>fs,listScanners:()=>Fl,registerBuiltinScanners:()=>io,registerCustomChain:()=>Kd,registerScanner:()=>Vn,scannerCoverage:()=>tw,validateScanner:()=>Ul});var Co=I(()=>{ft();so()});var ca={};M(ca,{createWatch:()=>ck,listWatches:()=>ak,removeWatch:()=>uk});import Jr from"node:fs";import sa from"node:path";import{randomUUID as ok}from"node:crypto";import{homedir as ik}from"node:os";function sk(e=process.env){return e.ORACLE_CONFIG_DIR||sa.join(ik(),".config","oracle")}function Cf(e=process.env){return sa.join(sk(e),"watches.json")}function aa(e=process.env){let t=Cf(e);if(!Jr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Jr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Tf(e,t=process.env){let r=Cf(t);Jr.mkdirSync(sa.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Jr.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
9
|
+
`,{mode:384}),Jr.renameSync(n,r)}function ak(e=process.env){return aa(e).watches}function ck({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:ok(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=aa(o);return s.watches.push(i),Tf(s,o),i}function uk(e,t=process.env){let r=aa(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Tf({watches:n},t),!0)}var ua=I(()=>{});var Nf={};M(Nf,{classifyReceipt:()=>lk});function lk(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 Rf=I(()=>{});function hk(e){return!(mk.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Pf(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
10
|
+
`),n=[...new Set((r.match(dk)||[]).map(i=>i.toLowerCase()))].filter(i=>!fk.has(i)),o=[...new Set(r.match(pk)||[])].filter(hk);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function $f(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(`
|
|
11
|
+
`)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var dk,pk,fk,mk,Lf=I(()=>{dk=/\b0x[a-fA-F0-9]{40}\b/g,pk=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,fk=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),mk=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as yk}from"node:child_process";import qf from"node:fs";import la from"node:path";function xk(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Ff(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Ek(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return la.isAbsolute(t)?qf.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(la.delimiter)){if(!n)continue;let o=la.join(n,"xurl");try{if(qf.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 Sk(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 kk(e){for(let t of e){let r=String(t);if(Bf.includes(r))return r;if(Bf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function Ak(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=kk(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(!Ff(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(!bk.includes(o))if(wk.includes(o)){if(!Ff(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 Df(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!xk(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=Ak(t,n);if(!o.ok)return o;let i=Ek(n);if(!i.ok)return i;let a=(r.spawnFn||yk)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Uf,maxBuffer:1024*1024,env:Sk(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Uf}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(d,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,gk),{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 Uf,gk,bk,wk,Bf,o2,Mf=I(()=>{Qo();Uf=45e3,gk=4e4,bk=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),wk=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Bf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);o2=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 Ok(e){return!e||e==="0x"||e===_k}async function jf(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(y){return{address:n,chainId:o,status:"unavailable",error:y?.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[y,h]of Object.entries(vk))c.includes(y)&&a.push({selector:`0x${y}`,...h});let u=!1,l=null,d=null,p=await Promise.all(Ik.map(async({label:y,slot:h})=>{try{let x=await r(o,"eth_getStorageAt",[n,h,"latest"],t);return{label:y,word:x,error:null}}catch{return{label:y,word:null,error:`proxy slot (${y}) unreadable; proxy status uncertain`}}}));for(let y of p)y.error&&s.push(y.error),!u&&y.word&&!Ok(y.word)&&(u=!0,l=y.label,d=`0x${String(y.word).slice(-40)}`);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 m=a.filter(y=>y.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:m,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var vk,Ik,_k,Hf=I(()=>{ot();vk=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"}}),Ik=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),_k=`0x${"0".repeat(64)}`});function To(e,t){let r=String(e||"").trim();if(!Ck.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function da(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 Qr(e,t){return e==null||e===""?null:da(e,t)}function Nk({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=To(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=da(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Qr(l.gasLimit??c.gasLimit,"gasLimit"),y=Qr(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!y)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)),k=Ki({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:x,secret:u.routeAttestationSecret}),_=Ae(k,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),w={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:y,slippageBps:_.selectedBps,expiresAtMs:h+x},O=Qr(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(w.maxPriorityFeePerGas=O),c.nonce!==void 0&&(w.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(w.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(w.l1FeeWei=Qr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(w.operatorFeeWei=Qr(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:_.selectedBps,expiresAtMs:h+x,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[w]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function Rk(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}io();let r=fs(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function Pk({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 zf(e={},t={}){let r=Number(e.chainId??Tk);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=To(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?To(e.tokenIn,"tokenIn"):null,i=e.recipient?To(e.recipient,"recipient"):null,s=e.amountIn==null?null:da(e.amountIn,"amountIn"),a=Rk(r,t.scanner),c=t.scanContractRisk||jf,[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 y={...e,tokenIn:o,amountIn:s,recipient:i},h=Pk({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:y,scanner:a}),x=null,k=null,_=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{k=Nk({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){_=String(w?.message||w).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!k,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:k,localSignerBlockedReason:_,signed:k?"pending-local-signer":!1,broadcast:k?"pending-local-signer":!1}}var Ck,Tk,Vf=I(()=>{so();ft();Re();Hf();Ck=/^0x[0-9a-fA-F]{40}$/,Tk=4663});var Yf={};M(Yf,{evaluateContracts:()=>Xf,fetchAccountTweets:()=>Kf,snipeExecuteEnabled:()=>Wf,tickTwitterCaWatch:()=>Fk,twitterSnipeEmitsCard:()=>Dk});function Wf(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Gf(e){return String(e||"").trim().replace(/^@/,"")}async function Kf({handle:e,limit:t=5,xurlFn:r=Df}={},n={}){let o=Gf(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:$f(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function Uk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await zf({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 Bk(e,t){let r=await El(e,{chainSlug:"solana",stables:[Lk,qk]},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 Xf(e,t={},r={}){let n=Number(t.chainId??$k),o=[];for(let i of e.evm||[])o.push(await Uk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await Bk(i,r));return o}async function Fk(e={},t={}){let r=Gf(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Kf({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=Pf(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||Xf)(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:Wf(t.env||process.env),hits:i,seen:[...n]}}function Dk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var $k,Lk,qk,Jf=I(()=>{Lf();Mf();Vf();Rr();cn();$k=4663,Lk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",qk="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as Mk}from"ethers";function Vk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return zk.has(t.length)&&t.every(r=>Mk.en.getWordIndex(r)>=0)}function Xk(e){let t=Qf(e);return Kk.has(t)||Gk.test(t)}function Qf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Yk(e){let t=Qf(e);return[...jk].some(r=>t.includes(r))}function Jk(e,t,r){if(typeof t=="string"){if(Hk.some(n=>n.test(t))||Vk(t))throw new Zr(r);if(Wk.test(t)&&!Xk(e))throw new Zr(r)}}function pa(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Jk(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)=>pa(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(Yk(o))throw new Zr(i);e[o]!==void 0&&(n[o]=pa(e[o],i,o))}return n}function cr(e){return pa(e)}var jk,Hk,zk,Wk,Gk,Kk,Zr,fa=I(()=>{jk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Hk=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],zk=new Set([12,15,18,21,24]);Wk=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Gk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Kk=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Zr=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 Qk,chmod as No,readFile as Zk,rename as eA,writeFile as tA}from"node:fs/promises";import{homedir as rA}from"node:os";import{dirname as Zf,join as ma}from"node:path";import nA 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 em(e){if(!oA.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function Ro(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Po(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function tm(e={}){let t=e.path||aA;await Qk(Zf(t),{recursive:!0,mode:448}),await No(Zf(t),448);let r;try{r=await Zk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await nA(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
10
12
|
PRAGMA foreign_keys=ON;
|
|
11
13
|
CREATE TABLE IF NOT EXISTS artifacts (
|
|
12
14
|
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
|
|
@@ -18,9 +20,9 @@ var Wm=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(
|
|
|
18
20
|
CREATE TABLE IF NOT EXISTS action_receipts (
|
|
19
21
|
artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
|
|
20
22
|
);
|
|
21
|
-
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await Vk(l,Buffer.from(o.export()),{mode:384}),await To(l,384),await zk(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=Yf(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"):(Yf(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(!Xk.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 ma,Kk,Xk,Yk,Qk,Jf=v(()=>{pa();ma=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Kk=new Set(ma),Xk=new Set(ma.slice(0,-1).map((e,t)=>`${e}:${ma[t+1]}`)),Yk=fa(process.env.ORACLE_CONFIG_DIR||fa(Wk(),".config","oracle"),"workspace"),Qk=fa(Yk,"artifacts.sqlite")});import{createHash as Zf}from"node:crypto";function Zk(e){return Jk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ha(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ha).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ha(e[t])}`).join(",")}}`}function eA(e){return Zf("sha256").update(String(e)).digest("hex")}function em(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(Zk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function tm(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 tA(e={}){let t=em(e.url??e.sourceUrl),r=tm(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 rm(e={}){let t=em(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=tm(e.fetchedAt),s=eA(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(tA),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:${Zf("sha256").update(ha(c)).digest("hex")}`,...c})}var Jk,nm=v(()=>{pa();Jk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function om(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Jr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ga(e,t){return t>0?Jr(e/t*100):null}function ba(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function oA(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=om(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||nA.has(n.toUpperCase())})}function iA(e){let t=[],r=ba(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=om(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 sA(e,t){let r=ba(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ya(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:Jr(i),percentOfKnown:ga(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function im(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=oA(t.labels??t.addressBook??e.labels??e.addressBook),o={...rA,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((S,R)=>{if(!S||typeof S!="object")return;let I=sA(S,R);s.has(I)?a+=1:(s.add(I),i.push(S))});let c=i.flatMap(iA),u=c.filter(S=>S.usdValue!=null),l=c.filter(S=>S.usdValue==null),d=i.reduce((S,R)=>S+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Jr(u.reduce((S,R)=>S+R.usdValue,0)),f=l.length+d,m=ya(u,"chain",p),g=ya(u,"venue",p),h=ya(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 x=Jr(u.filter(S=>S.stablecoin).reduce((S,R)=>S+R.usdValue,0)),E=c.filter(S=>S.kind==="nft"),O=i.reduce((S,R)=>S+Number(R.valuation?.nftUnvaluedItems||0),0),w=E.filter(S=>S.usdValue==null).length+O,_=E.filter(S=>S.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(ba).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:k?.name??null,topAssetPercent:k?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:x,percentOfKnown:ga(x,p),high:p>0&&ga(x,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||O?w?"partial":"valued":"not-observed",valuedItems:_,unvaluedItems:w,knownUsd:Jr(E.filter(S=>S.usdValue!=null).reduce((S,R)=>S+R.usdValue,0))},addresses:A,warnings:[...new Set(y)]}}var rA,nA,sm=v(()=>{rA=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),nA=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function am(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function lm(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function aA(e){return Number.isFinite(Number(lm(e)))}function cm(e){return pe(lm(e),0)}function cA(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=dm(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>aA(o))?r.sort((o,i)=>cm(o.row)-cm(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function dm(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"?dm(o):Lo(o);r.has(i)?(n+=1,t!=="fill"&&am(o)>am(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 uA(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 lA(e,t){return t.get(Lo(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function dA(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(um(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 pm(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=uA(a.rows),u=[],l=0,d=0;for(let A of[...o.rows,...i.rows]){let S=lA(A,c),R=pe(A.quantity??A.amount??A.size),I=S?pe(S.priceUsd??S.price,NaN):pe(A.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let $=R*I,q=pe(S?.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,S)=>A+S.valueUsd,0),f=u.filter(A=>A.kind==="position"),m=f.reduce((A,S)=>A+S.valueUsd,0),g=f.reduce((A,S)=>A+Math.abs(S.valueUsd),0),h=p+m,x=pe(e.equityUsd,h),E=dA(cA(e.fills||[])).realizedPnlUsd,O=f.reduce((A,S)=>{let R=pe(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return A+S.quantity*(S.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,S)=>A+S,0),k=[...w].map(([A,S])=>({asset:A,exposureUsd:De(S),percent:_?De(S/_*100):null})).sort((A,S)=>S.exposureUsd-A.exposureUsd||A.asset.localeCompare(S.asset)),b=u.reduce((A,S)=>A+Math.abs(S.valueUsd),0),y=im({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:E,unrealizedUsd:De(O),totalUsd:De(E+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,um,Lo,fm=v(()=>{sm();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,um=e=>e.address??e.owner??e.account,Lo=e=>[ce(e.chain??e.chainId),ce(um(e)),ce(Me(e)),ce(e.source)].join("|")});var S2,k2,A2,mm=v(()=>{S2=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),k2=Object.freeze(["read","simulate"]),A2=1440*60});function hm(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return pA.test(t)||fA.includes(r)}function Pt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=hA.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of mA)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Zr(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"&&hm(o))throw new Zr(`${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(hm(o))throw new Zr(`${t}.${o}`,"forbidden-key-name");Pt(i,`${t}.${o}`,r,o)}return e}var Zr,pA,fA,mA,hA,ym=v(()=>{mm();Zr=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}},pA=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,fA=Object.freeze(["privkey","wif","xprv","seed"]);mA=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}]),hA=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as yA}from"node:crypto";function xa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(xa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xa(e[t])}`).join(",")}}`}function gA(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 Ea(e,t="fact"){try{Pt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function wm(e){return yA("sha256").update(xa(e)).digest("hex")}function xm({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:gA(r)};return qo({...s,hash:wm(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");Ea(t,"intent");let n=xm({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 Em(e,t,r,n={}){if(Sa(e),!(gm[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`);Ea(r,t);let i=n.external===!0||n.externallySupplied===!0;if(bm.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=xm({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(wm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Ea(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&&!gm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(bm.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 wa,gm,bm,ka=v(()=>{ym();wa=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),gm=Object.freeze(Object.fromEntries(wa.map((e,t)=>[e,Object.freeze(t+1<wa.length?[wa[t+1]]:[])]))),bm=new Set(["signed","broadcast"])});function Sm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return bA[t]??t}function wA(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Sm(e)}:${t}`)}function Te(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Bo(r)})}function xA(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(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 EA(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(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 SA(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(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 kA(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(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 AA(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Te(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Te(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function IA(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=Sm(o),a=wA(o,i),c=vA[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=IA(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)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&E.push("LOW_COVERAGE","NO_TRADE"),x<.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:x,coverage:d,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 U2,bA,fe,Ee,Bo,vA,Aa=v(()=>{U2=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),bA=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;vA=Object.freeze({wallet:xA,pool:EA,nft_floor:SA,hl_flow:kA,prediction_market:AA})});function _A(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 OA(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 km(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=_A(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(OA(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 Am=v(()=>{Aa();ka()});function vm(e){let t=TA[Number(e)]||[];return new Set([...t,...CA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var CA,TA,Im=v(()=>{CA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],TA={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 va(e){e&&(e.prepareAttempted=!0)}function Ia(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 PA(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?[...vm(o)]:[];return new Set([...n,...i])}function LA(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 qA(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function UA(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 BA(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 FA(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 NA)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of RA)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,qA(e)){let o=UA(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=$A.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=PA(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(LA(e)){let o=BA(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 _a(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=FA(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var NA,RA,$A,_m=v(()=>{Im();Re();NA=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),RA=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),$A=/^0x[a-fA-F0-9]{40}$/});var Cm={};M(Cm,{DESK_TOOLS:()=>MA,runDeskTool:()=>HA});function jA(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")>DA)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 HA(e,t,r={}){if(jA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>Om)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||rm)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||pm)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Uo,o=r.advanceTradeLifecycle||Em,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"){va(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=_a(t.lifecycle,s?.fact||{});if(!a.ok)return Ia(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"){va(r.loopVerifier);let a=_a(t.lifecycle,t.fact);if(!a.ok)return Ia(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||km)(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||Qf,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Je(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Je(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Je(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Je(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var DA,Om,Mo,Lt,en,MA,Tm=v(()=>{Jf();nm();fm();ka();Aa();Am();_m();DA=128*1024,Om=5e4,Mo={type:"string",minLength:1,maxLength:256},Lt={type:"object",additionalProperties:!0},en=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),MA=Object.freeze([en("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}),en("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:Om},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}),en("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}),en("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}),en("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 Nm={};M(Nm,{deployGloballyEnabled:()=>VA,executeGloballyEnabled:()=>zA,mevExecuteEnabled:()=>WA});function zA(){return on("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function VA(){return on("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function WA(){return on("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var Rm=v(()=>{sn()});sn();import $m from"node:fs";import Oa from"node:process";import{fileURLToPath as GA}from"node:url";import{createInterface as Km}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}),Xm=/^[A-Za-z0-9_-]{1,64}$/;function an(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 Ym(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Qm(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ze.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!Xm.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 Jm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Zm(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 eh(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=eh(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=Qm(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=Jm(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!Ym(l))return de(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,an(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 an(d,{});if(!c)return de(d,-32002,"server not initialized");if(l.method==="tools/list")return an(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 Zm(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return an(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():"",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(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 E&&!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 Ba(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=Km({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,
|
|
23
|
-
`);for(let
|
|
23
|
+
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await tA(l,Buffer.from(o.export()),{mode:384}),await No(l,384),await eA(l,t),await No(t,384)};return s=s.then(u,u),s}r?await No(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=em(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=cr(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()?Po(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"):(em(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),Ro(l).map(Po)},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=Ro(d),f=p.find(y=>y.id===String(u)),m=p.find(y=>y.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!iA.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)]),Ro(l).map(Po)},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)]),Ro(l).map(Po)},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=cr(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 ha,oA,iA,sA,aA,rm=I(()=>{fa();ha=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),oA=new Set(ha),iA=new Set(ha.slice(0,-1).map((e,t)=>`${e}:${ha[t+1]}`)),sA=ma(process.env.ORACLE_CONFIG_DIR||ma(rA(),".config","oracle"),"workspace"),aA=ma(sA,"artifacts.sqlite")});import{createHash as nm}from"node:crypto";function uA(e){return cA.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ya(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ya).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ya(e[t])}`).join(",")}}`}function lA(e){return nm("sha256").update(String(e)).digest("hex")}function om(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(uA(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function im(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 dA(e={}){let t=om(e.url??e.sourceUrl),r=im(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(cr({url:t,fetchedAt:r,contentHash:n}))}function sm(e={}){let t=om(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=im(e.fetchedAt),s=lA(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(dA),c=cr({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${nm("sha256").update(ya(c)).digest("hex")}`,...c})}var cA,am=I(()=>{fa();cA=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function cm(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function en(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ba(e,t){return t>0?en(e/t*100):null}function wa(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function mA(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=cm(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||fA.has(n.toUpperCase())})}function hA(e){let t=[],r=wa(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=cm(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 yA(e,t){let r=wa(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ga(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:en(i),percentOfKnown:ba(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function um(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=mA(t.labels??t.addressBook??e.labels??e.addressBook),o={...pA,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((E,R)=>{if(!E||typeof E!="object")return;let v=yA(E,R);s.has(v)?a+=1:(s.add(v),i.push(E))});let c=i.flatMap(hA),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=en(u.reduce((E,R)=>E+R.usdValue,0)),f=l.length+d,m=ga(u,"chain",p),y=ga(u,"venue",p),h=ga(u,"symbol",p);for(let E of m)E.chain=E.name;for(let E of y)E.venue=E.name;for(let E of h)E.asset=E.name,E.symbol=E.name;let x=en(u.filter(E=>E.stablecoin).reduce((E,R)=>E+R.usdValue,0)),k=c.filter(E=>E.kind==="nft"),_=i.reduce((E,R)=>E+Number(R.valuation?.nftUnvaluedItems||0),0),w=k.filter(E=>E.usdValue==null).length+_,O=k.filter(E=>E.usdValue!=null).length,A=h[0]||null,b=A?A.percentOfKnown>=o.assetHighPct?"high":A.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",g=[];f&&g.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),w&&g.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&g.push(`${a} duplicate address/chain snapshot(s) were ignored.`),A&&b!=="low"&&g.push(`Asset concentration is ${b}: ${A.name} is ${A.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&g.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),y[0]?.percentOfKnown>=o.venueHighPct&&g.push(`Venue concentration is high: ${y[0].name} is ${y[0].percentOfKnown}% of known value.`);let S=i.map(wa).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:y,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:x,percentOfKnown:ba(x,p),high:p>0&&ba(x,p)>=o.stablecoinHighPct},nftCoverage:{status:k.length||_?w?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:w,knownUsd:en(k.filter(E=>E.usdValue!=null).reduce((E,R)=>E+R.usdValue,0))},addresses:S,warnings:[...new Set(g)]}}var pA,fA,lm=I(()=>{pA=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),fA=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function dm(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function mm(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function gA(e){return Number.isFinite(Number(mm(e)))}function pm(e){return pe(mm(e),0)}function bA(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=hm(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>gA(o))?r.sort((o,i)=>pm(o.row)-pm(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function hm(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[qo(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function Lo(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"?hm(o):qo(o);r.has(i)?(n+=1,t!=="fill"&&dm(o)>dm(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 wA(e){let t=new Map;for(let r of e){let n=[qo(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 xA(e,t){return t.get(qo(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function EA(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(fm(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 ym(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=Lo(e.balances||[],"balance"),i=Lo(e.positions||[],"position"),s=Lo(e.fills||[],"fill"),a=Lo(e.prices||[],"price"),c=wA(a.rows),u=[],l=0,d=0;for(let S of[...o.rows,...i.rows]){let E=xA(S,c),R=pe(S.quantity??S.amount??S.size),v=E?pe(E.priceUsd??E.price,NaN):pe(S.priceUsd,NaN);if(!Number.isFinite(v)){d+=1;continue}let P=R*v,q=pe(E?.asOf??S.priceAsOf,0),j=r-q>n;j&&(l+=Math.abs(P)),u.push({...S,quantity:R,priceUsd:v,valueUsd:P,stale:j,kind:i.rows.includes(S)?"position":"balance"})}let p=u.filter(S=>S.kind==="balance").reduce((S,E)=>S+E.valueUsd,0),f=u.filter(S=>S.kind==="position"),m=f.reduce((S,E)=>S+E.valueUsd,0),y=f.reduce((S,E)=>S+Math.abs(E.valueUsd),0),h=p+m,x=pe(e.equityUsd,h),k=EA(bA(e.fills||[])).realizedPnlUsd,_=f.reduce((S,E)=>{let R=pe(E.entryPriceUsd??E.averageEntryPrice??E.costBasisPrice,E.priceUsd);return S+E.quantity*(E.priceUsd-R)},0),w=new Map;for(let S of u)w.set(ce(Me(S)),(w.get(ce(Me(S)))||0)+Math.abs(S.valueUsd));let O=[...w.values()].reduce((S,E)=>S+E,0),A=[...w].map(([S,E])=>({asset:S,exposureUsd:De(E),percent:O?De(E/O*100):null})).sort((S,E)=>E.exposureUsd-S.exposureUsd||S.asset.localeCompare(E.asset)),b=u.reduce((S,E)=>S+Math.abs(E.valueUsd),0),g=um({snapshots:[{assets:u.map(S=>({symbol:Me(S),usdValue:Math.abs(S.valueUsd),chain:S.chain,venue:S.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:k,unrealizedUsd:De(_),totalUsd:De(k+_)},exposure:{grossUsd:De(y),netUsd:De(h),leverage:x>0?De(y/x):null,equityUsd:De(x)},concentration:A,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(S=>S.stale).length,staleValueUsd:De(l),stalePercent:b?De(l/b*100):null,ttlMs:n},risk:g})}var pe,De,ce,Me,fm,qo,gm=I(()=>{lm();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,fm=e=>e.address??e.owner??e.account,qo=e=>[ce(e.chain??e.chainId),ce(fm(e)),ce(Me(e)),ce(e.source)].join("|")});var P2,$2,L2,bm=I(()=>{P2=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),$2=Object.freeze(["read","simulate"]),L2=1440*60});function wm(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return SA.test(t)||kA.includes(r)}function $t(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=vA.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of AA)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new tn(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"&&wm(o))throw new tn(`${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(wm(o))throw new tn(`${t}.${o}`,"forbidden-key-name");$t(i,`${t}.${o}`,r,o)}return e}var tn,SA,kA,AA,vA,xm=I(()=>{bm();tn=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}},SA=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,kA=Object.freeze(["privkey","wif","xprv","seed"]);AA=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}]),vA=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as IA}from"node:crypto";function Ea(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ea).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`}function _A(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Uo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Uo(t)}return e}function Sa(e,t="fact"){try{$t(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function km(e){return IA("sha256").update(Ea(e)).digest("hex")}function Am({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:_A(r)};return Uo({...s,hash:km(s)})}function Bo({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");Sa(t,"intent");let n=Am({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return Uo({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function vm(e,t,r,n={}){if(ka(e),!(Em[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`);Sa(r,t);let i=n.external===!0||n.externallySupplied===!0;if(Sm.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=Am({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return Uo({...e,state:t,events:[...e.events,c],headHash:c.hash})}function ka(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(km(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Sa(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&&!Em[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(Sm.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 xa,Em,Sm,Aa=I(()=>{xm();xa=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Em=Object.freeze(Object.fromEntries(xa.map((e,t)=>[e,Object.freeze(t+1<xa.length?[xa[t+1]]:[])]))),Sm=new Set(["signed","broadcast"])});function Im(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return OA[t]??t}function CA(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Im(e)}:${t}`)}function Te(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Fo(r)})}function TA(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(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 NA(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(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 RA(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(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 PA(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(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 $A(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Te(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Te(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function qA(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 Do(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=Im(o),a=CA(o,i),c=LA[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=Fo(fe(u.length/l)),p=u.reduce((_,w)=>_+w.value,0),f=qA(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Te(u,"shadow_markout",m);let y=Fo(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),x=Fo(fe(d*h)),k=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||k.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&k.push("LOW_COVERAGE","NO_TRADE"),x<.5&&k.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Ee(o.ageHours??o.poolAgeHours)??1/0)<24&&k.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&k.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:y,confidence:x,coverage:d,contributions:u,flags:[...new Set(k)],noTrade:k.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var K2,OA,fe,Ee,Fo,LA,va=I(()=>{K2=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),OA=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,Fo=e=>Math.round(e*1e4)/1e4;LA=Object.freeze({wallet:TA,pool:NA,nft_floor:RA,hl_flow:PA,prediction_market:$A})});function UA(e=[],t=[],r={}){let n=Do(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 BA(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=Bo({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function _m(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=UA(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(BA(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 Om=I(()=>{va();Aa()});function Cm(e){let t=DA[Number(e)]||[];return new Set([...t,...FA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var FA,DA,Tm=I(()=>{FA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],DA={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 Mo(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Ia(e){e&&(e.prepareAttempted=!0)}function _a(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 zA(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?[...Cm(o)]:[];return new Set([...n,...i])}function VA(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 WA(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function GA(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 KA(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 XA(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 MA)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of jA)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,WA(e)){let o=GA(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=HA.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=zA(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(VA(e)){let o=KA(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 Oa(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=XA(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var MA,jA,HA,Nm=I(()=>{Tm();Re();MA=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),jA=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),HA=/^0x[a-fA-F0-9]{40}$/});var Pm={};M(Pm,{DESK_TOOLS:()=>JA,runDeskTool:()=>ZA});function QA(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")>YA)throw new TypeError("tool arguments exceed size limit")}function Qe(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 ZA(e,t,r={}){if(QA(t),e==="research_artifact"){if(Qe(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>Rm)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||sm)(t)}}if(e==="portfolio_analyze")return Qe(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||ym)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Bo,o=r.advanceTradeLifecycle||vm,i=r.assertTradeLifecycle||ka;if(t.action==="create")return Qe(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Qe(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Ia(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Oa(t.lifecycle,s?.fact||{});if(!a.ok)return _a(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Mo(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Mo(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Qe(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"){Ia(r.loopVerifier);let a=Oa(t.lifecycle,t.fact);if(!a.ok)return _a(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"&&Mo(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Qe(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||_m)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Do)(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||tm,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Qe(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Qe(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Qe(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Qe(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 YA,Rm,jo,Lt,rn,JA,$m=I(()=>{rm();am();gm();Aa();va();Om();Nm();YA=128*1024,Rm=5e4,jo={type:"string",minLength:1,maxLength:256},Lt={type:"object",additionalProperties:!0},rn=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),JA=Object.freeze([rn("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:jo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Lt,parentId:jo,childId:jo},required:["action"],additionalProperties:!1}),rn("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:Rm},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}),rn("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}),rn("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:jo,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}),rn("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 Lm={};M(Lm,{deployGloballyEnabled:()=>tv,executeGloballyEnabled:()=>ev,mevExecuteEnabled:()=>rv});function ev(){return an("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function tv(){return an("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function rv(){return an("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var qm=I(()=>{cn()});cn();import Um from"node:fs";import Ca from"node:process";import{fileURLToPath as nv}from"node:url";import{createInterface as Qm}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 un(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 eh(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function th(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 rh(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function nh(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 oh(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function pr(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=>pr(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=>pr(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=oh(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=pr(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=pr(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Jo(e,t={}){let r=th(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=rh(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!eh(l))return de(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,un(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 un(d,{});if(!c)return de(d,-32002,"server not initialized");if(l.method==="tools/list")return un(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 y=pr(f,o.get(p)?.inputSchema);if(y)return de(d,-32602,y);try{let h=new AbortController,x=await nh(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return un(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():"",k=/\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),_=/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 k&&!_&&x.length<=200?de(d,-32e3,`tool call failed: ${x}`):de(d,-32e3,"tool call failed")}}return de(d,-32601,"method not found")}}function Fa(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=Jo(e,t),u={closed:!1,inflight:0},l=Qm({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function y(){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 O=JSON.stringify(w);Buffer.byteLength(O)>i&&(O=JSON.stringify(de(w.id,-32003,"response exceeded the size limit"))),n.write(`${O}
|
|
24
|
+
`)===!1&&!m&&(m=!0,y(),n.once("drain",()=>{m=!1,k()}))}function x(w){u.inflight+=1,y(),Promise.resolve(c(w)).then(h).catch(()=>h(de(w?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,k()})}function k(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)x(p.shift());y()}function _(){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 O=String(w).split(`
|
|
25
|
+
`);for(let A=0;A<O.length;A+=1){if(d+=Buffer.byteLength(O[A]),d>o){_();return}A<O.length-1&&(d=0)}}),l.on("line",w=>{if(u.closed)return;if(Buffer.byteLength(w)>o){_();return}let O;try{O=JSON.parse(w)}catch{h(de(null,-32700,"parse error"));return}if(p.length>=a){h(de(O?.id,-32e3,"server busy"));return}p.push(O),k()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Da=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"}}),ih=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function ct(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Se(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function fr(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Se(o)}return`${r} raw`}return Se(e)}var sh=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 ah(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:sh[String(e||"").toUpperCase()]}function Ma(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=ah(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=fr(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??fr(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?fr(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Se(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Se(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",fr(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),k=Number(m);Number.isFinite(x)&&Number.isFinite(k)&&x>0&&k>0&&k<=x&&s("SLIPPAGE",`${((1-k/x)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&s("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Se(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let h=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(x=>x!==a).slice(0,3):[];for(let x of h){let k=x?.provider||x?.venue||x?.source,_=fr(x?.netOut??x?.amountOut??x?.toAmount,u);k&&_&&s(`vs ${k}`,_,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",u!=null?`$${Se(u)}`:null,{hero:!0});let 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,y)=>Number(y.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Se(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Se(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((y,h)=>y+h,0)/f.length;s("AVG ENTRY",`$${Se(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Se(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Se(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(l=>Number(l?.priceEth??l?.price??l?.costEth)).filter(l=>Number.isFinite(l)&&l>0);u.length>0&&s("AVG BUY",`${Se(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Se(o.owners??o.numOwners))}return i}function ch(e,t,r){let n=Da[e]||Da.generic,o=Ma(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
26
|
:root{color-scheme:dark}
|
|
25
27
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
26
28
|
body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
@@ -61,4 +63,4 @@ ${i?`<div class="hero">${ct(i.value)}</div><div class="herolabel">${ct(i.label)}
|
|
|
61
63
|
${c}
|
|
62
64
|
<details><summary>details \xB7 ${ct(t)}</summary><pre>${a}</pre></details>
|
|
63
65
|
<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 Ma(e,t){let r=th[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Da(r,t).some(i=>i.hero))return null;let o=oh(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Qo();function Ha(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 bh=[/\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 cn(e){let t=String(e??"");for(let r of bh)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)=>Ha(n)?`${n}${o}[REDACTED]`:r),wh(wt(t,{force:!0}))}function wh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=ja(t);return r.ok?r.href:t})}function fr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(Ha(n))return"[REDACTED]";if(typeof e=="string"){let i=cn(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 KA(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 Ca=KA(Xo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),XA=2*1024*1024;async function YA(e,t=XA){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 Pm={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:Pm,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:Pm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},qm=[{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:{}}}],Lm=String(Oa.env.ORACLE_DEFAULT_ADDRESS||Oa.env.MAD_OPERATOR_ADDRESS||"").trim(),QA=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"]),JA=new Set(qm.map(e=>e.name));for(let e of QA)if(JA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var ZA={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||Lm||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||Lm;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 Ta(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 YA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function ev(e,t,r={},n={}){try{return await Ta(`${Ca}/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 Um(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(()=>(ou(),nu));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(),gu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Rl(),Nl)),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(),od));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(sd(),id));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(cd(),ad));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(pd(),dd));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(()=>(np(),rp));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(()=>(ip(),op));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(lp(),up));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(mp(),fp));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(()=>(yp(),hp));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(wp(),bp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Ep(),xp));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(()=>(kp(),Sp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(vp(),Ap));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(_p(),Ip)),Promise.resolve().then(()=>(Cp(),Op))]);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(()=>(ca(),aa));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(ca(),aa));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(Of(),_f));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Gf(),Wf));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(()=>(Tm(),Cm));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(Rm(),Nm));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(),ul));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 Ta(`${Ca}/data/catalog`,{signal:r.signal});if(e==="data_health")return Ta(`${Ca}/data/health`,{signal:r.signal});let o=ZA[e];if(o){let{provider:i,op:s,args:a}=o(t);return ev(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Bm(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=cn(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=cn(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Ma(t,e):null;s&&i.push(s)}catch{}return{content:i}}var Fm=Object.freeze({name:"oracle-data-mcp",version:"1",tools:qm,async call(e,t,r={}){return Bm(await Um(e,t,r),e)}});function tv(){return Ba(Fm)}function rv(){let e=Oa.argv[1];if(!e)return!1;try{return $m.realpathSync(e)===$m.realpathSync(GA(import.meta.url))}catch{return!1}}rv()&&tv();function nv({timeoutMs:e,callToolOptions:t={}}={}){return Yo({...Fm,async call(r,n,o={}){return Bm(await Um(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var aN=nv();export{QA as PUBLIC_MCP_FORBIDDEN_TOOLS,Um as callTool,nv as createPublicMcpHandler,Bm as formatMcpResult,aN as handle,Ta as httpJson,YA as readBoundedJsonResponse,KA as resolveDataUrl,tv as startStdioLoop,qm as tools};
|
|
66
|
+
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function ja(e,t){let r=ih[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Ma(r,t).some(i=>i.hero))return null;let o=ch(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Qo();function za(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 Sh=[/\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 ln(e){let t=String(e??"");for(let r of Sh)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)=>za(n)?`${n}${o}[REDACTED]`:r),kh(wt(t,{force:!0}))}function kh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Ha(t);return r.ok?r.href:t})}function mr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(za(n))return"[REDACTED]";if(typeof e=="string"){let i=ln(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=>mr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=mr(s,{depth:t+1,seen:r,key:i});return o}function ov(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 Ta=ov(Yo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),iv=2*1024*1024;async function sv(e,t=iv){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Bm={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},ur={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Bm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Bm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Dm=[{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:ur,conversionGasEvidence:ur,gasPriceEvidence:ur,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:ur,conversionGasEvidence:ur,gasPriceEvidence:ur,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:{}}}],Fm=String(Ca.env.ORACLE_DEFAULT_ADDRESS||Ca.env.MAD_OPERATOR_ADDRESS||"").trim(),av=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"]),cv=new Set(Dm.map(e=>e.name));for(let e of av)if(cv.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var uv={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||Fm||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||Fm;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 Na(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 sv(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function lv(e,t,r={},n={}){try{return await Na(`${Ta}/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 Mm(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(()=>(au(),su));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(()=>(Vi(),xu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(ql(),Ll)),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(()=>(rr(),cd));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(ld(),ud));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(pd(),dd));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(yd(),hd));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(()=>(ap(),sp));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(()=>(up(),cp));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(mp(),fp));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(bp(),gp));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(()=>(xp(),wp));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(kp(),Sp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(vp(),Ap));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(()=>(_p(),Ip));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(Cp(),Op));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Np(),Tp)),Promise.resolve().then(()=>(Pp(),Rp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(_o(),Io));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(_o(),Io));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(()=>(_o(),Io));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Co(),Oo));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Co(),Oo));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(()=>(Co(),Oo));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(()=>(ua(),ca));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(ua(),ca));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(Rf(),Nf));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Jf(),Yf));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(()=>($m(),Pm));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(qm(),Lm));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(()=>(us(),pl));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 Na(`${Ta}/data/catalog`,{signal:r.signal});if(e==="data_health")return Na(`${Ta}/data/health`,{signal:r.signal});let o=uv[e];if(o){let{provider:i,op:s,args:a}=o(t);return lv(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function jm(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=ln(JSON.stringify(mr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=mr(e),o=ln(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?ja(t,e):null;s&&i.push(s)}catch{}return{content:i}}var Hm=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Dm,async call(e,t,r={}){return jm(await Mm(e,t,r),e)}});function dv(){return Fa(Hm)}function pv(){let e=Ca.argv[1];if(!e)return!1;try{return Um.realpathSync(e)===Um.realpathSync(nv(import.meta.url))}catch{return!1}}pv()&&dv();function fv({timeoutMs:e,callToolOptions:t={}}={}){return Jo({...Hm,async call(r,n,o={}){return jm(await Mm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var bN=fv();export{av as PUBLIC_MCP_FORBIDDEN_TOOLS,Mm as callTool,fv as createPublicMcpHandler,jm as formatMcpResult,bN as handle,Na as httpJson,sv as readBoundedJsonResponse,ov as resolveDataUrl,dv as startStdioLoop,Dm as tools};
|