@oracle-agent/oracle 0.28.27 → 0.28.29
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 +10 -3
- package/SETUP.md +3 -0
- package/dist/assets/skills/bankrbot/SKILL.md +24 -0
- package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
- package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +2 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
- package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
- package/dist/bin/desk-server.mjs +28 -26
- package/dist/bin/oracle-data-mcp.mjs +32 -12
- package/dist/bin/oracle-gateway.mjs +39 -26
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +15 -15
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/bin/oracle.mjs +4 -3
- package/dist/cli/commands/auth.mjs +6 -6
- package/dist/cli/commands/chat.mjs +155 -155
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +77 -77
- package/dist/cli/commands/harness.mjs +4 -4
- package/dist/cli/commands/model.mjs +157 -157
- package/dist/cli/commands/receipt.mjs +1 -1
- package/dist/cli/commands/setup.mjs +23 -23
- package/dist/cli/commands/signer.mjs +8 -8
- package/dist/cli/commands/snipe.mjs +24 -0
- package/dist/cli/commands/swap.mjs +25 -25
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/control/approval-binding.mjs +1 -0
- package/dist/control/finality.mjs +1 -0
- package/dist/control-plane/index.mjs +6 -0
- package/dist/data/desk-data.mjs +26 -24
- package/dist/governance-prepare.mjs +2 -0
- package/dist/index.mjs +44 -31
- package/dist/local-marketplace.mjs +3 -0
- package/dist/local-pack-registry.mjs +3 -0
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +8 -8
- package/dist/local-x402.mjs +3 -0
- package/dist/nft/index.mjs +1 -1
- package/dist/notifications/index.mjs +3 -0
- package/dist/position-health.mjs +2 -0
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/safety-intelligence.mjs +1 -0
- package/dist/scanner/index.mjs +3 -3
- package/dist/task.d.mts +130 -0
- package/dist/task.mjs +2 -0
- package/dist/tax-lots.mjs +5 -0
- package/dist/tenant-rbac.mjs +1 -0
- package/dist/workflow-telemetry.mjs +1 -0
- package/package.json +17 -2
- package/public/agent-connect/index.html +2 -2
- package/public/install.sh +2 -2
- package/public/oracle-splash/index.html +2 -2
- package/public/oracle-splash/install.sh +2 -2
|
@@ -1,12 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`),c=Rp("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function jp(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ti):Math.min(250*2**e,Ti)+Math.floor(Math.random()*100)}function Zt(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ho(e,t,r){return Zt(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function er(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function zp(e){return e?e.byteLength??e.length??0:0}async function Ri(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(er(e),!n))throw ho(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let l=await e.text(),d=Buffer.byteLength(l,"utf8");if(d>t){if(!n)throw ho(r,`body ${d} bytes`,t);return Buffer.from(l,"utf8").subarray(0,t).toString("utf8")}return l}let a=[],c=0,u=!1;try{for(;;){let{value:l,done:d}=await i.read();if(d)break;if(l&&(a.push(Buffer.from(l)),c+=zp(l),c>t)){u=!0;break}}}finally{if(u)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw ho(r,`streamed ${c} bytes`,t);let p=Buffer.concat(a);return(u?p.subarray(0,t):p).toString("utf8")}function Pi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Vp(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:p,validateResponse:l}){let d=new AbortController,f=setTimeout(()=>d.abort(),s),m=null,y=t,g=i?{lookupFn:i}:{};if(c&&!a&&!fo(y))throw Zt(`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 b=async(S,{status:C=null}={})=>{let x=await uo(S,g);if(!x.ok)throw Zt(C==null?`HTTP refused ${S}: ${x.error}`:`HTTP redirect to ${S} ${x.error}`,C==null?{}:{status:C});let I=new URL(S).hostname;if(a){if(m&&(await m.close(),m=null),!m)try{m=await lo({requireUndici:!0,...p?{importUndici:p}:{}})}catch(v){throw Zt(C==null?`HTTP refused ${S}: ${v?.message||v}`:`HTTP redirect to ${S} refused: ${v?.message||v}`,C==null?{}:{status:C})}m.pin(I,x.addresses),y=m.fetch}else _i(y,I,x.addresses);return x};try{let S=String(e),C={...n||{}};c&&await b(S);for(let x=0;x<=Ni;x+=1){let I=await y(S,{method:r,headers:C,body:o,signal:d.signal,redirect:"manual"});if(qp.has(I.status)){if(r!=="GET"&&r!=="HEAD"){let U=await Ri(I,u??Bp,{url:S,truncate:!0}),k=new Error(`HTTP ${I.status} ${r} ${S} redirected non-idempotent request`);throw k.status=I.status,k.body=Pi(U)??U.slice(0,300),k}if(x===Ni)throw er(I),new Error(`HTTP redirect loop for ${e}`);let w=I.headers?.get?.("location"),O;try{O=Lp(w,S)}catch(U){throw er(I),U}let P=!Dp(O,S);if(er(I),P&&(C=Fp(C)),c)await b(O,{status:I.status});else if(P){let U=await uo(O,g);if(!U.ok){let k=new Error(`HTTP redirect from ${S} ${U.error}`);throw k.status=I.status,k.retryable=!1,k}a&&U.addresses?.length&&(m||(m=await lo(p?{importUndici:p}:{})),m&&(m.pin(new URL(O).hostname,U.addresses),y=m.fetch))}S=O;continue}if(typeof l=="function")try{await l(I,{url:S})}catch(w){throw er(I),Zt(w?.message||String(w))}let v=await Ri(I,u,{url:S,onOversize:()=>d.abort()}),h=Pi(v);if(!I.ok){let w=new Error(`HTTP ${I.status} ${r} ${S}`);throw w.status=I.status,w.retryAfter=I.headers?.get?.("retry-after")??null,w.body=h??v.slice(0,300),w}return h??v}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function T(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(),s={Accept:"application/json",...t.headers||{}},i=t.body;i!=null&&typeof i!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",i=JSON.stringify(i));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):$p,c=t.lookupFn,u=!t.fetchImpl,p=t.untrustedUrl===!0,l=t.importUndici,d=t.validateResponse,f=Number(t.maxResponseBytes),m=Number.isFinite(f)&&f>0?Math.floor(f):null,y=async()=>{let x;for(let I=0;I<=a;I++)try{return await Vp(e,{fetchImpl:r,method:o,headers:s,body:i,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:p,maxResponseBytes:m,importUndici:l,validateResponse:d})}catch(v){x=v;let h=v?.status,w=v?.name==="AbortError",O=new Set([408,425,429]),P=v?.retryable===!1?!1:h!=null?O.has(h)||Pp.has(h)&&Oi.has(o):!w&&Oi.has(o);if(I===a||!P)throw v;await Hp(jp(I,v?.retryAfter))}throw x};if(!(t.dedupe!==!1&&o==="GET"&&i==null))return y();let b=Mp(o,e,s,{untrustedUrl:p,maxResponseBytes:m}),S=mo.get(b);if(S)return S;let C=y().finally(()=>mo.delete(b));return mo.set(b,C),C}async function qr(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),s=new Array(n.length),i=0;return await Promise.all(Array.from({length:o},async()=>{for(;i<n.length;){let a=i++;s[a]=await r(n[a],a)}})),s}var Pp,Oi,$p,Ti,$i,qp,Ni,Bp,mo,Hp,z=E(()=>{Ci();Pp=new Set([408,425,429,500,502,503,504]),Oi=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),$p=2,Ti=4e3,$i=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],qp=new Set([301,302,303,307,308]),Ni=3,Bp=64*1024;mo=new Map;Hp=e=>new Promise(t=>setTimeout(t,e))});function Gp({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"?Kp:Wp}async function go(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Gp(t);return T(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function qi(e={}){return go({type:"meta"},e)}async function Bi({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let s={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return go(s,o)}async function Ui({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return go({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Wp,Kp,yo=E(()=>{z();Wp="https://api.hyperliquid.xyz/info",Kp="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Qp}from"node:crypto";function Ue(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Et(e){return typeof e=="number"&&Number.isFinite(e)}function xo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)xo(t);return Object.freeze(e)}for(let t of Object.keys(e))xo(e[t]);return Object.freeze(e)}function lt(e){if(Array.isArray(e))return e.map(lt);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=lt(e[r]);return t}return e}function bo(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 Fi(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Jp(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Xp(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Zp(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 Di(e){if(!Ue(e))throw new TypeError("evidence artifact must be a plain object");if(!Yp.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(!Ue(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(!Ue(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ue(e.train)||!Ue(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return lt({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>lt(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 Mi(e){return Qp("sha256").update(JSON.stringify(Di(e)),"utf8").digest("hex")}function ve(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function wo(e,t){if(!Ue(e)||!Ue(e.metrics))throw new Error(`${t} metrics required`);let r=ve(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(!Et(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 ef(e,{maxDailyLossPct:t}={}){let r=e.split,n=ve(r.trainStartIndex,"split.trainStartIndex"),o=ve(r.trainEndIndex,"split.trainEndIndex"),s=ve(r.trainBarCount,"split.trainBarCount",1),i=ve(r.holdoutStartIndex,"split.holdoutStartIndex"),a=ve(r.holdoutEndIndex,"split.holdoutEndIndex"),c=ve(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==s||i!==o+1||a-i+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Et(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");wo(e.train,"train");let u=wo(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Et(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 p=e.walkForward,l=p.windows;if(l.length<1||p.windowsRun!==l.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let d=0,f=-1;for(let y=0;y<l.length;y++){let g=l[y];if(!Ue(g)||g.index!==y||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=ve(g.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),S=ve(g.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),C=ve(g.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),x=ve(g.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(b!==0||S>=C||C>x||C<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,g.passed){if(d+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let I=wo({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${y}]`);if(I.tradeCount<1||I.netPnlUsd<=0||I.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Et(t)&&I.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=d/l.length;if(!Et(p.passRate)||Math.abs(p.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function ji(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=Di(e),n=lt({id:e.id,...r});if(JSON.stringify(lt(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Mi(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&ef(e,t),e}function So({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:s=10}={}){let i=[];if(!Ue(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ue(r))throw new TypeError("backtestOptions must be a plain object");if(!Et(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(s)||s<0)throw new TypeError("minTrades must be an integer >= 0");let a=de(e),c=At(a),u=tr(t),p=t.length,l=(q=[],M={})=>Li({status:"fail",strategy:a,sHash:c,barsHash:u,split:M.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:M.train||null,holdout:M.holdout||null,walkForward:M.walkForward||{windows:[],passRate:0},flags:[...i,...q]});if(p<10)return l([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let d=Math.floor(p*n),f=d,m=p-f;if(d<5||m<3)return l([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:d,holdoutCount:m}]);let y=t.slice(0,d),g=t.slice(f),b,S;try{b=Je(a,y,r),S=Je(a,g,r)}catch(q){return l([{type:"backtest_error",message:String(q.message||q)}])}let C={metrics:bo(b),costs:Fi(b),tradeCount:b.metrics.tradeCount},x={metrics:bo(S),costs:Fi(S),tradeCount:S.metrics.tradeCount},I={trainStartIndex:0,trainEndIndex:d-1,trainBarCount:d,holdoutStartIndex:f,holdoutEndIndex:p-1,holdoutBarCount:m,trainFraction:n},v=[],h=Math.floor(p/(o+1));if(h<3)i.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:h});else for(let q=0;q<o;q++){let M=h*(q+1),se=M,K=Math.min(p,se+h);if(K-se<3||M<3){v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let $e=t.slice(se,K),Or;try{Or=Je(a,$e,r)}catch{v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Tr=bo(Or),Nr=Zp(Tr,a.risk,s);v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:Nr,reason:Nr?"pass":"fail_metrics",metrics:Tr})}let w=v.filter(q=>q.passed).length,O=v.length===0?0:w/v.length,P={windows:v,passRate:O,windowsRun:v.length};x.metrics.tradeCount===0&&C.metrics.tradeCount===0&&i.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&i.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&i.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),C.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&C.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?i.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):C.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<C.metrics.netPnlUsd*.1&&C.metrics.tradeCount>=s&&i.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let U=Jp(x.costs),k=Xp(S);k>0&&U>k&&i.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let R=i.some(q=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(q.type)),D=i.some(q=>q.type==="overfit"),W="fail";return x.metrics.tradeCount>=s&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&O>=.6&&!(k>0&&U>k)&&!D&&!i.some(q=>q.type==="severe_oos_collapse"||q.type==="invalid_windowing")?W="pass_live_eligible":!R&&x.metrics.tradeCount>0&&C.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(W="pass_paper_only",x.metrics.tradeCount<s&&i.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&x.metrics.tradeCount>0&&C.metrics.netPnlUsd>0?W="fail":x.metrics.tradeCount>0&&C.metrics.tradeCount>0&&!R?W="pass_paper_only":W="fail",x.metrics.netPnlUsd<0&&(W=W==="pass_live_eligible"?"fail":W==="pass_paper_only"?"pass_paper_only":"fail",W="fail"),Li({status:W,strategy:a,sHash:c,barsHash:u,split:I,train:C,holdout:x,walkForward:P,flags:i})}function Li({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:s,holdout:i,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:pt,barsHash:n,split:o,train:s,holdout:i,walkForward:a,flags:c};return u.id=Mi(u),xo(lt(JSON.parse(JSON.stringify(u))))}var Yp,ko=E(()=>{ft();dt();Br();Yp=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as tf,createHmac as rf,timingSafeEqual as dx}from"node:crypto";function vo(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vo).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${vo(e[r])}`).join(",")}}`}function Hi(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function zi(e=process.env){return Hi(process.env)||Hi(e)}function af(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function cf(e){let t=af(e);return tf("sha256").update(vo(t)).digest("hex")}function uf(e,t=zi()){return t?rf("sha256",t).update(String(e)).digest("hex"):""}function J(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:s}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let i=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(i&&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:i?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=s==null?c+of:Number(s),p=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||p<=0||p>sf)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let d={...a,preparedAt:c,expiresAt:u,prepareVersion:nf},f=cf(d),m=zi(n),y=m?uf(f,m):void 0,g={...d,prepareHash:f};return y&&(g.prepareMac=y),g}var nf,of,sf,fe=E(()=>{nf=2,of=300*1e3,sf=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function rr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function df(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ao(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Ao(r,`${t}[${n}]`));return}if(rr(e))for(let[r,n]of Object.entries(e)){let o=df(r);if(lf.some(s=>o.includes(s)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Ao(n,`${t}.${r}`)}}function Eo(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Vi({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:s=process.env}={}){if(Ao({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!rr(e))throw new Error("handoff: strategy required");if(!rr(t))throw new Error("handoff: evidence required");if(!rr(r))throw new Error("handoff: shadow required");if(!rr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let i=de(e,{nowMs:o}),a=pe(i);if(ji(t,{maxDailyLossPct:i.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 d of c)if(!(d in n)||n[d]==null)throw new Error(`handoff: caps.${d} required`);if(!Eo(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(!Eo(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(!Eo(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(d=>d==="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 p={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},l={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:nr,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:p},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(l,{provider:"hl-strategy",kind:"strategy-live-handoff",env:s})}var lf,Wi=E(()=>{ft();ko();dt();fe();lf=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function It(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function _t(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function or(e){if(Array.isArray(e))for(let t of e)or(t);else if(e&&typeof e=="object")for(let t of Object.values(e))or(t);return Object.freeze(e)}function ff(e){let t=pf[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function mf(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");_t(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 s=_t(Number(o.t),`candles[${n}].t`);if(_t(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:s,o:It(o.o,`candles[${n}].o`),h:It(o.h,`candles[${n}].h`),l:It(o.l,`candles[${n}].l`),c:It(o.c,`candles[${n}].c`),v:It(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(s);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${s}`);c||r.set(s,a)}return or([...r.values()].sort((n,o)=>n.t-o.t))}function hf(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 s=_t(Number(o.time),`funding[${n}].time`);s>t||r.set(s,{time:s,fundingRate:It(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function gf({coin:e,startTime:t,endTime:r},n){let o=[],s=Math.max(0,t-288e5),i=!1;for(let a=0;a<16&&s<=r;a++){let c=await Ui({coin:e,startTime:s,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=s;for(let p of c){let l=Number(p?.time);Number.isSafeInteger(l)&&l>u&&(u=l)}if(c.length<500||u>=r){i=!0;break}if(u<=s)throw new Error("Hyperliquid funding history pagination did not advance");s=u+1}if(!i)throw new Error("strategy history exceeds the bounded funding history limit");return hf(o,r)}function yf(e,t,r){let n=0,o=null;return e.map(s=>{let i=s.t+r,a=0;for(;n<t.length&&t[n].time<i;){let c=t[n];o=c.fundingRate,c.time>=s.t&&(a+=c.fundingRate),n+=1}return o==null?{...s,fundingPaymentRate:a}:{...s,fundingRate:o,fundingPaymentRate:a}})}async function Ki(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=ff(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let s=_t(e.endTime,"endTime"),i=e.count==null?1500:e.count;if(!Number.isInteger(i)||i<20||i>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,s-i*o):_t(e.startTime,"startTime");if(a>=s)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Bi({coin:r,interval:n,startTime:a,endTime:s},t),gf({coin:r,startTime:a,endTime:s},t)]),p=mf(c,{endTime:s}),l=or(yf(p,u,o));return or({coin:r,interval:n,range:{startTime:a,endTime:s},bars:l})}var pf,Gi=E(()=>{yo();pf=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 xf(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))wf.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"||!bf.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 Sf(e={}){let t=await qi(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 bf,wf,Qi,Yi=E(()=>{yo();Wi();Gi();bf=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),wf=new Set(["coin","interval"]);Qi=Object.freeze({id:"hyperliquid",validateMarket:xf,fetchBars:Ki,listMarkets:Sf,prepareIntent(e){return Vi(e)}})});function vf(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 kf.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 Io(e){return typeof e!="string"?null:Ef.get(e)??null}function _o(e){let t=Io(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var kf,Ji,Ef,Ax,Co=E(()=>{Yi();kf=Object.freeze(["id","validateMarket","prepareIntent"]);Ji=[Qi].map(vf),Ef=new Map(Ji.map(e=>[e.id,e])),Ax=Object.freeze([...Ji])});import{createHash as Af}from"node:crypto";function xe(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function sa(e){return Number.isInteger(e)&&e>0}function Po(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Po(t);return Object.freeze(e)}for(let t of Object.keys(e))Po(e[t]);return Object.freeze(e)}function $o(e){if(Array.isArray(e))return e.map($o);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=$o(e[r]);return t}return e}function A(e,t,r){e.push({path:t,message:r})}function Xe(e,t,r,n){for(let o of Object.keys(e))t.has(o)||A(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function ua(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 s=Math.round(o);return Math.abs(o-s)<=1e-9}function Ro(e,t,r,n){if(xe(e)){if(Xe(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return A(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return A(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!xe(o)||![o.value,o.min,o.max,o.step].every(sa)?(A(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return sa(e)?e:(A(n,t,"must be a positive integer or {param}"),null)}function ia(e,t,r,n){return xe(e)?(Xe(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(A(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(A(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(A(n,t,"must be a finite number or {param}"),null)}function Ur(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 $f(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 s=e.get(n);if(s){for(let i of Ur(s))if(e.has(i)&&r(i))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function qf(e,t){if(!xe(e))return A(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>ra)return A(t,"parameters",`too many parameters (max ${ra})`),null;let n={};for(let o of r){if(!aa.test(o)){A(t,`parameters.${o}`,"parameter name is malformed");continue}let s=e[o],i=`parameters.${o}`;if(!xe(s)){A(t,i,"must be a plain object");continue}Xe(s,Zi,i,t);for(let l of Zi)l in s||A(t,`${i}.${l}`,"required field is missing");let{value:a,min:c,max:u,step:p}=s;ne(c)||A(t,`${i}.min`,"must be a finite number"),ne(u)||A(t,`${i}.max`,"must be a finite number"),(!ne(p)||p<=0)&&A(t,`${i}.step`,"must be a positive finite number"),ne(a)||A(t,`${i}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&A(t,`${i}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(p)&&p>0&&(ua(a,c,u,p)||A(t,`${i}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:p}}return n}function Bf(e,t,r,n){let o=`nodes.${t}`;if(!xe(e))return A(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!ta[e.type])return A(n,`${o}.type`,"unknown or missing node type"),Xe(e,Pf,o,n),null;switch(Xe(e,ta[e.type],o,n),(typeof e.id!="string"||!ca.test(e.id))&&A(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!If.has(e.field))&&A(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let s=ia(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:s}}case"indicator":{(typeof e.indicator!="string"||!_f.has(e.indicator))&&A(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let s=e.indicator,i={id:e.id,type:"indicator",indicator:s};if(s==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?A(n,`${o}.input`,"must be a node id string when provided"):i.input=e.input);let a=Ro(e.period,`${o}.period`,r,n);a!=null&&(i.period=a)}else typeof e.input!="string"||!e.input?A(n,`${o}.input`,"must be a node id string"):i.input=e.input;if((s==="sma"||s==="ema"||s==="rsi"||s==="bollinger"||s==="atr")&&("period"in e,s!=="macd"))if(!("period"in e))A(n,`${o}.period`,"required field is missing");else{let a=Ro(e.period,`${o}.period`,r,n);a!=null&&(i.period=a)}if(s==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))A(n,`${o}.${a}`,"required field is missing");else{let c=Ro(e[a],`${o}.${a}`,r,n);c!=null&&(i[a]=c)}"output"in e?Nf.has(e.output)?i.output=e.output:A(n,`${o}.output`,"must be line|signal|histogram"):A(n,`${o}.output`,"required field is missing"),"period"in e&&A(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&A(n,`${o}.stdDev`,"forbidden for macd")}else if(s==="bollinger"){if(!("stdDev"in e))A(n,`${o}.stdDev`,"required field is missing");else{let a=ia(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?A(n,`${o}.stdDev`,"must be > 0"):i.stdDev=a)}"output"in e?Rf.has(e.output)?i.output=e.output:A(n,`${o}.output`,"must be upper|middle|lower"):A(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(n,`${o}.${a}`,`forbidden for ${s}`)}else{"output"in e&&A(n,`${o}.output`,`forbidden for ${s}`),"stdDev"in e&&s!=="bollinger"&&A(n,`${o}.stdDev`,`forbidden for ${s}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(n,`${o}.${a}`,`forbidden for ${s}`)}return i}case"compare":return(typeof e.op!="string"||!Cf.has(e.op))&&A(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&A(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(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"||!Of.has(e.op))&&A(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return A(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let s=[];for(let i=0;i<e.inputs.length;i++){let a=e.inputs[i];typeof a!="string"||!a?A(n,`${o}.inputs.${i}`,"must be a node id"):s.push(a)}return e.op==="not"?s.length!==1&&A(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&s.length<2&&A(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:s}}case"cross":return(typeof e.direction!="string"||!Tf.has(e.direction))&&A(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&A(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(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 Uf(e,t,r){if(!xe(e))return A(t,"risk","must be a plain object"),null;Xe(e,ea,"risk",t);for(let d of ea)(!(d in e)||e[d]==null)&&A(t,`risk.${d}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?A(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let s=e.maxNotionalUsd;!ne(s)||s<=0?A(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=s;let i=e.positionSizePct;!ne(i)||i<=0||i>100?A(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=i;let a=e.stopLossPct;!ne(a)||a<=0||a>100?A(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?A(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?A(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let p=e.maxDailyLossPct;!ne(p)||p<=0||p>100?A(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=p;let l=e.expiresAt;return!Number.isInteger(l)||l<=0?A(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?l<=r.nowMs&&A(t,"risk.expiresAt","must be strictly greater than nowMs"):A(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=l),n}function qo(e,t={}){let r=[];if(!xe(e))return A(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};Xe(e,Xi,"",r);for(let l of Xi)(!(l in e)||e[l]==null)&&A(r,l,"required field is missing");e.version!==Oo&&A(r,"version",`must be ${Oo}`),(typeof e.id!="string"||!aa.test(e.id))&&A(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>oa)&&A(r,"name",`must be a non-empty string max ${oa}`);let n=Io(e.venue);n||A(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)xe(e.market)||A(r,"market","must be a plain object");else{let l=n.validateMarket(e.market);if(!l||typeof l.ok!="boolean"||!Array.isArray(l.errors))A(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(l.ok)o=l.market;else for(let d of l.errors)A(r,d.path,d.message)}let s=qf(e.parameters,r),i=null,a=new Map;if(!Array.isArray(e.nodes))A(r,"nodes","must be an array");else if(e.nodes.length>na)A(r,"nodes",`too many nodes (max ${na})`);else{i=[];for(let l=0;l<e.nodes.length;l++){let d=Bf(e.nodes[l],l,s||{},r);d&&(typeof d.id=="string"&&ca.test(d.id)&&(a.has(d.id)?A(r,`nodes.${l}.id`,`duplicate node id "${d.id}"`):a.set(d.id,d)),i.push(d))}for(let l=0;l<i.length;l++){let d=i[l],f=`nodes.${l}`;for(let m of Ur(d))a.has(m)||A(r,f,`unknown node ref "${m}"`);if(d.type==="indicator"||d.type==="compare"||d.type==="cross")for(let m of Ur(d)){let y=a.get(m);y&&To.has(y.type)&&A(r,f,`node ref "${m}" must be numeric`)}if(d.type==="logic")for(let m of Ur(d)){let y=a.get(m);y&&!To.has(y.type)&&A(r,f,`node ref "${m}" must be boolean`)}}$f(a)&&A(r,"nodes","graph contains a cycle")}let c=null;if(!xe(e.rules))A(r,"rules","must be a plain object");else{Xe(e.rules,No,"rules",r);for(let l of No)l in e.rules||A(r,`rules.${l}`,"required field is missing");c={};for(let l of No){let d=e.rules[l];if(d===null){c[l]=null;continue}if(typeof d!="string"||!d){A(r,`rules.${l}`,"must be a node id or null"),c[l]=d;continue}if(!a.has(d)){A(r,`rules.${l}`,`unknown node ref "${d}"`),c[l]=d;continue}let f=a.get(d);To.has(f.type)||A(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=d}}let u=Uf(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let p=Po({version:Oo,id:e.id,name:e.name,venue:n.id,market:o,parameters:s,nodes:i,rules:c,risk:u});return{ok:!0,errors:[],strategy:p}}function de(e,t={}){let r=qo(e,t);if(!r.ok)throw new Ct(r.errors);return r.strategy}function Ff(e){let t=de(e);return JSON.stringify($o(t))}function At(e){let t=Ff(e);return Af("sha256").update(t,"utf8").digest("hex")}function sr(e,t){if(!xe(e))throw new Ct([{path:"",message:"strategy must be a plain object"}]);if(!xe(t))throw new Ct([{path:"overrides",message:"must be a plain object"}]);let r=de(e),n={};for(let[s,i]of Object.entries(r.parameters))n[s]={value:i.value,min:i.min,max:i.max,step:i.step};let o=[];for(let[s,i]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,s)){A(o,s,`unknown parameter "${s}"`);continue}let a=n[s];if(!ne(i)){A(o,s,"override must be a finite number");continue}if(!ua(i,a.min,a.max,a.step)){A(o,s,"override must lie on the declared min/max/step grid");continue}n[s]={...a,value:i}}if(o.length)throw new Ct(o);return de({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(s=>{let i={...s};return Array.isArray(s.inputs)&&(i.inputs=[...s.inputs]),i}),rules:{...r.rules},risk:{...r.risk}})}var Oo,aa,ca,If,_f,Cf,Of,Tf,Nf,Rf,To,Xi,Zi,No,ea,Pf,ta,ra,na,oa,Ct,dt=E(()=>{Co();Oo=1,aa=/^[a-z0-9][a-z0-9._-]{0,63}$/,ca=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,If=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),_f=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Cf=new Set(["gt","gte","lt","lte","eq"]),Of=new Set(["and","or","not"]),Tf=new Set(["above","below"]),Nf=new Set(["line","signal","histogram"]),Rf=new Set(["upper","middle","lower"]),To=new Set(["compare","logic","cross"]),Xi=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Zi=new Set(["value","min","max","step"]),No=new Set(["entryLong","entryShort","exitLong","exitShort"]),ea=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Pf=new Set(["id","type"]),ta={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"])},ra=16,na=128,oa=100,Ct=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 ir(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 Ze(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function Lf(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 da(e,t){ir(e),Ze(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 Fr(e,t){ir(e),Ze(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let i=0;i<t;i++)n+=e[i];let o=n/t;r[t-1]=o;let s=2/(t+1);for(let i=t;i<e.length;i++)o=s*e[i]+(1-s)*o,r[i]=o;return r}function pa(e,t){ir(e),Ze(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 s=n/t,i=o/t;r[t]=la(s,i);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,p=c<0?-c:0;s=(s*(t-1)+u)/t,i=(i*(t-1)+p)/t,r[a]=la(s,i)}return r}function la(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function fa(e,t={}){ir(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(Ze(r),Ze(n),Ze(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let s=Fr(e,r),i=Fr(e,n),a=new Array(e.length).fill(null);for(let l=0;l<e.length;l++)s[l]!=null&&i[l]!=null&&(a[l]=s[l]-i[l]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),p=[];for(let l=0;l<a.length;l++)a[l]!=null&&p.push(l);if(p.length>=o){let l=0;for(let y=0;y<o;y++)l+=a[p[y]];let d=l/o,f=p[o-1];c[f]=d,u[f]=a[f]-d;let m=2/(o+1);for(let y=o;y<p.length;y++){let g=p[y];d=m*a[g]+(1-m)*d,c[g]=d,u[g]=a[g]-d}}return{line:a,signal:c,histogram:u}}function ma(e,t={}){ir(e);let r=t.period,n=t.stdDev;if(Ze(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),s=new Array(e.length).fill(null),i=new Array(e.length).fill(null);if(e.length<r)return{upper:s,middle:o,lower:i};let a=0,c=0;for(let u=0;u<e.length;u++){let p=e[u];if(a+=p,c+=p*p,u>=r){let l=e[u-r];a-=l,c-=l*l}if(u>=r-1){let l=a/r,d=c/r-l*l;d<0&&d>-1e-12&&(d=0);let f=Math.sqrt(d);o[u]=l,s[u]=l+n*f,i[u]=l-n*f}}return{upper:s,middle:o,lower:i}}function ha(e,t){Lf(e),Ze(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let i=0;i<e.length;i++){let a=e[i];if(i===0)n[i]=a.h-a.l;else{let c=e[i-1].c;n[i]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let i=0;i<t;i++)o+=n[i];let s=o/t;r[t-1]=s;for(let i=t;i<e.length;i++)s=(s*(t-1)+n[i])/t,r[i]=s;return r}var ga=E(()=>{});import{createHash as Df}from"node:crypto";var Bo,Mf,jf,Hf,ya,ba=E(()=>{Bo=2,Mf="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",jf="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",Hf="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",ya=Df("sha256").update(JSON.stringify({version:Bo,compilerSourceHash:Mf,indicatorsSourceHash:jf,schemaSourceHash:Hf})).digest("hex")});function Ee(e){return typeof e=="number"&&Number.isFinite(e)}function Wf(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 s=[];for(let[a,c]of n)c===0&&s.push(a);let i=[];for(;s.length;){let a=s.shift();i.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&s.push(c)}if(i.length!==e.length)throw new Error("strategy graph is cyclic");return i}function Ot(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Kf(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 s=e[o];if(s==null||typeof s!="object"||Array.isArray(s))throw new TypeError(`bars[${o}] must be an object`);let{t:i,o:a,h:c,l:u,c:p,v:l}=s;if(!Ee(i)&&(typeof i=="number"&&Number.isFinite(i)),!Number.isFinite(i))throw new TypeError(`bars[${o}].t must be finite`);for(let[d,f]of[["o",a],["h",c],["l",u],["c",p],["v",l]])if(!Ee(f))throw new TypeError(`bars[${o}].${d} must be a finite number`);for(let[d,f]of[["o",a],["h",c],["l",u],["c",p]])if(!(f>0))throw new TypeError(`bars[${o}].${d} price must be positive`);if(l<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,p,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,p,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(i>n))throw new TypeError("bars t must be strictly increasing");if(i-n!==Vf[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=i,"fundingRate"in s&&s.fundingRate!=null&&!Ee(s.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in s&&s.openInterest!=null){if(!Ee(s.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(s.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function mt(e,t,r,n,o,s){if(s.has(e))return s.get(e);let i=t.get(e),a;switch(i.type){case"input":{let c=zf[i.field];a=new Array(o+1);for(let u=0;u<=o;u++){let p=n[u][c];a[u]=p===void 0?null:p}break}case"constant":{let c=Ot(i.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=i.period!=null?Ot(i.period,r):void 0;if(i.indicator==="atr"){let l=[];for(let d=0;d<=o;d++){let f=n[d];l.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=ha(l,c);break}let p=mt(i.input,t,r,n,o,s).map((l,d)=>{if(l==null||!Ee(l))throw new TypeError(`indicator input ${i.input} has non-finite value at ${d}`);return l});if(i.indicator==="sma")a=da(p,c);else if(i.indicator==="ema")a=Fr(p,c);else if(i.indicator==="rsi")a=pa(p,c);else if(i.indicator==="macd")a=fa(p,{fastPeriod:Ot(i.fastPeriod,r),slowPeriod:Ot(i.slowPeriod,r),signalPeriod:Ot(i.signalPeriod,r)})[i.output];else if(i.indicator==="bollinger")a=ma(p,{period:c,stdDev:Ot(i.stdDev,r)})[i.output];else throw new Error(`unsupported indicator ${i.indicator}`);break}case"compare":{let c=mt(i.left,t,r,n,o,s),u=mt(i.right,t,r,n,o,s);a=new Array(o+1);for(let p=0;p<=o;p++){let l=c[p],d=u[p];if(l==null||d==null||!Ee(l)||!Ee(d)){a[p]=!1;continue}switch(i.op){case"gt":a[p]=l>d;break;case"gte":a[p]=l>=d;break;case"lt":a[p]=l<d;break;case"lte":a[p]=l<=d;break;case"eq":a[p]=l===d;break;default:a[p]=!1}}break}case"logic":{let c=i.inputs.map(u=>mt(u,t,r,n,o,s));a=new Array(o+1);for(let u=0;u<=o;u++)if(i.op==="not"){let p=c[0][u];a[u]=p===!0?!1:p===!1}else if(i.op==="and"){let p=!0;for(let l of c)if(l[u]!==!0){p=!1;break}a[u]=p}else if(i.op==="or"){let p=!1;for(let l of c)if(l[u]===!0){p=!0;break}a[u]=p}else a[u]=!1;break}case"cross":{let c=mt(i.left,t,r,n,o,s),u=mt(i.right,t,r,n,o,s);a=new Array(o+1),a[0]=!1;for(let p=1;p<=o;p++){let l=c[p-1],d=u[p-1],f=c[p],m=u[p];if(l==null||d==null||f==null||m==null||!Ee(l)||!Ee(d)||!Ee(f)||!Ee(m)){a[p]=!1;continue}i.direction==="above"?a[p]=l<=d&&f>m:a[p]=l>=d&&f<m}break}default:throw new Error(`unknown node type ${i.type}`)}return s.set(e,a),a}function pe(e,t={}){let r=de(e);t&&Object.keys(t).length&&(r=sr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(Wf(r.nodes)),s=r.parameters,i=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"])i.add(f);let a=Object.freeze([...i].sort()),c=At(r);function u(f,m){let y={};for(let b of o){let S=f.get(b);y[b]=S[m]}let g=b=>b!=null&&y[b]===!0;return{values:y,signals:{entryLong:g(r.rules.entryLong),entryShort:g(r.rules.entryShort),exitLong:g(r.rules.exitLong),exitShort:g(r.rules.exitShort)}}}function p(f,m){Kf(f,m,r.market.interval);let y=new Map;for(let g of o)mt(g,n,s,f,m,y);return y}function l(f,m){return u(p(f,m),m)}function d(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,y=p(f,m);return Object.freeze(f.map((g,b)=>Object.freeze(u(y,b))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:nr,compilerHash:pt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:d})}var nr,pt,zf,Vf,ft=E(()=>{dt();ga();ba();nr=Bo,pt=ya,zf=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),Vf=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 Gf}from"node:crypto";function Yf(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Fe(e){return typeof e=="number"&&Number.isFinite(e)}function Uo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Uo(t);return Object.freeze(e)}for(let t of Object.keys(e))Uo(e[t]);return Object.freeze(e)}function Lr(e){if(Array.isArray(e))return e.map(Lr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Lr(e[r]);return t}return e}function Fo(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)=>Fo(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Fo(n,`${t}.${r}`)}}function xa(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:s,h:i,l:a,c,v:u}=n;if(!Fe(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[p,l]of[["o",s],["h",i],["l",a],["c",c],["v",u]])if(!Fe(l))throw new TypeError(`bars[${r}].${p} must be a finite number`);for(let[p,l]of[["o",s],["h",i],["l",a],["c",c]])if(!(l>0))throw new TypeError(`bars[${r}].${p} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(i<Math.max(s,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(s,c,i))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&&!Fe(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Fe(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Fe(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function tr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&xa(e),Gf("sha256").update(JSON.stringify(Lr(e)),"utf8").digest("hex")}function Jf(e){if(e==null&&(e={}),!Yf(e))throw new TypeError("options must be a plain object");let t={...Qf},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(!Fe(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(!Fe(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(!Fe(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 Dr(e){return e/1e4}function Xf(e,t,r){let n=Dr(r);return t==="long"?e*(1+n):e*(1-n)}function Zf(e,t,r){let n=Dr(r);return t==="long"?e*(1-n):e*(1+n)}function wa(e,t,r){let n=Math.abs(e)*Dr(t),o=Math.abs(e)*Dr(r);return{taker:n,builder:o,total:n+o}}function em(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function tm(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function rm(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function nm(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 om(e,t,r){return t==="long"?e.l<=r:e.h>=r}function sm(e,t,r){return t==="long"?e.h>=r:e.l<=r}function im(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ar(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>Fe(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function am(e){if(e.length<3)return 0;let t=[];for(let i=1;i<e.length;i++){let a=e[i-1].equity,c=e[i].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let i of t)r+=i;let n=r/t.length,o=0;for(let i of t)o+=(i-n)**2;let s=Math.sqrt(o/(t.length-1));return s>0?n/s:0}function cm(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let s=(t-o)/t*100;s>r&&(r=s)}}return r}function Je(e,t,r={}){let n=Jf(r);xa(t);let o=tr(t);n.nowMs!==void 0&&de(e,{nowMs:n.nowMs});let s=pe(e);if(ar(s,t),n.nowMs!==void 0&&s.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let i=s.strategy.risk,a=s.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,p=n.takerFeeBps,l=n.builderFeeBps,d=n.initialEquityUsd,f=0,m=0,y=0,g=0,b=0,S=[],C=[],x=[],I=[],v=[],h=null,w=0,O=null,P=d,U=!1,k=0,R=0,D=[],W=new Array(t.length).fill(0);function G(_){D.push(_)}function q(_){let L=t[_].v*(n.maxVolumeParticipationPct/100);return Math.max(0,L-W[_])}function M(_){if(!h)return d;let L=h.side==="long"?(_-h.entryPrice)*h.qty:(h.entryPrice-_)*h.qty;return d+L}function se(_,L,N){let Z=N.o,j=em(d,i);if(!(j>0)||!(Z>0))return;let ee=Xf(Z,L,u),Y=j/ee,ie=q(_),Kt=ee*ie;if(Y>ie){x.push({kind:"entry",barIndex:_,time:N.t,side:L,requestedNotionalUsd:j,maxFillNotionalUsd:Kt,reason:"volume_participation"});return}W[_]+=Y;let qe=Math.abs(ee-Z)*Y,He=wa(j,p,l);d-=He.total,f+=He.taker,m+=He.builder,g+=qe,b+=j,h={lifecycleEpoch:++R,side:L,entryBarIndex:_,entryReferencePrice:Z,entryPrice:ee,qty:Y,notionalUsd:j,stop:tm(ee,L,i.stopLossPct),take:rm(ee,L,i.takeProfitPct),liq:nm(ee,L,i.maxLeverage,p+l),entryFees:He.taker,entryBuilderFees:He.builder,entrySlippageUsd:qe,fundingAccrued:0}}function K(_,L,N,Z){if(!h)return!1;let j=h.side,ee=L,Y=ee;N!=="liquidation"&&Z&&(Y=Zf(ee,j,u));let ie=h.qty,Kt=ie*Y;if(N!=="liquidation"){let pi=q(_),up=Y*pi;if(ie>pi)return x.push({kind:"exit",barIndex:_,time:t[_].t,side:j,requestedNotionalUsd:Kt,maxFillNotionalUsd:up,reason:"volume_participation",triggerReason:N}),!1;W[_]+=ie}let qe=wa(Kt,p,l),He=N==="liquidation"?0:Math.abs(Y-ee)*ie,Gt,eo;j==="long"?(Gt=(ee-h.entryReferencePrice)*ie,eo=(Y-h.entryPrice)*ie):(Gt=(h.entryReferencePrice-ee)*ie,eo=(h.entryPrice-Y)*ie),d+=eo,d-=qe.total,f+=qe.taker,m+=qe.builder,g+=He,b+=Kt;let cp={side:j,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,exitBarIndex:_,exitTime:t[_].t,exitPrice:Y,exitReason:N,qty:ie,notionalUsd:h.notionalUsd,grossPnlUsd:Gt,feesUsd:h.entryFees+qe.taker,builderFeesUsd:h.entryBuilderFees+qe.builder,fundingUsd:h.fundingAccrued,slippageUsd:h.entrySlippageUsd+He,netPnlUsd:Gt-(h.entryFees+qe.taker+h.entryBuilderFees+qe.builder)-h.fundingAccrued-(h.entrySlippageUsd+He)};return S.push(cp),N==="liquidation"&&C.push({barIndex:_,time:t[_].t,side:j,price:Y,tradeIndex:S.length-1}),h=null,R+=1,k=_+1+(i.cooldownBars||0),!0}function $e(_,L,N,Z){let j=_+1;if(j>=t.length)return;D.some(Y=>Y.kind==="exit"&&Y.side===L&&Y.fillBar===j&&Y.epoch===Z)||G({kind:"exit",side:L,signalBar:_,fillBar:j,reason:N,epoch:Z})}function Or(_){let L=D.filter(N=>N.fillBar===_);for(let N=D.length-1;N>=0;N--)D[N].fillBar===_&&D.splice(N,1);L.sort((N,Z)=>{let j=ee=>ee.kind==="exit"?0:1;return j(N)-j(Z)});for(let N of L)if(N.kind==="exit"){if(!h||h.side!==N.side||h.lifecycleEpoch!==N.epoch)continue;let Z=N.reason||"rule";K(_,t[_].o,Z,!0)||$e(_,N.side,Z,N.epoch)}else if(N.kind==="entry"){if(h||N.epoch!==R||_<k)continue;se(_,N.side,t[_])}}function Tr(_){if(!h)return;let L=t[_],N=L.fundingPaymentRate;if(N==null||!Fe(N)||N===0)return;let Z=Math.abs(h.qty*L.c),j=N*Z;h.side==="long"?(d-=j,h.fundingAccrued+=j,y+=j):(d+=j,h.fundingAccrued-=j,y-=j)}function Nr(_){if(!h)return;let L=t[_].o;(h.side==="long"?L<=h.liq:L>=h.liq)&&K(_,L,"liquidation",!1)}function ai(_){if(!h)return;let L=t[_],N=h.side,Z=im(L,N,h.liq),j=om(L,N,h.stop),ee=sm(L,N,h.take),Y=ie=>N==="long"?Math.min(ie,L.o):Math.max(ie,L.o);if(Z){K(_,Y(h.liq),"liquidation",!1);return}if(j&&ee){K(_,Y(h.stop),"stop_loss",!0)||$e(_,N,"stop_loss",h.lifecycleEpoch);return}if(j){K(_,Y(h.stop),"stop_loss",!0)||$e(_,N,"stop_loss",h.lifecycleEpoch);return}ee&&(K(_,h.take,"take_profit",!0)||$e(_,N,"take_profit",h.lifecycleEpoch))}for(let _=0;_<t.length;_++){let L=Math.floor(t[_].t/864e5);L!==O&&(O=L,P=M(t[_].o),U=!1),Nr(_),Or(_),ai(_),Tr(_),!U&&M(t[_].c)<=P*(1-i.maxDailyLossPct/100)&&(U=!0,I.push({type:"daily_loss_limit",barIndex:_,time:t[_].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let N=a[_].signals,Z=_+c;if(h)(h.side==="long"&&N.exitLong===!0||h.side==="short"&&N.exitShort===!0)&&Z<t.length&&(D.some(ie=>ie.kind==="exit"&&ie.side===h.side&&ie.fillBar===Z&&ie.epoch===h.lifecycleEpoch)||G({kind:"exit",side:h.side,signalBar:_,fillBar:Z,reason:"rule",epoch:h.lifecycleEpoch}));else{let ee=N.entryLong===!0,Y=N.entryShort===!0;ee&&Y?I.push({type:"conflicting_entry_signals",barIndex:_,time:t[_].t,message:"conflicting entry signals; no position opened"}):!U&&(ee||Y)&&Z<t.length&&_>=k&&G({kind:"entry",side:ee?"long":"short",signalBar:_,fillBar:Z,epoch:R})}let j=d;h&&(w+=1,j=M(t[_].c)),v.push({barIndex:_,time:t[_].t,equity:j,positionSide:h?h.side:null})}let ci=null;if(h){let _=t.length-1;if(K(_,t[_].c,"end_of_data",!0))v[_]={barIndex:_,time:t[_].t,equity:d,positionSide:null};else{let N=M(t[_].c);ci={side:h.side,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,qty:h.qty,notionalUsd:h.notionalUsd,markPrice:t[_].c,markedEquityUsd:N},I.push({type:"open_position_at_end",barIndex:_,time:t[_].t,message:"end-of-data exit missed; position remains open and marked"})}}let ui=(h?M(t[t.length-1].c):d)-n.initialEquityUsd,op=ui/n.initialEquityUsd*100,li=0,Yn=0,Jn=0;for(let _ of S)_.netPnlUsd>0?(li+=1,Yn+=_.netPnlUsd):_.netPnlUsd<0&&(Jn+=-_.netPnlUsd);let Xn=S.length,sp=Xn===0?0:li/Xn,Zn=0;Jn>0?Zn=Yn/Jn:Yn>0&&(Zn=1e12);let ip={netPnlUsd:ui,netPnlPct:op,maxDrawdownPct:cm(v),winRate:sp,profitFactor:Zn,tradeCount:Xn,sharpe:am(v),turnoverUsd:b,exposurePct:w/t.length*100},ap={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},di={barsHash:o,strategyHash:s.strategyHash,compilerHash:pt,compilerVersion:nr,config:ap,trades:S,equityCurve:v,metrics:ip,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:y,slippageUsd:g},liquidations:C,missedFills:x,openPositionAtEnd:ci,flags:I};return Fo(di),Uo(Lr(di))}var Qf,Br=E(()=>{ft();dt();Qf=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as um}from"node:crypto";function ym(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Lo(t);return Object.freeze(e)}for(let t of Object.keys(e))Lo(e[t]);return Object.freeze(e)}function bm(e){return String(e).trim().replace(/\s+/g," ")}function wm(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function xm(e){for(let r of dm)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 Sm(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 lm.has(r)?r:null}function km(e){let t={...fm},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 s=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);s&&(t.positionSizePct=Number(s[1]));let i=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return i&&(t.maxNotionalUsd=Number(i[1])),t}function vm(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 Em(e){let t=um("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 Am(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 s=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:s}}function Im(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 _m(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 Cm(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Sa(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 Om({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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 p=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:p,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:s,name:i,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Sa(a.fast),ema_right_period:Sa(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Tm({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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:s,name:i,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 Nm({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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:s,name:i,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 ka(e,t={}){if(typeof e!="string")throw new ce("prompt must be a string");if(e.length>1e3)throw new ce("prompt length must be <= 1000");if(!ym(t))throw new ce("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new ce("options.nowMs is required integer epoch ms");let r=t.nowMs,n=gm;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ce("expiresInMs must be an integer");if(n=t.expiresInMs,n<mm||n>hm)throw new ce("expiresInMs must be between 1h and 30d")}if(pm.test(e))throw new ce(`prompt appears to contain secrets and is rejected. ${Tt}`);let o=bm(e);if(!o)throw new ce(`empty prompt. ${Tt}`);if(vm(o))throw new ce(`duplicate interval or risk clause. ${Tt}`);let s=wm(o),i=xm(o),a=Sm(o);if(!s||!i||!a)throw new ce(`could not parse side/coin/interval. ${Tt}`);let c=km(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new ce("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new ce("position size out of range");let u=r+n,p=Em(o),l=`Draft ${i} ${s}`.slice(0,100),d=Am(o),f=Im(o),m=_m(o),y=[d,f,m].filter(Boolean);if(y.length!==1)throw new ce(`unsupported or ambiguous prompt. ${Tt}`);if(!Cm(o,y[0]))throw new ce(`unsupported or ambiguous prompt. ${Tt}`);let g,b=y[0],S={side:s,coin:i,interval:a,risk:c,expiresAt:u,id:p,name:l,spec:b};b.kind==="ema_cross"?g=Om(S):b.kind==="rsi"?g=Tm(S):g=Nm(S);let C=qo(g,{nowMs:r});if(!C.ok)throw new ce(`draft failed validation: ${C.errors.map(x=>x.message).join("; ")}`);return Lo(de(g,{nowMs:r}))}var ce,lm,dm,pm,Tt,fm,mm,hm,gm,va=E(()=>{dt();ce=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},lm=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),dm=new Set(["BTC","ETH","SOL","HYPE"]),pm=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Tt="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",fm=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),mm=36e5,hm=30*864e5,gm=864e5});import{createHash as Rm}from"node:crypto";function Ia(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 _a(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Mo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Mo(t);return Object.freeze(e)}for(let t of Object.keys(e))Mo(e[t]);return Object.freeze(e)}function cr(e){if(Array.isArray(e))return e.map(cr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=cr(e[r]);return t}return e}function Mr(e){return JSON.stringify(cr(e))}function Pm(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],s=Math.floor((r-t)/n+1e-9);for(let a=0;a<=s;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 i=o[o.length-1];if(Math.abs(i-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function $m(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],s=[];for(let i of r)for(let a of o)s.push({...i,[n]:a});r=s}return r.sort((n,o)=>{let s=Mr(n),i=Mr(o);return s<i?-1:s>i?1:0}),r}function Do(e,t,r,n,o){let s=0;if(e==="maxDrawdownPct"){if(s=t.maxDrawdownPct-n.maxDrawdownPct,s!==0)return s<0}else if(s=t[e]-n[e],s!==0)return s>0;let i=Mr(r),a=Mr(o);return i<a}function Ca(e,t,r={}){if(!_a(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Ia(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Ea)throw new TypeError(`maxTrials must be an integer 1..${Ea}`);o=x}let s=r.objective??"netPnlUsd";if(!Aa.has(s))throw new TypeError(`objective must be one of ${[...Aa].join("|")}`);let i=r.backtestOptions??{};if(!_a(i))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(i))if(Ia(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=de(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},p=1;for(let x of c){let I=Pm(a.parameters[x]);if(I.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=I,p*=I.length}let l=$m(c,u);if(l.length===0)throw new Error("parameter grid is empty");let d=l.slice(0,o),f=[],m=null,y=null;for(let x of d){let I=sr(a,x),v=Je(I,t,i);y==null&&(y=v.config);let h={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},w={parameters:{...x},metrics:h};f.push(w),(!m||Do(s,h,x,m.metrics,m.parameters))&&(m=w)}f.sort((x,I)=>Do(s,x.metrics,x.parameters,I.metrics,I.parameters)?-1:Do(s,I.metrics,I.parameters,x.metrics,x.parameters)?1:0);let g={...m.parameters},b=sr(a,g),S={strategyHash:At(a),compilerHash:pt,trainBarsHash:tr(t),backtestConfig:y,objective:s,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:g,bestStrategy:b},C={id:Rm("sha256").update(JSON.stringify(cr(S)),"utf8").digest("hex"),...S};return Mo(cr(JSON.parse(JSON.stringify(C))))}var Ea,Aa,Oa=E(()=>{ft();dt();Br();Ea=256,Aa=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import ze from"node:fs";import jr from"node:path";function Hr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Le(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Bm(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Nt(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Nt(r,`${t}[${n}]`));return}if(Hr(e))for(let[r,n]of Object.entries(e)){let o=Bm(r);if(qm.some(s=>o.includes(s)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Nt(n,`${t}.${r}`)}}function Um(e){if(typeof e!="string"||!e||!jr.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Ta(e){let t;try{t=ze.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 Fm(){return{version:Ho,runners:[]}}function Na(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Hr(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Ho)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 Nt(r,jr.basename(t)),{version:Ho,runners:r.runners.map(n=>Le(n))}}function Ra(e,t){Nt(t,"store");let r=jr.dirname(e);ze.mkdirSync(r,{recursive:!0,mode:448});let n=jr.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
-
`;try{ze.writeFileSync(n,o,{mode:384,flag:"wx"}),ze.renameSync(n,e);try{ze.chmodSync(e,384)}catch{}}catch(s){try{ze.unlinkSync(n)}catch{}throw s}}function Pa(e={}){let t=e.path;if(Um(t),Ta(t),ze.existsSync(t)?Na(ze.readFileSync(t,"utf8"),t):Ra(t,Fm()),jo.has(t))return jo.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 s(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((y,g)=>{n.push({fn:m,resolve:y,reject:g}),queueMicrotask(o)})}function i(){return Ta(t),Na(ze.readFileSync(t,"utf8"),t)}function a(m){Ra(t,m)}function c(m){if(!Hr(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Nt(m,"record");let y=i();if(y.runners.some(b=>b.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let g=Le(m);return y.runners.push(g),a(y),Le(g)}function u(m){let y=i().runners.find(g=>g.id===m);return y?Le(y):null}function p(){return i().runners.map(m=>Le(m))}function l(m,y){if(typeof y!="function")throw new Error("shadow-store: updater must be a function");let g=i(),b=g.runners.findIndex(x=>x.id===m);if(b<0)throw new Error(`shadow-store: runner not found: ${m}`);let S=Le(g.runners[b]),C=y(S);if(!Hr(C)||C.id!==m)throw new Error("shadow-store: updater must return record with same id");return Nt(C,"record"),g.runners[b]=Le(C),a(g),Le(g.runners[b])}function d(m){let y=i(),g=y.runners.findIndex(S=>S.id===m);if(g<0)throw new Error(`shadow-store: runner not found: ${m}`);let b=Le(y.runners[g]);return b.status!=="stopped"&&(b.status="stopped",y.runners[g]=b,a(y)),Le(y.runners[g])}let f={create(m){return s(()=>c(m))},get(m){return u(m)},list(){return p()},update(m,y){return s(()=>l(m,y))},stop(m){return s(()=>d(m))}};return jo.set(t,f),f}var Ho,qm,jo,$a=E(()=>{Ho=1,qm=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];jo=new Map});import{createHash as Wo}from"node:crypto";function zo(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Vo(e){return Array.isArray(e)?e.map(Vo):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Vo(e[t])])):e}function Ba(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Wo("sha256").update(JSON.stringify(Vo(e))).digest("hex")}function Lm(e,t,r,n,o){return Wo("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Dm(e,t,r,n){return Wo("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Mm(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function qa(e){return e==="entryLong"||e==="entryShort"}function Ko({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Pa({path:e});function n({strategy:c,evidenceId:u=null}={}){let p=pe(c),l=u==null?null:String(u),d=r.list().filter(b=>b.status==="running"&&b.strategyHash===p.strategyHash&&b.compilerHash===p.compilerHash&&b.evidenceId===l).sort((b,S)=>b.createdAt-S.createdAt||b.id.localeCompare(S.id))[0];if(d)return zo(d);let f=t(),m=Dm(f,p.strategyHash,p.compilerHash,l),y=r.get(m);if(y)return zo(y);let g={id:m,strategy:zo(p.strategy),strategyHash:p.strategyHash,compilerHash:p.compilerHash,evidenceId:l,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(g)}function o(c){return r.get(c)}function s(){return r.list()}function i(c){return r.stop(c)}function a(c,u,{markoutHorizons:p=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,l=>{if(l.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return l;let f=pe(l.strategy).evaluateAll(u),m=new Map;for(let k=0;k<u.length;k++)m.set(u[k].t,k);let y=l.cursor,g=[];for(let k=0;k<u.length;k++){let R=u[k].t;(y==null||R>y)&&g.push(k)}if(g.length===0)return l;let b=new Map(l.intendedOrders.map(k=>[k.id,k])),S=new Set(l.fills.map(k=>k.orderId)),C=new Map(l.missedFills.map(k=>[k.orderId,k])),x=(k,R)=>`${k}|${R}`,I=new Map(l.markouts.map(k=>[x(k.orderId,k.horizon),k])),v=l.position?{...l.position}:null,h=Number.isInteger(l.cooldownBarsRemaining)?Math.max(0,l.cooldownBarsRemaining):0,w=Number.isFinite(l.cooldownStartT)?l.cooldownStartT:null;function O({action:k,signalBarT:R,signalIndex:D}){let W=Mm(k),G=Lm(l.id,l.strategyHash,R,W,k);if(b.has(G))return b.get(G);let q=D+1,M=q<u.length,se={id:G,action:k,type:k,side:W,signalBarT:R,fillBarT:M?u[q].t:null,status:M?"open":"missed"};return b.set(G,se),l.intendedOrders.push(se),se}function P(k,R,D){if(S.has(k.id))return;let W={orderId:k.id,action:qa(k.action)?"entry":"exit",side:k.side,price:R.o,barT:R.t,signalBarT:k.signalBarT,barIndex:D};if(l.fills.push(W),S.add(k.id),k.status="filled",k.fillBarT=R.t,C.has(k.id)&&(C.delete(k.id),l.missedFills=l.missedFills.filter(G=>G.orderId!==k.id)),qa(k.action)){v={side:k.action==="entryLong"?"long":"short",entryOrderId:k.id,entryBarT:R.t,entryPrice:R.o,entryBarIndex:D};for(let G of p){let q=x(k.id,G);if(I.has(q))continue;let M={orderId:k.id,horizon:G,entryBarT:R.t,entryPrice:R.o,side:v.side,status:"pending",close:null,barT:null};I.set(q,M),l.markouts.push(M)}}else v=null,h=Number(l.strategy?.risk?.cooldownBars)||0,w=R.t}function U(k){if(S.has(k.id)||C.has(k.id))return;let R={orderId:k.id,action:k.action,side:k.side,signalBarT:k.signalBarT,status:"missed"};C.set(k.id,R),l.missedFills.push(R),k.status="missed"}for(let k of l.intendedOrders){if(k.status==="filled"||S.has(k.id))continue;let R=m.get(k.signalBarT);if(R==null)continue;let D=R+1;D<u.length&&(y==null||u[D].t>y)&&P(k,u[D],D)}for(let k of g){let R=u[k],D=f[k].signals,W=v,G=M=>{if(v||h>0&&(w==null||R.t>=w))return;let K=O({action:M,signalBarT:R.t,signalIndex:k}),$e=k+1;$e<u.length?P(K,u[$e],$e):U(K)},q=M=>{if(!v||v.side==="long"&&M!=="exitLong"||v.side==="short"&&M!=="exitShort")return;let se=O({action:M,signalBarT:R.t,signalIndex:k}),K=k+1;K<u.length?P(se,u[K],K):U(se)};W?(D.exitLong&&q("exitLong"),D.exitShort&&q("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&G("entryLong"),D.entryShort&&G("entryShort")),h>0&&w!=null&&R.t>=w&&(h-=1,h===0&&(w=null)),l.cursor=R.t,l.lastProcessedBarIndex=k}for(let k of l.markouts){if(k.status!=="pending")continue;let R=l.fills.find(G=>G.orderId===k.orderId&&G.action==="entry");if(!R)continue;let D=m.get(R.barT);if(D==null)continue;let W=D+k.horizon;if(W<u.length){k.close=u[W].c,k.barT=u[W].t,k.status="filled";let G=k.entryPrice;k.markout=k.side==="long"?(k.close-G)/G:(G-k.close)/G}}return l.position=v,l.cooldownBarsRemaining=h,l.cooldownStartT=w,l.updatedAt=t(),l})}return{start:n,step:a,list:s,get:o,stop:i}}var Ua=E(()=>{ft();$a()});var Da={};Q(Da,{runStrategyOperation:()=>Qm});import jm from"node:os";import Hm from"node:path";function ur(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Qo(e){if(Array.isArray(e)){for(let t of e)Qo(t);return}if(ur(e))for(let[t,r]of Object.entries(e)){if(zm.some(n=>Vm(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Qo(r)}}function Wm(e){if(!ur(e))throw new TypeError("strategy input must be a plain object");return Qo(e),e}function Km(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 Go(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=_o(e.venue),s=r.fetchBars??o.fetchBars;if(typeof s!="function")throw new Error(`strategy venue ${o.id} does not support history`);let i=await s({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n}),a=Array.isArray(i)?i:i?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Yo(e,t){let r=e.backtestOptions??{};if(!ur(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Fa(e,t,r,n,o={}){let s=e.evidenceOptions??{};if(!ur(s))throw new TypeError("evidenceOptions must be a plain object");return{...s,...o,strategy:t,bars:r,backtestOptions:Yo(e,n)}}function La(){return Hm.join(jm.homedir(),".oracle","strategy-shadow.json")}function Gm(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 Qm(e,t={},r={}){let n=Wm(t),o=Km(n,r);if(e==="draft")return{strategy:ka(n.prompt,{nowMs:o})};if(e==="validate"){let s=pe(n.strategy);if(s.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:s.strategy,strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:s.compilerVersion,requiredSeries:s.requiredSeries}}if(e==="backtest"||e==="evidence"){let s=pe(n.strategy),i=await Go(s.strategy,n,r,o);ar(s,i);let a=So(Fa(n,s.strategy,i,o));return e==="evidence"?a:{backtest:Je(s.strategy,i,Yo(n,o)),evidence:a}}if(e==="optimize"){let s=pe(n.strategy),i=await Go(s.strategy,n,r,o);ar(s,i);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 p=i.slice(0,Math.floor(i.length*u)),l=n.options??{};if(!ur(l))throw new TypeError("options must be a plain object");let d=Ca(s.strategy,p,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Yo(n,o)}),f=d.bestStrategy;return{strategy:f,optimization:d,evidence:So(Fa(n,f,i,o,{trainFraction:u}))}}if(e==="shadow"){let s=Ko({storePath:r.storePath??La(),clock:()=>o}),i=n.action;if(i==="start")return await s.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(i==="list")return await s.list();if(i==="get")return await s.get(n.id);if(i==="stop")return await s.stop(n.id);if(i==="step"){let a=await s.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await Go(a.strategy,n,r,o);return ar(pe(a.strategy),c),await s.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${i}`)}if(e==="prepare"){let s=pe(n.strategy),i=_o(s.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ko({storePath:r.storePath??La(),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!==s.strategyHash||c.compilerHash!==s.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??Gm(s.strategy,o);return i.prepareIntent({strategy:s.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Ba(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 zm,Ma=E(()=>{Br();ft();ko();va();Oa();Ua();Co();zm=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var ec={};Q(ec,{DEFAULT_CROSS_CHAIN_SOURCES:()=>Ga,DEFAULT_SAME_CHAIN_SOURCES:()=>Ka,NATIVE_TOKEN:()=>Jo,canonicalJson:()=>Ya,hashFirmQuote:()=>Za,hashRfqIntent:()=>Xa,normalizeFirmQuote:()=>Zo,normalizeRfqIntent:()=>th,sha256Hex:()=>lr});import{createHash as Ym}from"node:crypto";import{getAddress as Wa,isAddress as Xo}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Ha(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function zr(e,t){let r=String(e??"").trim();return(!Jm.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function Xm(e,t){return e==null||e===""?null:zr(e,t)}function za(e,t){let r=String(e??"").trim();return r.toLowerCase()===Jo.toLowerCase()?Jo:(Xo(r)||re(t,"must be an EVM address or native token sentinel"),Wa(r))}function Qa(e,t){let r=String(e??"").trim();return Xo(r)||re(t,"must be an EVM address"),Wa(r)}function Zm(e,t){return e==null||e===""?null:Qa(e,t)}function Va(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 eh(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 Rt(e){if(Array.isArray(e))return e.map(Rt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=Rt(e[r]));return t}return e}function Ya(e){return JSON.stringify(Rt(e))}function lr(e){return`0x${Ym("sha256").update(Ya(e)).digest("hex")}`}function Ja(e,t){let r={...e};for(let n of t)delete r[n];return r}function Xa(e){return lr(Ja(e,["intentHash"]))}function Za(e){return lr(Ja(e,["firmQuoteHash"]))}function th(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=Ha(e.fromChainId??e.fromChain,"fromChainId"),s=Ha(e.toChainId??e.toChain,"toChainId"),a=o===s?Ka:Ga,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:s,sellToken:za(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:za(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:zr(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Qa(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:eh(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:Xm(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Va(e.allowedSources,"allowedSources",a),allowedRouters:Va(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)?Rt(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):lr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Xa(c),Object.freeze(c)}function rh(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!ja.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ja.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!Xo(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"),Rt(e)}function Zo(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 s=String(t.source??t.provider??"").trim();s||re("source","required"),e.allowedSources.includes(s)||re("source","not allowed by intent");let i=zr(t.amountOut??t.buyAmount,"amountOut"),a=zr(t.minBuyAmount??t.minOut??i,"minBuyAmount");BigInt(a)>BigInt(i)&&re("minBuyAmount","exceeds amountOut");let c=rh(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 p=Zm(t.router??t.settlementRouter??c.to,"router"),l={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:s,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:p,amountOut:i,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)?Rt(t.metadata):{}};return l.quoteId||(l.quoteId=lr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=Za(l),Object.freeze(l)}var Jo,Ka,Ga,ja,Jm,es=E(()=>{Jo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ka=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),Ga=Object.freeze(["lifi"]),ja=/^0x[0-9a-fA-F]{64}$/,Jm=/^\d+$/});import{readFileSync as nh}from"node:fs";import{homedir as oh}from"node:os";import{join as Vr}from"node:path";function sh(){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=oh();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Vr(t,".config","oracle")).trim();return[e,Vr(r,"exec.env")].filter(Boolean)}return[e,Vr(t,".config","oracle","exec.env"),Vr(t,".config","mad-desk","exec.env")].filter(Boolean)}function tc(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of sh())try{let s=nh(o,"utf8"),i=s.match(new RegExp(`^${t}=(.*)$`,"m"))||s.match(new RegExp(`^${r}=(.*)$`,"m"));if(i&&(n=i[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 rc=E(()=>{});var nc=E(()=>{});import{createHash as ih,createHmac as sc,timingSafeEqual as ah}from"node:crypto";function Kr(e){return Array.isArray(e)?`[${e.map(Kr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Kr(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function ic(e,{required:t=!1}={}){try{return tc(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function rs(e){let{signature:t,...r}=e;return r}function ac(e,{secret:t}={}){let r=ic(t);return r?{...e,signature:sc("sha256",r).update(Kr(rs(e))).digest("hex")}:e}function ch(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 ih("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 s=ic(o);if(s){let f=sc("sha256",s).update(Kr(rs(e))).digest("hex");if(!uh(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let i=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(i)||i<0||i>Wr||!Number.isInteger(a)||a<0||a>Wr||i>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 p=c*BigInt(1e4-i),l=p/10000n;if(p%10000n!==0n&&(l+=1n),u<l)throw new Error("auto-slippage guard is under-protected relative to its quote");let d=ph(n);if(d!=null&&d!==u)throw new Error(`auto-slippage: calldata encodes floor ${d}, not the guard floor ${u} \u2014 refusing to bind`);return ac({...rs(e),calldataHash:ch(n)},{secret:o})}function uh(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:ah(r,n)}function ts(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function lh(e){let t=e==null?Wr: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,Wr)}function Ve({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=ts(e,0),i=s>0?s>=25e4?5:s>=1e5?10:s>=5e4?20:s>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(ts(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ts(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+i+a+c)),p=lh(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,p),capBps:p,executable:u<=p}}function dh({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=oc,secret:p}={}){let l=BigInt(r??0);if(l<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let d=Ve({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:a});if(!d.executable)throw new Error(`auto-slippage requires ${d.requiredBps} bps above hard/requested cap ${d.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)||oc)),y=l*BigInt(1e4-d.selectedBps),g=y/10000n;if(y%10000n!==0n&&(g+=1n),g>l&&(g=l),l>0n&&g<=0n)throw new Error(`auto-slippage: quote ${l} is too small to express a ${d.selectedBps} bps floor without rounding to zero`);let b=Number((l-g)*10000n/(l===0n?1n:l));if(b>d.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${d.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ac({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:l.toString(),minAmountOut:g.toString(),requiredBps:d.requiredBps,selectedBps:d.selectedBps,capBps:d.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:p})}function ph(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 s=10;s+64<=t.length;s+=64)n.push(t.slice(s,s+64));let o=s=>n[s]==null?null:BigInt("0x"+n[s]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let s=o(0);if(s==null)return null;let i=Number(s)/32;return!Number.isInteger(i)||i<0?null:o(i+4)}case"0xb858183f":{let s=o(0);if(s==null)return null;let i=Number(s)/32;return!Number.isInteger(i)||i<0?null:o(i+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:s,crossChain:i,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let p=dh({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:p,amountOutMinimum:p.minAmountOut}}var Wr,oc,We=E(()=>{rc();nc();Wr=100,oc=2e4});function ns(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:et}var et,Gr=E(()=>{et="0x000000000000000000000000000000000000dEaD"});import{Contract as fh,JsonRpcProvider as mh}from"ethers";function xh(e){return wh.test(String(e||""))}async function cc(e,{contract:t=hh,rpc:r=yh,chainId:n=gh,balanceOf:o}={}){if(!xh(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let s=new mh(r,n,{staticNetwork:!0}),i=new fh(t,bh,s);return BigInt(await i.balanceOf(e))}var hh,gh,yh,bh,wh,uc=E(()=>{hh="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",gh=999,yh="https://rpc.hyperliquid.xyz/evm",bh=["function balanceOf(address owner) view returns (uint256)"],wh=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Sh,readFileSync as kh,lstatSync as vh}from"node:fs";import{homedir as lc}from"node:os";import{join as os}from"node:path";function Ih(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(dc,t)?dc[t]:Ah}function Nh(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[pc])return String(e[pc]);let t=e.ORACLE_CONFIG_DIR||os(lc(),".config","oracle");return os(t,"fee-recipient")}return os(lc(),".config","oracle","fee-recipient")}function Rh(e=process.env){try{let t=Nh(e);if(!Sh(t)||vh(t).isSymbolicLink())return"";let r=kh(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Ph(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),Eh)}function $h({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ch]||"").trim(),o=String(e[Oh]||Th).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let s=Ih(t),i=Ph(e[_h],{fallback:n?s:0}),a=Math.min(i,s);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=Rh(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 Qr({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let s=$h({env:t,action:r,admin:o});if(o===!0)return{...s,holderVerificationStatus:"admin-oracle"};let i=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(i))return{...s,holderVerificationStatus:"wallet-required"};try{return BigInt(await cc(i,n))>0n?{...s,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...s,holderVerificationStatus:"non-holder"}}catch{return{...s,holderVerificationStatus:"unavailable"}}}function fc(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 mc(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function hc(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Eh,Ah,dc,_h,Ch,Oh,pc,Th,Yr=E(()=>{uc();Eh=100,Ah=5,dc=Object.freeze({swap:5,bridge:5,perps:0,nft:0});_h="ORACLE_INTEGRATOR_FEE_BPS",Ch="ORACLE_INTEGRATOR_FEE_RECIPIENT",Oh="ORACLE_INTEGRATOR_ID",pc="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Th="oracle"});var as={};Q(as,{LIFI_API:()=>yc,lifiChains:()=>Lh,lifiHealth:()=>Uh,lifiPrepare:()=>Fh,lifiQuote:()=>ht});function is(e={}){return(e.baseUrl||process.env.LIFI_API_URL||yc).replace(/\/$/,"")}function Bh(e){let t=String(e||ss).toLowerCase();return t===ss.toLowerCase()||t===qh}function gc(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 Uh(e={}){let t=await T(`${is(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 ht(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=ss,toToken:s,fromAmount:i,fromAddress:a=et}=e;if(r==null||!s||!i)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:s,fromAmount:String(i),fromAddress:a}),u=Ve({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 p=await Qr({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(mc(p)))c.set(g,b);let l=await T(`${is(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),d=l?.estimate?.toAmount||l?.toAmount;if(!d)return{...l,autoSlippagePolicy:u,oracleFee:p};let f=l?.transactionRequest?.to||l?.estimate?.approvalAddress||"lifi",m=ae(l,{chainId:Number(r),venue:f,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),y=l?.estimate?.toAmountMin||l?.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:p}}async function Fh(e={},t={}){let r=await ht(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 s=null;if(!Bh(e.fromToken)){let i=r?.estimate?.approvalAddress||r?.approvalAddress;if(!i)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;s={token:gc(a,"approval token"),spender:gc(i,"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:s,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 Lh(e={}){return T(`${is(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var yc,ss,qh,dr=E(()=>{z();We();Gr();fe();Yr();yc="https://li.quest/v1";ss="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qh="0x0000000000000000000000000000000000000000"});var xc={};Q(xc,{PARASWAP_API:()=>bc,paraswapHealth:()=>Mh,paraswapPrepare:()=>Dh,paraswapPrice:()=>$t,paraswapTokens:()=>wc});function Pt(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 wc(e={},t={}){let r=Number(e.chainId||1);return T(`${cs(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $t(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Pt(e.srcToken,"srcToken"),destToken:Pt(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 Qr({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(hc(o)))n.set(a,c);let s=await T(`${cs(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=s?.priceRoute?.destAmount;return i?{...ae(s,{chainId:r,venue:s?.priceRoute?.contractAddress||"paraswap-quote",amountOut:i,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}:{...s,executionReady:!1,oracleFee:o}}async function Dh(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=Pt(e.userAddress,"userAddress"),o=await $t(e,t),s=o?.priceRoute,i=String(s?.contractAddress||"").toLowerCase();if(!i)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Pt(e.srcToken,"srcToken"),destToken:Pt(e.destToken,"destToken"),srcAmount:String(s.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:s,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Pt(e.receiver,"receiver"));let c=await T(`${cs(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()!==i)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:s.tokenTransferProxy||i,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 Mh(e={}){let t=await wc({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var bc,cs,Jr=E(()=>{z();We();fe();Yr();bc="https://api.paraswap.io",cs=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||bc).replace(/\/$/,"")});function Xr({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let i=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(i===String(t).replace(/\/$/,""))return{baseUrl:i,trusted:!0,host:kc(t)};let a;try{a=new URL(i)}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([kc(t),...r]).has(c)){let p=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!p?{baseUrl:i,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:i,trusted:!0,host:c}}if(String(process.env[Sc]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Sc}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function kc(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Zr(e,t,r){let n={...e};if(!r)return n;for(let[o,s]of Object.entries(t||{}))s&&(n[o]=s);return n}var Sc,us=E(()=>{Sc="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Cc={};Q(Cc,{ZEROX_API:()=>vc,zeroxHealth:()=>jh,zeroxPrepare:()=>Hh,zeroxPrice:()=>_c,zeroxQuote:()=>qt});function Ec(e={}){return Xr({provider:"zerox",defaultUrl:vc,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Ac(e={}){return Ec(e).baseUrl}function en(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Ic(e={}){return Zr({"0x-version":"v2",accept:"application/json"},{"0x-api-key":en(e)},Ec(e).trusted)}async function jh(e={}){if(!en(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await _c({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 _c(e={},t={}){if(!en(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:s,taker:i}=e;if(!n||!o||!s)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(s)});return i&&a.set("taker",i),T(`${Ac(t)}/swap/allowance-holder/price?${a}`,{headers:Ic(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function qt(e={},t={}){if(!en(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:s,taker:i}=e;if(!n||!o||!s)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=Ve({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(s),slippageBps:String(a.selectedBps)});i&&c.set("taker",i);let u=await T(`${Ac(t)}/swap/allowance-holder/quote?${c}`,{headers:Ic(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),p=u?.buyAmount||u?.grossBuyAmount;return p?ae(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Hh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await qt(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),s=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:s,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 vc,tn=E(()=>{z();We();us();fe();vc="https://api.0x.org"});var WS,Oc=E(()=>{WS=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Lc={};Q(Lc,{COW_CANCEL_TYPES:()=>$c,COW_HOSTS:()=>ds,COW_ORDER_TYPES:()=>rn,COW_SETTLEMENT:()=>Nc,COW_VAULT_RELAYER:()=>Rc,cowCancelOrders:()=>t0,cowChains:()=>o0,cowHealth:()=>Gh,cowOrder:()=>Fc,cowOrderStatus:()=>Uc,cowOrderUid:()=>Yh,cowPrepareCancel:()=>Zh,cowPrepareOrder:()=>Qh,cowQuote:()=>gt,cowSignCancel:()=>e0,cowSignOrder:()=>Jh,cowSubmitSignedOrder:()=>Xh,cowVerifyOrderFill:()=>n0});import{TypedDataEncoder as Tc,getAddress as pr,isAddress as zh}from"ethers";function nn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=ds[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Vh(e,t="v1",r={}){let n=nn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function tt(e,t){let r=String(e||"").trim();if(!zh(r))throw new Error(`cowswap: ${t} must be an address`);return pr(r).toLowerCase()}function Bt(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 qc(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 Bc(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 Wh({digest:e,owner:t,validTo:r}={}){let n=qc(e,"order digest").slice(2),o=tt(t,"owner").slice(2).toLowerCase(),s=Number(r);if(!Number.isInteger(s)||s<0||s>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${s.toString(16).padStart(8,"0")}`.toLowerCase()}function ps(e){let t=Nc[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:pr(t)}}function Kh(e={},t,r){let n=tt(e.sellToken,"sellToken"),o=tt(e.buyToken,"buyToken"),s=tt(e.receiver||r,"receiver"),i=Number(e.validTo);if(!Number.isInteger(i)||i<=0)throw new Error("cowswap: quote.validTo required");let a=qc(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:s,sellAmount:Bt(e.sellAmount,"sellAmount"),buyAmount:Bt(e.buyAmount,"buyAmount"),validTo:i,appData:a,feeAmount:Bt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Gh(e={}){try{let t=await gt({chainId:1,sellToken:ls[1],buyToken:Pc[1],sellAmountBeforeFee:"1000000000000000",from:et},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 gt(e={},t={}){let r=Number(e.chainId??1),n=ns(e.from||e.owner),o=e.sellToken||ls[r],s=e.buyToken||Pc[r],i=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!s||i==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ls[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:s,from:n,receiver:e.receiver||n,sellAmountBeforeFee:i,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await T(`${nn(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 Qh(e={},t={}){let r=Number(e.chainId??1),n=tt(ns(e.from||e.owner||e.signer),"owner"),o=await gt({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),s=Kh(o?.quote||o,r,n),i=ps(r),a={domain:i,types:rn,primaryType:"Order",message:s},c=Tc.hash(i,rn,s),u=Rc[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:i.verifyingContract.toLowerCase(),vaultRelayer:pr(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:i.verifyingContract.toLowerCase(),vaultRelayer:pr(u).toLowerCase(),sellToken:s.sellToken,buyToken:s.buyToken,sellAmount:s.sellAmount,buyAmount:s.buyAmount,validTo:s.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(s.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:s.sellToken,spender:pr(u).toLowerCase(),amount:s.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Uc(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return T(`${nn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Fc(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return T(`${nn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Yh(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||Tc.hash(ps(r),rn,n),s=e.owner||e.from||e.signer||n.receiver;return Wh({digest:o,owner:s,validTo:n.validTo})}async function Jh(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 Xh(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 Zh(e={}){let t=Number(e.chainId??1),r=tt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((i,a)=>Bc(i,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=ps(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:$c,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function e0(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function t0(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function r0(e={}){return Bt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function n0(e={},t={}){let r=Number(e.chainId??1),n=Bc(e.uid||e.orderUid),o=t.order||await Fc({chainId:r,uid:n},t),s=t.status||o.status||await Uc({chainId:r,uid:n},t).catch(()=>null),i=t.trades||await T(`${Vh(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(i)?i:[],c=e.expectedOwner?tt(e.expectedOwner,"expectedOwner"):null;if(c&&tt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:s,trades:a};let u=0n;for(let d of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(r0(d));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Bt(o.executedBuyAmount,"executedBuyAmount")));let p=e.minBuyAmount!=null?BigInt(Bt(e.minBuyAmount,"minBuyAmount")):0n,l=u>=p&&String(o.status||s?.status||"").toLowerCase()!=="expired";return{ok:l,provider:"cowswap",chainId:r,uid:n,status:o.status||s?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(d=>d.txHash).filter(Boolean))],order:o,orderStatus:s,reason:l?null:"insufficient fill or expired order"}}function o0(){return Object.keys(ds).map(Number)}var ds,Nc,Rc,ls,Pc,rn,$c,on=E(()=>{z();We();Oc();Gr();fe();ds={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"},Nc=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Rc=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ls={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Pc={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"}]}),$c=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function Mc(e){return s0.get(Number(e))||null}function jc(e,t=process.env){let r=Mc(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}var Dc,s0,Hc=E(()=>{Dc={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}},s0=new Map(Object.values(Dc).map(e=>[e.chainId,e]))});import{Interface as i0,getAddress as a0}from"ethers";function fr(e,t){try{return a0(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function u0(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=jc(e,r);return n||c0[Number(e)]||null}function d0(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!l0.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 te(e,t,r=[],n={}){let o=String(t||"");d0(o);let s=u0(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await T(s,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function an(e,t={}){let r=await te(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function zc(e,t={}){let r=await te(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Vc(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await te(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function Wc(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=fr(e.token||e.tokenAddress,"token"),o=fr(e.owner,"owner"),s=fr(e.spender,"spender"),i=sn.encodeFunctionData("allowance",[o,s]),a=await te(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),c=sn.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Kc(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=fr(e.token||e.tokenAddress,"token"),o=fr(e.account||e.owner||e.address,"account"),s=sn.encodeFunctionData("balanceOf",[o]),i=await te(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),a=sn.decodeFunctionResult("balanceOf",i),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var sn,c0,l0,rt=E(()=>{z();Hc();sn=new i0(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);c0={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"};l0=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function h0(e,t,r){let n=Ie(t),o=Ie(r),s=Ie(e?.baseToken?.address),i=Ie(e?.quoteToken?.address);return s===n&&i===o||s===o&&i===n}function g0(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function y0(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||p0).replace(/\/$/,"")}async function fs(e,t={}){if(!e)throw new Error("tokenAddress required");return T(`${y0(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Gc({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await mr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function mr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let s=Ie(f0[Number(e)]||e),i=new Set(m0(n).filter(Boolean).map(Ie)),a=[...new Set([t,r].map(d=>String(d)).filter(Boolean))],c=await Promise.allSettled(a.map(d=>fs(d,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,p=[];for(let d of c)if(d.status==="fulfilled")for(let f of d.value?.pairs||d.value?.data?.pairs||[]){let m=`${Ie(f?.chainId)}:${Ie(f?.dexId)}:${Ie(f?.pairAddress)}`;u.has(m)||(u.add(m),p.push(f))}return p.filter(d=>Ie(d?.chainId)===s).filter(d=>h0(d,t,r)).filter(d=>!i.size||i.has(Ie(d?.dexId))).map(d=>({pairAddress:d.pairAddress??null,dexId:d.dexId??null,chainId:d.chainId??null,liquidityUsd:g0(d),pairCreatedAt:d.pairCreatedAt??null})).filter(d=>d.liquidityUsd!=null).sort((d,f)=>f.liquidityUsd-d.liquidityUsd)}var p0,f0,Ie,m0,cn=E(()=>{z();p0="https://api.dexscreener.com",f0=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Ie=e=>String(e??"").toLowerCase(),m0=e=>Array.isArray(e)?e:e==null?[]:[e]});var nu={};Q(nu,{PANCAKE_FEE_TIERS:()=>un,UNI_V3_CHAINS:()=>me,UNI_V3_FEE_TIERS:()=>Xc,UNI_V3_VENUES:()=>tu,uniV3Chains:()=>E0,uniV3EthUsdc:()=>ru,uniV3Health:()=>v0,uniV3PrepareExactIn:()=>k0,uniV3QuoteExactIn:()=>yt,uniV3QuoteExactInPath:()=>S0});import{Interface as Yc,getAddress as hr,isAddress as Jc}from"ethers";function hs(e,t){let r=Number(e),n=me[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(me).join(", ")})`);let o=tu[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 s=String(t).toLowerCase();if(s===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let i=o,a=i[s];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:s,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ms(e,t){let r=me[Number(t)];if(!e||e===Zc||e===eu||/^eth$/i.test(String(e)))return hr(r.weth);let n=String(e);if(/^weth$/i.test(n))return hr(r.weth);if(/^usdc$/i.test(n))return hr(r.usdc);if(!Jc(n))throw new Error(`invalid token address: ${e}`);return hr(n)}function w0(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 x0(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 yt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=hs(e.chainId??8453,e.venue),i=ms(e.tokenIn||"WETH",r),a=ms(e.tokenOut||me[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=s&&s.length?s:Xc,p=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],l=[],d=null;for(let v of p){let h=ln.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:c,fee:v,sqrtPriceLimitX96:0n}]);try{let w=await te(r,"eth_call",[{to:n,data:h},"latest"],t);if(!w||w==="0x"){l.push({fee:v,ok:!1,error:"empty result"});continue}let O=ln.decodeFunctionResult("quoteExactInputSingle",w),P={fee:v,ok:!0,amountOut:O[0].toString(),sqrtPriceX96After:O[1].toString(),initializedTicksCrossed:Number(O[2]),gasEstimate:O[3].toString()};l.push(P),(!d||BigInt(P.amountOut)>BigInt(d.amountOut))&&(d=P)}catch(w){l.push({fee:v,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!d){let v=l.map(h=>`${h.fee}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${v}`)}let f=e.liquidityUsd==null?await mr({chainId:r,tokenA:i,tokenB:a,dexIds:w0(e.venue)},t).catch(()=>[]):[],m={};for(let v of f.slice(0,8))if(!(!v.pairAddress||!Jc(v.pairAddress)))try{let h=await te(r,"eth_call",[{to:v.pairAddress,data:b0},"latest"],t),w=h&&h!=="0x"&&h.length<=66?Number.parseInt(h,16):NaN;if(!Number.isFinite(w)||w<=0||w>1e6)continue;(m[w]==null||v.liquidityUsd>m[w].liquidityUsd)&&(m[w]=v)}catch{}let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&y>0&&BigInt(d.amountOut)>0n){let v=BigInt(d.amountOut),w=l.filter(O=>O.ok&&Number((v-BigInt(O.amountOut))*10000n/v)<=y).filter(O=>m[O.fee]?.liquidityUsd!=null).sort((O,P)=>m[P.fee].liquidityUsd-m[O.fee].liquidityUsd)[0];w&&w.fee!==d.fee&&(g={priceBestFee:d.fee,chosenFee:w.fee,chosenPoolUsd:m[w.fee].liquidityUsd,bandBps:y},d=w)}let b=m[d.fee]??null,S=f[0]??null,C=b??S,x=e.liquidityUsd??b?.liquidityUsd??S?.liquidityUsd??null,I=e.liquidityUsd!=null?"caller":b?"pool":S?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:me[r].name,quoter:n,tokenIn:i,tokenOut:a,amountIn:c.toString(),fee:d.fee,amountOut:d.amountOut,gasEstimate:d.gasEstimate,liquidityUsd:x,liquiditySource:C,liquidityAttribution:I,liquidityPick:g,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedFees:l,best:!0},{chainId:r,venue:o,amountOut:d.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function S0(e={},t={}){let{chainId:r,quoter:n,router:o}=hs(e.chainId??8453),s=(e.tokens||[]).map(d=>ms(d,r)),i=(e.fees||[]).map(Number);if(s.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=x0(s,i),u=ln.encodeFunctionData("quoteExactInput",[c,a]),p=await te(r,"eth_call",[{to:n,data:u},"latest"],t),l=ln.decodeFunctionResult("quoteExactInput",p);return ae({venue:"uniswap-v3",chainId:r,chain:me[r].name,quoter:n,tokens:s,fees:i,path:c,amountIn:a.toString(),amountOut:l[0].toString(),gasEstimate:l[3].toString()},{chainId:r,venue:o,amountOut:l[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ru(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await yt({chainId:r,tokenIn:me[r].weth,tokenOut:me[r].usdc,amountIn:n,fee:e.fee},t),s=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:s,pair:"WETH/USDC"}}async function k0(e={},t={}){let r=Number(e.chainId??8453),n=hs(r,e.venue),o=hr(e.recipient),s=String(e.tokenIn||"WETH"),i=!e.tokenIn||s===Zc||s===eu||/^eth$/i.test(s),a=await yt(e,t),c=Qc.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),l=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,d=Qc.encodeFunctionData("multicall",[l,[c]]);return J({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:l,quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:Ae(a.autoSlippage,{chainId:r,venue:n.router,data:d})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function v0(e={}){let t=Number(e.chainId??8453);try{let r=await ru({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 E0(){return Object.entries(me).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var me,Xc,b0,ln,Qc,Zc,eu,un,tu,dn=E(()=>{rt();cn();We();fe();me={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"}},Xc=[100,500,3e3,1e4],b0="0xddca3f43",ln=new Yc(["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)"]),Qc=new Yc(["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)"]),Zc="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",eu="0x0000000000000000000000000000000000000000",un=[100,500,2500,1e4],tu={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var cu={};Q(cu,{executeRfqCandidates:()=>iu,rankRfqQuotes:()=>au,requestRfqQuotes:()=>_0,sourceCandidates:()=>su});function gr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function ou(e,t){return String(e?.[t]??"").trim()}function yr(e,t){return Object.freeze({source:e,run:t})}function su(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??me,s=Number(e.fromChainId)===Number(e.toChainId),i=[];return gr(e,"lifi")&&i.push(yr("lifi",async()=>{let c=await(n.lifiQuote??ht)({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 A0(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),s&&(gr(e,"paraswap")&&i.push(yr("paraswap",async()=>{let c=await(n.paraswapPrice??$t)({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}}})),gr(e,"0x")&&(ou(r,"ZEROX_API_KEY")||ou(r,"0X_API_KEY")||n.zeroxQuote)&&i.push(yr("0x",async()=>{let c=await(n.zeroxQuote??qt)({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}}})),gr(e,"cow")&&i.push(yr("cow",async()=>{let c=await(n.cowQuote??gt)({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}}})),gr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&i.push(yr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??yt)({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}}}))),i}async function A0(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function I0(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function iu(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>I0(a,n))),s=[],i=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){i.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{s.push(Zo(e,{...u.value,source:c.source},r))}catch(p){i.push({source:c.source,error:String(p?.message||p)})}}return{quotes:s,failed:i}}function au(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(i=>Number(i.expiryMs??0)>r);n.sort((i,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(i.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(i.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(i=>({...i,scoreBasis:"minBuyAmount"})),s=[];return o.length||s.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&s.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:s}}async function _0(e,t={}){let r=su(e,t),{quotes:n,failed:o}=await iu(e,r,t),s=au(n,t);return{kind:"rfq-result",intent:e,best:s.best,quotes:s.quotes,failed:o,warnings:[...s.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var uu=E(()=>{dr();Jr();tn();on();dn();es()});function lu(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,s]of(e.venues||[]).entries()){let i=`venues[${o}]`;if(!s||typeof s!="object"){t.push(`${i} must be an object`);continue}C0.test(s.address||"")||t.push(`${i}.address is not a valid 20-byte address`),/^0x0{40}$/.test(s.address||"")&&t.push(`${i}.address is the zero address -- placeholder left in place?`),s.kind||t.push(`${i}.kind is required (router|quoter|factory|...)`),s.verified?(s.verified.method||t.push(`${i}.verified.method is required`),s.verified.source||t.push(`${i}.verified.source is required`),s.verified.date||r.push(`${i}.verified.date missing -- add one so staleness is visible`)):t.push(`${i} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))Ut.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 du(e){let{ok:t,errors:r,warnings:n}=lu(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
2
|
+
var gg=Object.defineProperty;var S=(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)gg(e,r,{get:t[r],enumerable:!0})};import{homedir as Ei}from"node:os";import{join as Ai}from"node:path";function _t(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 vn(e,t,r=!1){return String(_t(e,t,r?"1":"")).trim()==="1"}var qc,vi,cI,Kt=S(()=>{qc=process.env.ORACLE_PUBLIC_DESKTOP==="1",vi=qc?process.env.ORACLE_CONFIG_DIR||Ai(Ei(),".config","oracle"):Ai(Ei(),".config","oracle"),cI=qc?vi:Ai(Ei(),".config","mad-desk")});import Tt from"node:net";import Lg from"node:dns";function _n(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 Ti(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 Oi(e){if(Tt.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(Tt.isIPv6(e)){let t=_n(e);if(!t)return!1;let r=_n("::ffff:0:0");return Ti(t,r,96)?Oi([...t.slice(12)].join(".")):Ti(t,_n("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ti(t,_n(o),i)):!1}return!1}function Bg(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($g.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=Tt.isIP(r);return n!==0&&!Oi(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ci(e,{lookupFn:t=Lg.promises.lookup}={}){let r=Bg(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:Tt.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=>!Oi(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Ni({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||(Tt.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(Tt.isIP(p))return[{address:p,family:Tt.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(w){return f(w)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),l=qg((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 qg(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Ri]=Object.freeze({pin:t}),e}function Pi(e){return typeof e=="function"&&typeof e[Ri]?.pin=="function"}function Xc(e,t,r){if(!Pi(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ri].pin(t,r)}var $g,Ri,Qc=S(()=>{$g=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ri=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Fg}from"node:crypto";function Hg(e){let t=String(e||"").toLowerCase();return ou.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function zg(e){let t={};for(let[r,n]of Object.entries(e||{}))Hg(r)||(t[r]=n);return t}function Vg(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 Wg(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Gg(e,t,r,n={}){let o={};for(let[l,d]of Object.entries(r||{}))o[l.toLowerCase()]=d;let i=Object.keys(o).filter(l=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(l)),a=[...new Set([...ou,...i])].sort().map(l=>`${l}=${o[l]??""}`).join(`
|
|
3
|
+
`),c=Fg("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function Jg(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,eu):Math.min(250*2**e,eu)+Math.floor(Math.random()*100)}function Or(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function $i(e,t,r){return Or(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Cr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Yg(e){return e?e.byteLength??e.length??0:0}async function ru(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Cr(e),!n))throw $i(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!n)throw $i(r,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,u=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=Yg(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw $i(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function nu(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Xg(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d}){let p=new AbortController,f=setTimeout(()=>p.abort(),i),m=null,w=t,g=s?{lookupFn:s}:{};if(c&&!a&&!Pi(w))throw Or(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let y=async(b,{status:T=null}={})=>{let x=await Ci(b,g);if(!x.ok)throw Or(T==null?`HTTP refused ${b}: ${x.error}`:`HTTP redirect to ${b} ${x.error}`,T==null?{}:{status:T});let _=new URL(b).hostname;if(a){if(m&&(await m.close(),m=null),!m)try{m=await Ni({requireUndici:!0,...l?{importUndici:l}:{}})}catch(k){throw Or(T==null?`HTTP refused ${b}: ${k?.message||k}`:`HTTP redirect to ${b} refused: ${k?.message||k}`,T==null?{}:{status:T})}m.pin(_,x.addresses),w=m.fetch}else Xc(w,_,x.addresses);return x};try{let b=String(e),T={...n||{}};c&&await y(b);for(let x=0;x<=tu;x+=1){let _=await w(b,{method:r,headers:T,body:o,signal:p.signal,redirect:"manual"});if(Mg.has(_.status)){if(r!=="GET"&&r!=="HEAD"){let R=await ru(_,u??jg,{url:b,truncate:!0}),I=new Error(`HTTP ${_.status} ${r} ${b} redirected non-idempotent request`);throw I.status=_.status,I.body=nu(R)??R.slice(0,300),I}if(x===tu)throw Cr(_),new Error(`HTTP redirect loop for ${e}`);let E=_.headers?.get?.("location"),A;try{A=Vg(E,b)}catch(R){throw Cr(_),R}let v=!Wg(A,b);if(Cr(_),v&&(T=zg(T)),c)await y(A,{status:_.status});else if(v){let R=await Ci(A,g);if(!R.ok){let I=new Error(`HTTP redirect from ${b} ${R.error}`);throw I.status=_.status,I.retryable=!1,I}a&&R.addresses?.length&&(m||(m=await Ni(l?{importUndici:l}:{})),m&&(m.pin(new URL(A).hostname,R.addresses),w=m.fetch))}b=A;continue}if(typeof d=="function")try{await d(_,{url:b})}catch(E){throw Cr(_),Or(E?.message||String(E))}let k=await ru(_,u,{url:b,onOversize:()=>p.abort()}),h=nu(k);if(!_.ok){let E=new Error(`HTTP ${_.status} ${r} ${b}`);throw E.status=_.status,E.retryAfter=_.headers?.get?.("retry-after")??null,E.body=h??k.slice(0,300),E}return h??k}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function N(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):Ug,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=Number(t.maxResponseBytes),m=Number.isFinite(f)&&f>0?Math.floor(f):null,w=async()=>{let x;for(let _=0;_<=a;_++)try{return await Xg(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:m,importUndici:d,validateResponse:p})}catch(k){x=k;let h=k?.status,E=k?.name==="AbortError",A=new Set([408,425,429]),v=k?.retryable===!1?!1:h!=null?A.has(h)||Dg.has(h)&&Zc.has(o):!E&&Zc.has(o);if(_===a||!v)throw k;await Kg(Jg(_,k?.retryAfter))}throw x};if(!(t.dedupe!==!1&&o==="GET"&&s==null))return w();let y=Gg(o,e,i,{untrustedUrl:l,maxResponseBytes:m}),b=Li.get(y);if(b)return b;let T=w().finally(()=>Li.delete(y));return Li.set(y,T),T}async function Tn(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var Dg,Zc,Ug,eu,ou,Mg,tu,jg,Li,Kg,W=S(()=>{Qc();Dg=new Set([408,425,429,500,502,503,504]),Zc=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ug=2,eu=4e3,ou=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Mg=new Set([301,302,303,307,308]),tu=3,jg=64*1024;Li=new Map;Kg=e=>new Promise(t=>setTimeout(t,e))});function e0({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?Zg:Qg}async function On(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=e0(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function iu(e={}){return On({type:"meta"},e)}async function su({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return On(i,o)}async function au({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return On({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Qg,Zg,Cn=S(()=>{W();Qg="https://api.hyperliquid.xyz/info",Zg="https://api.hyperliquid-testnet.xyz/info"});import{createHash as t0}from"node:crypto";function Ke(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Xt(e){return typeof e=="number"&&Number.isFinite(e)}function Fi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Fi(t);return Object.freeze(e)}for(let t of Object.keys(e))Fi(e[t]);return Object.freeze(e)}function Ot(e){if(Array.isArray(e))return e.map(Ot);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ot(e[r]);return t}return e}function Bi(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function cu(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function n0(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function o0(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function i0(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function lu(e){if(!Ke(e))throw new TypeError("evidence artifact must be a plain object");if(!r0.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Ke(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Ke(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ke(e.train)||!Ke(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Ot({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Ot(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function du(e){return t0("sha256").update(JSON.stringify(lu(e)),"utf8").digest("hex")}function Pe(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function qi(e,t){if(!Ke(e)||!Ke(e.metrics))throw new Error(`${t} metrics required`);let r=Pe(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Xt(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function s0(e,{maxDailyLossPct:t}={}){let r=e.split,n=Pe(r.trainStartIndex,"split.trainStartIndex"),o=Pe(r.trainEndIndex,"split.trainEndIndex"),i=Pe(r.trainBarCount,"split.trainBarCount",1),s=Pe(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Pe(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Pe(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Xt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");qi(e.train,"train");let u=qi(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Xt(t)&&u.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let l=e.walkForward,d=l.windows;if(d.length<1||l.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let w=0;w<d.length;w++){let g=d[w];if(!Ke(g)||g.index!==w||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let y=Pe(g.trainStartIndex,`walkForward.windows[${w}].trainStartIndex`),b=Pe(g.trainEndIndex,`walkForward.windows[${w}].trainEndIndex`),T=Pe(g.evalStartIndex,`walkForward.windows[${w}].evalStartIndex`),x=Pe(g.evalEndIndex,`walkForward.windows[${w}].evalEndIndex`);if(y!==0||b>=T||T>x||T<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let _=qi({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${w}]`);if(_.tradeCount<1||_.netPnlUsd<=0||_.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Xt(t)&&_.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!Xt(l.passRate)||Math.abs(l.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function pu(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let r=lu(e),n=Ot({id:e.id,...r});if(JSON.stringify(Ot(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=du(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&s0(e,t),e}function Di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ke(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ke(r))throw new TypeError("backtestOptions must be a plain object");if(!Xt(n)||n<=0||n>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=he(e),c=Qt(a),u=Nr(t),l=t.length,d=(q=[],j={})=>uu({status:"fail",strategy:a,sHash:c,barsHash:u,split:j.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:j.train||null,holdout:j.holdout||null,walkForward:j.walkForward||{windows:[],passRate:0},flags:[...s,...q]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(l*n),f=p,m=l-f;if(p<5||m<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let w=t.slice(0,p),g=t.slice(f),y,b;try{y=pt(a,w,r),b=pt(a,g,r)}catch(q){return d([{type:"backtest_error",message:String(q.message||q)}])}let T={metrics:Bi(y),costs:cu(y),tradeCount:y.metrics.tradeCount},x={metrics:Bi(b),costs:cu(b),tradeCount:b.metrics.tradeCount},_={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},k=[],h=Math.floor(l/(o+1));if(h<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:h});else for(let q=0;q<o;q++){let j=h*(q+1),se=j,K=Math.min(l,se+h);if(K-se<3||j<3){k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let We=t.slice(se,K),Sn;try{Sn=pt(a,We,r)}catch{k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let En=Bi(Sn),An=i0(En,a.risk,i);k.push({index:q,trainStartIndex:0,trainEndIndex:j-1,evalStartIndex:se,evalEndIndex:K-1,passed:An,reason:An?"pass":"fail_metrics",metrics:En})}let E=k.filter(q=>q.passed).length,A=k.length===0?0:E/k.length,v={windows:k,passRate:A,windowsRun:k.length};x.metrics.tradeCount===0&&T.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),T.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&T.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):T.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<T.metrics.netPnlUsd*.1&&T.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=n0(x.costs),I=o0(b);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(q=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(q.type)),D=s.some(q=>q.type==="overfit"),V="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&A>=.6&&!(I>0&&R>I)&&!D&&!s.some(q=>q.type==="severe_oos_collapse"||q.type==="invalid_windowing")?V="pass_live_eligible":!P&&x.metrics.tradeCount>0&&T.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(V="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&x.metrics.tradeCount>0&&T.metrics.netPnlUsd>0?V="fail":x.metrics.tradeCount>0&&T.metrics.tradeCount>0&&!P?V="pass_paper_only":V="fail",x.metrics.netPnlUsd<0&&(V=V==="pass_live_eligible"?"fail":V==="pass_paper_only"?"pass_paper_only":"fail",V="fail"),uu({status:V,strategy:a,sHash:c,barsHash:u,split:_,train:T,holdout:x,walkForward:v,flags:s})}function uu({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:Nt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=du(u),Fi(Ot(JSON.parse(JSON.stringify(u))))}var r0,Ui=S(()=>{Rt();Ct();Nn();r0=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as a0,createHmac as c0,timingSafeEqual as NI}from"node:crypto";function Mi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Mi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Mi(e[r])}`).join(",")}}`}function fu(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function mu(e=process.env){return fu(process.env)||fu(e)}function p0(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function f0(e){let t=p0(e);return a0("sha256").update(Mi(t)).digest("hex")}function m0(e,t=mu()){return t?c0("sha256",t).update(String(e)).digest("hex"):""}function Z(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+l0:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>d0)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:u0},f=f0(p),m=mu(n),w=m?m0(f,m):void 0,g={...p,prepareHash:f};return w&&(g.prepareMac=w),g}var u0,l0,d0,ge=S(()=>{u0=2,l0=300*1e3,d0=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Rr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function g0(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Hi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Hi(r,`${t}[${n}]`));return}if(Rr(e))for(let[r,n]of Object.entries(e)){let o=g0(r);if(h0.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Hi(n,`${t}.${r}`)}}function ji(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function hu({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(Hi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!Rr(e))throw new Error("handoff: strategy required");if(!Rr(t))throw new Error("handoff: evidence required");if(!Rr(r))throw new Error("handoff: shadow required");if(!Rr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=he(e,{nowMs:o}),a=we(s);if(pu(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!ji(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!ji(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!ji(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let l={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:Pr,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:l},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return Z(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var h0,gu=S(()=>{Rt();Ui();Ct();ge();h0=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Zt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function er(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Lr(e){if(Array.isArray(e))for(let t of e)Lr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Lr(t);return Object.freeze(e)}function y0(e){let t=w0[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function b0(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");er(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=er(Number(o.t),`candles[${n}].t`);if(er(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Zt(o.o,`candles[${n}].o`),h:Zt(o.h,`candles[${n}].h`),l:Zt(o.l,`candles[${n}].l`),c:Zt(o.c,`candles[${n}].c`),v:Zt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return Lr([...r.values()].sort((n,o)=>n.t-o.t))}function x0(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=er(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Zt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function S0({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await au({coin:e,startTime:i,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let l of c){let d=Number(l?.time);Number.isSafeInteger(d)&&d>u&&(u=d)}if(c.length<500||u>=r){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return x0(o,r)}function E0(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function wu(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=y0(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=er(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):er(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([su({coin:r,interval:n,startTime:a,endTime:i},t),S0({coin:r,startTime:a,endTime:i},t)]),l=b0(c,{endTime:i}),d=Lr(E0(l,u,o));return Lr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var w0,yu=S(()=>{Cn();w0=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function k0(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let r of Object.keys(e))v0.has(r)||t.push({path:`market.${r}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!A0.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function I0(e={}){let t=await iu(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var A0,v0,bu,xu=S(()=>{Cn();gu();yu();A0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),v0=new Set(["coin","interval"]);bu=Object.freeze({id:"hyperliquid",validateMarket:k0,fetchBars:wu,listMarkets:I0,prepareIntent(e){return hu(e)}})});function T0(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of _0.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function zi(e){return typeof e!="string"?null:O0.get(e)??null}function Vi(e){let t=zi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var _0,Su,O0,VI,Wi=S(()=>{xu();_0=Object.freeze(["id","validateMarket","prepareIntent"]);Su=[bu].map(T0),O0=new Map(Su.map(e=>[e.id,e])),VI=Object.freeze([...Su])});import{createHash as C0}from"node:crypto";function Te(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function oe(e){return typeof e=="number"&&Number.isFinite(e)}function Ou(e){return Number.isInteger(e)&&e>0}function Xi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Xi(t);return Object.freeze(e)}for(let t of Object.keys(e))Xi(e[t]);return Object.freeze(e)}function Qi(e){if(Array.isArray(e))return e.map(Qi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Qi(e[r]);return t}return e}function O(e,t,r){e.push({path:t,message:r})}function ft(e,t,r,n){for(let o of Object.keys(e))t.has(o)||O(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function Pu(e,t,r,n){if(!oe(e)||!oe(t)||!oe(r)||!oe(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Yi(e,t,r,n){if(Te(e)){if(ft(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return O(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return O(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Te(o)||![o.value,o.min,o.max,o.step].every(Ou)?(O(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Ou(e)?e:(O(n,t,"must be a positive integer or {param}"),null)}function Cu(e,t,r,n){return Te(e)?(ft(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(O(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(O(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):oe(e)?e:(O(n,t,"must be a finite number or {param}"),null)}function Rn(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function D0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of Rn(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function U0(e,t){if(!Te(e))return O(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>Iu)return O(t,"parameters",`too many parameters (max ${Iu})`),null;let n={};for(let o of r){if(!Nu.test(o)){O(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Te(i)){O(t,s,"must be a plain object");continue}ft(i,Au,s,t);for(let d of Au)d in i||O(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;oe(c)||O(t,`${s}.min`,"must be a finite number"),oe(u)||O(t,`${s}.max`,"must be a finite number"),(!oe(l)||l<=0)&&O(t,`${s}.step`,"must be a positive finite number"),oe(a)||O(t,`${s}.value`,"must be a finite number"),oe(c)&&oe(u)&&c>u&&O(t,`${s}.min`,"min must be <= max"),oe(a)&&oe(c)&&oe(u)&&oe(l)&&l>0&&(Pu(a,c,u,l)||O(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:l}}return n}function M0(e,t,r,n){let o=`nodes.${t}`;if(!Te(e))return O(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!ku[e.type])return O(n,`${o}.type`,"unknown or missing node type"),ft(e,F0,o,n),null;switch(ft(e,ku[e.type],o,n),(typeof e.id!="string"||!Ru.test(e.id))&&O(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!N0.has(e.field))&&O(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Cu(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!R0.has(e.indicator))&&O(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?O(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Yi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?O(n,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))O(n,`${o}.period`,"required field is missing");else{let a=Yi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))O(n,`${o}.${a}`,"required field is missing");else{let c=Yi(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?B0.has(e.output)?s.output=e.output:O(n,`${o}.output`,"must be line|signal|histogram"):O(n,`${o}.output`,"required field is missing"),"period"in e&&O(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&O(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))O(n,`${o}.stdDev`,"required field is missing");else{let a=Cu(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?O(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?q0.has(e.output)?s.output=e.output:O(n,`${o}.output`,"must be upper|middle|lower"):O(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&O(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&O(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&O(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&O(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!P0.has(e.op))&&O(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&O(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(n,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!L0.has(e.op))&&O(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return O(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?O(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&O(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&O(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!$0.has(e.direction))&&O(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&O(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(n,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function j0(e,t,r){if(!Te(e))return O(t,"risk","must be a plain object"),null;ft(e,vu,"risk",t);for(let p of vu)(!(p in e)||e[p]==null)&&O(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!oe(o)||o<=0||o>50?O(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!oe(i)||i<=0?O(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!oe(s)||s<=0||s>100?O(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!oe(a)||a<=0||a>100?O(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!oe(c)||c<=0||c>1e3?O(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?O(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!oe(l)||l<=0||l>100?O(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?O(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&O(t,"risk.expiresAt","must be strictly greater than nowMs"):O(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function Zi(e,t={}){let r=[];if(!Te(e))return O(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};ft(e,Eu,"",r);for(let d of Eu)(!(d in e)||e[d]==null)&&O(r,d,"required field is missing");e.version!==Gi&&O(r,"version",`must be ${Gi}`),(typeof e.id!="string"||!Nu.test(e.id))&&O(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>Tu)&&O(r,"name",`must be a non-empty string max ${Tu}`);let n=zi(e.venue);n||O(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Te(e.market)||O(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))O(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)O(r,p.path,p.message)}let i=U0(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))O(r,"nodes","must be an array");else if(e.nodes.length>_u)O(r,"nodes",`too many nodes (max ${_u})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=M0(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Ru.test(p.id)&&(a.has(p.id)?O(r,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],f=`nodes.${d}`;for(let m of Rn(p))a.has(m)||O(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of Rn(p)){let w=a.get(m);w&&Ji.has(w.type)&&O(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of Rn(p)){let w=a.get(m);w&&!Ji.has(w.type)&&O(r,f,`node ref "${m}" must be boolean`)}}D0(a)&&O(r,"nodes","graph contains a cycle")}let c=null;if(!Te(e.rules))O(r,"rules","must be a plain object");else{ft(e.rules,Ki,"rules",r);for(let d of Ki)d in e.rules||O(r,`rules.${d}`,"required field is missing");c={};for(let d of Ki){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){O(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){O(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);Ji.has(f.type)||O(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=j0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Xi({version:Gi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function he(e,t={}){let r=Zi(e,t);if(!r.ok)throw new tr(r.errors);return r.strategy}function H0(e){let t=he(e);return JSON.stringify(Qi(t))}function Qt(e){let t=H0(e);return C0("sha256").update(t,"utf8").digest("hex")}function $r(e,t){if(!Te(e))throw new tr([{path:"",message:"strategy must be a plain object"}]);if(!Te(t))throw new tr([{path:"overrides",message:"must be a plain object"}]);let r=he(e),n={};for(let[i,s]of Object.entries(r.parameters))n[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,i)){O(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!oe(s)){O(o,i,"override must be a finite number");continue}if(!Pu(s,a.min,a.max,a.step)){O(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new tr(o);return he({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var Gi,Nu,Ru,N0,R0,P0,L0,$0,B0,q0,Ji,Eu,Au,Ki,vu,F0,ku,Iu,_u,Tu,tr,Ct=S(()=>{Wi();Gi=1,Nu=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ru=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,N0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),R0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),P0=new Set(["gt","gte","lt","lte","eq"]),L0=new Set(["and","or","not"]),$0=new Set(["above","below"]),B0=new Set(["line","signal","histogram"]),q0=new Set(["upper","middle","lower"]),Ji=new Set(["compare","logic","cross"]),Eu=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Au=new Set(["value","min","max","step"]),Ki=new Set(["entryLong","entryShort","exitLong","exitShort"]),vu=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),F0=new Set(["id","type"]),ku={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},Iu=16,_u=128,Tu=100,tr=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function Br(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function mt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function z0(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let o=r[n];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function $u(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function Pn(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Bu(e,t){Br(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Lu(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,l=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+l)/t,r[a]=Lu(i,s)}return r}function Lu(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function qu(e,t={}){Br(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(mt(r),mt(n),mt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=Pn(e,r),s=Pn(e,n),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),l=[];for(let d=0;d<a.length;d++)a[d]!=null&&l.push(d);if(l.length>=o){let d=0;for(let w=0;w<o;w++)d+=a[l[w]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let w=o;w<l.length;w++){let g=l[w];p=m*a[g]+(1-m)*p,c[g]=p,u[g]=a[g]-p}}return{line:a,signal:c,histogram:u}}function Fu(e,t={}){Br(e);let r=t.period,n=t.stdDev;if(mt(r),typeof n!="number"||!Number.isFinite(n)||n<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<r)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let l=e[u];if(a+=l,c+=l*l,u>=r){let d=e[u-r];a-=d,c-=d*d}if(u>=r-1){let d=a/r,p=c/r-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=d,i[u]=d+n*f,s[u]=d-n*f}}return{upper:i,middle:o,lower:s}}function Du(e,t){z0(e),mt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Uu=S(()=>{});import{createHash as V0}from"node:crypto";var es,W0,G0,J0,Mu,ju=S(()=>{es=2,W0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",G0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",J0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",Mu=V0("sha256").update(JSON.stringify({version:es,compilerSourceHash:W0,indicatorsSourceHash:G0,schemaSourceHash:J0})).digest("hex")});function Le(e){return typeof e=="number"&&Number.isFinite(e)}function X0(e){let t=new Map(e.map(a=>[a.id,a])),r=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function rr(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Q0(e,t,r){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let n=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l:u,c:l,v:d}=i;if(!Le(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l],["v",d]])if(!Le(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,l,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,l,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==Y0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!Le(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Le(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Pt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=K0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=n[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=rr(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?rr(s.period,r):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=n[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Du(d,c);break}let l=Pt(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!Le(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=$u(l,c);else if(s.indicator==="ema")a=Pn(l,c);else if(s.indicator==="rsi")a=Bu(l,c);else if(s.indicator==="macd")a=qu(l,{fastPeriod:rr(s.fastPeriod,r),slowPeriod:rr(s.slowPeriod,r),signalPeriod:rr(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Fu(l,{period:c,stdDev:rr(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Pt(s.left,t,r,n,o,i),u=Pt(s.right,t,r,n,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],p=u[l];if(d==null||p==null||!Le(d)||!Le(p)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>p;break;case"gte":a[l]=d>=p;break;case"lt":a[l]=d<p;break;case"lte":a[l]=d<=p;break;case"eq":a[l]=d===p;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>Pt(u,t,r,n,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let l=c[0][u];a[u]=l===!0?!1:l===!1}else if(s.op==="and"){let l=!0;for(let d of c)if(d[u]!==!0){l=!1;break}a[u]=l}else if(s.op==="or"){let l=!1;for(let d of c)if(d[u]===!0){l=!0;break}a[u]=l}else a[u]=!1;break}case"cross":{let c=Pt(s.left,t,r,n,o,i),u=Pt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],p=u[l-1],f=c[l],m=u[l];if(d==null||p==null||f==null||m==null||!Le(d)||!Le(p)||!Le(f)||!Le(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=p&&f>m:a[l]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function we(e,t={}){let r=he(e);t&&Object.keys(t).length&&(r=$r(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(X0(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Qt(r);function u(f,m){let w={};for(let y of o){let b=f.get(y);w[y]=b[m]}let g=y=>y!=null&&w[y]===!0;return{values:w,signals:{entryLong:g(r.rules.entryLong),entryShort:g(r.rules.entryShort),exitLong:g(r.rules.exitLong),exitShort:g(r.rules.exitShort)}}}function l(f,m){Q0(f,m,r.market.interval);let w=new Map;for(let g of o)Pt(g,n,i,f,m,w);return w}function d(f,m){return u(l(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,w=l(f,m);return Object.freeze(f.map((g,y)=>Object.freeze(u(w,y))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:Pr,compilerHash:Nt,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var Pr,Nt,K0,Y0,Rt=S(()=>{Ct();Uu();ju();Pr=es,Nt=Mu,K0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),Y0=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as Z0}from"node:crypto";function tw(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ye(e){return typeof e=="number"&&Number.isFinite(e)}function ts(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ts(t);return Object.freeze(e)}for(let t of Object.keys(e))ts(e[t]);return Object.freeze(e)}function Ln(e){if(Array.isArray(e))return e.map(Ln);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ln(e[r]);return t}return e}function rs(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((r,n)=>rs(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))rs(n,`${t}.${r}`)}}function zu(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=n;if(!Ye(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!Ye(d))throw new TypeError(`bars[${r}].${l} must be a finite number`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c]])if(!(d>0))throw new TypeError(`bars[${r}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in n&&n.fundingRate!=null&&!Ye(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Ye(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Ye(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function Nr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&zu(e),Z0("sha256").update(JSON.stringify(Ln(e)),"utf8").digest("hex")}function rw(e){if(e==null&&(e={}),!tw(e))throw new TypeError("options must be a plain object");let t={...ew},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!Ye(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let o=e[n];if(!Ye(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!Ye(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function $n(e){return e/1e4}function nw(e,t,r){let n=$n(r);return t==="long"?e*(1+n):e*(1-n)}function ow(e,t,r){let n=$n(r);return t==="long"?e*(1-n):e*(1+n)}function Hu(e,t,r){let n=Math.abs(e)*$n(t),o=Math.abs(e)*$n(r);return{taker:n,builder:o,total:n+o}}function iw(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function sw(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function aw(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function cw(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function uw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function lw(e,t,r){return t==="long"?e.h>=r:e.l<=r}function dw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function qr(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>Ye(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function pw(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function fw(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function pt(e,t,r={}){let n=rw(r);zu(t);let o=Nr(t);n.nowMs!==void 0&&he(e,{nowMs:n.nowMs});let i=we(e);if(qr(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,l=n.takerFeeBps,d=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,w=0,g=0,y=0,b=[],T=[],x=[],_=[],k=[],h=null,E=0,A=null,v=p,R=!1,I=0,P=0,D=[],V=new Array(t.length).fill(0);function Y(C){D.push(C)}function q(C){let U=t[C].v*(n.maxVolumeParticipationPct/100);return Math.max(0,U-V[C])}function j(C){if(!h)return p;let U=h.side==="long"?(C-h.entryPrice)*h.qty:(h.entryPrice-C)*h.qty;return p+U}function se(C,U,L){let te=L.o,H=iw(p,s);if(!(H>0)||!(te>0))return;let re=nw(te,U,u),Q=H/re,ae=q(C),vr=re*ae;if(Q>ae){x.push({kind:"entry",barIndex:C,time:L.t,side:U,requestedNotionalUsd:H,maxFillNotionalUsd:vr,reason:"volume_participation"});return}V[C]+=Q;let Ge=Math.abs(re-te)*Q,nt=Hu(H,l,d);p-=nt.total,f+=nt.taker,m+=nt.builder,g+=Ge,y+=H,h={lifecycleEpoch:++P,side:U,entryBarIndex:C,entryReferencePrice:te,entryPrice:re,qty:Q,notionalUsd:H,stop:sw(re,U,s.stopLossPct),take:aw(re,U,s.takeProfitPct),liq:cw(re,U,s.maxLeverage,l+d),entryFees:nt.taker,entryBuilderFees:nt.builder,entrySlippageUsd:Ge,fundingAccrued:0}}function K(C,U,L,te){if(!h)return!1;let H=h.side,re=U,Q=re;L!=="liquidation"&&te&&(Q=ow(re,H,u));let ae=h.qty,vr=ae*Q;if(L!=="liquidation"){let Bc=q(C),hg=Q*Bc;if(ae>Bc)return x.push({kind:"exit",barIndex:C,time:t[C].t,side:H,requestedNotionalUsd:vr,maxFillNotionalUsd:hg,reason:"volume_participation",triggerReason:L}),!1;V[C]+=ae}let Ge=Hu(vr,l,d),nt=L==="liquidation"?0:Math.abs(Q-re)*ae,kr,Si;H==="long"?(kr=(re-h.entryReferencePrice)*ae,Si=(Q-h.entryPrice)*ae):(kr=(h.entryReferencePrice-re)*ae,Si=(h.entryPrice-Q)*ae),p+=Si,p-=Ge.total,f+=Ge.taker,m+=Ge.builder,g+=nt,y+=vr;let mg={side:H,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,exitBarIndex:C,exitTime:t[C].t,exitPrice:Q,exitReason:L,qty:ae,notionalUsd:h.notionalUsd,grossPnlUsd:kr,feesUsd:h.entryFees+Ge.taker,builderFeesUsd:h.entryBuilderFees+Ge.builder,fundingUsd:h.fundingAccrued,slippageUsd:h.entrySlippageUsd+nt,netPnlUsd:kr-(h.entryFees+Ge.taker+h.entryBuilderFees+Ge.builder)-h.fundingAccrued-(h.entrySlippageUsd+nt)};return b.push(mg),L==="liquidation"&&T.push({barIndex:C,time:t[C].t,side:H,price:Q,tradeIndex:b.length-1}),h=null,P+=1,I=C+1+(s.cooldownBars||0),!0}function We(C,U,L,te){let H=C+1;if(H>=t.length)return;D.some(Q=>Q.kind==="exit"&&Q.side===U&&Q.fillBar===H&&Q.epoch===te)||Y({kind:"exit",side:U,signalBar:C,fillBar:H,reason:L,epoch:te})}function Sn(C){let U=D.filter(L=>L.fillBar===C);for(let L=D.length-1;L>=0;L--)D[L].fillBar===C&&D.splice(L,1);U.sort((L,te)=>{let H=re=>re.kind==="exit"?0:1;return H(L)-H(te)});for(let L of U)if(L.kind==="exit"){if(!h||h.side!==L.side||h.lifecycleEpoch!==L.epoch)continue;let te=L.reason||"rule";K(C,t[C].o,te,!0)||We(C,L.side,te,L.epoch)}else if(L.kind==="entry"){if(h||L.epoch!==P||C<I)continue;se(C,L.side,t[C])}}function En(C){if(!h)return;let U=t[C],L=U.fundingPaymentRate;if(L==null||!Ye(L)||L===0)return;let te=Math.abs(h.qty*U.c),H=L*te;h.side==="long"?(p-=H,h.fundingAccrued+=H,w+=H):(p+=H,h.fundingAccrued-=H,w-=H)}function An(C){if(!h)return;let U=t[C].o;(h.side==="long"?U<=h.liq:U>=h.liq)&&K(C,U,"liquidation",!1)}function Nc(C){if(!h)return;let U=t[C],L=h.side,te=dw(U,L,h.liq),H=uw(U,L,h.stop),re=lw(U,L,h.take),Q=ae=>L==="long"?Math.min(ae,U.o):Math.max(ae,U.o);if(te){K(C,Q(h.liq),"liquidation",!1);return}if(H&&re){K(C,Q(h.stop),"stop_loss",!0)||We(C,L,"stop_loss",h.lifecycleEpoch);return}if(H){K(C,Q(h.stop),"stop_loss",!0)||We(C,L,"stop_loss",h.lifecycleEpoch);return}re&&(K(C,h.take,"take_profit",!0)||We(C,L,"take_profit",h.lifecycleEpoch))}for(let C=0;C<t.length;C++){let U=Math.floor(t[C].t/864e5);U!==A&&(A=U,v=j(t[C].o),R=!1),An(C),Sn(C),Nc(C),En(C),!R&&j(t[C].c)<=v*(1-s.maxDailyLossPct/100)&&(R=!0,_.push({type:"daily_loss_limit",barIndex:C,time:t[C].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let L=a[C].signals,te=C+c;if(h)(h.side==="long"&&L.exitLong===!0||h.side==="short"&&L.exitShort===!0)&&te<t.length&&(D.some(ae=>ae.kind==="exit"&&ae.side===h.side&&ae.fillBar===te&&ae.epoch===h.lifecycleEpoch)||Y({kind:"exit",side:h.side,signalBar:C,fillBar:te,reason:"rule",epoch:h.lifecycleEpoch}));else{let re=L.entryLong===!0,Q=L.entryShort===!0;re&&Q?_.push({type:"conflicting_entry_signals",barIndex:C,time:t[C].t,message:"conflicting entry signals; no position opened"}):!R&&(re||Q)&&te<t.length&&C>=I&&Y({kind:"entry",side:re?"long":"short",signalBar:C,fillBar:te,epoch:P})}let H=p;h&&(E+=1,H=j(t[C].c)),k.push({barIndex:C,time:t[C].t,equity:H,positionSide:h?h.side:null})}let Rc=null;if(h){let C=t.length-1;if(K(C,t[C].c,"end_of_data",!0))k[C]={barIndex:C,time:t[C].t,equity:p,positionSide:null};else{let L=j(t[C].c);Rc={side:h.side,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,qty:h.qty,notionalUsd:h.notionalUsd,markPrice:t[C].c,markedEquityUsd:L},_.push({type:"open_position_at_end",barIndex:C,time:t[C].t,message:"end-of-data exit missed; position remains open and marked"})}}let Pc=(h?j(t[t.length-1].c):p)-n.initialEquityUsd,lg=Pc/n.initialEquityUsd*100,Lc=0,wi=0,yi=0;for(let C of b)C.netPnlUsd>0?(Lc+=1,wi+=C.netPnlUsd):C.netPnlUsd<0&&(yi+=-C.netPnlUsd);let bi=b.length,dg=bi===0?0:Lc/bi,xi=0;yi>0?xi=wi/yi:wi>0&&(xi=1e12);let pg={netPnlUsd:Pc,netPnlPct:lg,maxDrawdownPct:fw(k),winRate:dg,profitFactor:xi,tradeCount:bi,sharpe:pw(k),turnoverUsd:y,exposurePct:E/t.length*100},fg={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},$c={barsHash:o,strategyHash:i.strategyHash,compilerHash:Nt,compilerVersion:Pr,config:fg,trades:b,equityCurve:k,metrics:pg,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:w,slippageUsd:g},liquidations:T,missedFills:x,openPositionAtEnd:Rc,flags:_};return rs($c),ts(Ln($c))}var ew,Nn=S(()=>{Rt();Ct();ew=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as mw}from"node:crypto";function Ew(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ns(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ns(t);return Object.freeze(e)}for(let t of Object.keys(e))ns(e[t]);return Object.freeze(e)}function Aw(e){return String(e).trim().replace(/\s+/g," ")}function vw(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function kw(e){for(let r of gw)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function Iw(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let r=t[1].toLowerCase();return hw.has(r)?r:null}function _w(e){let t={...yw},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function Tw(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(r=>(e.match(r)??[]).length>1)}function Ow(e){let t=mw("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function Cw(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let r=Number(t[1]),n=t[2].toLowerCase(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function Nw(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function Rw(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function Pw(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Vu(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function Lw({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let l=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:l,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Vu(a.fast),ema_right_period:Vu(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function $w({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bw({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Wu(e,t={}){if(typeof e!="string")throw new le("prompt must be a string");if(e.length>1e3)throw new le("prompt length must be <= 1000");if(!Ew(t))throw new le("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new le("options.nowMs is required integer epoch ms");let r=t.nowMs,n=Sw;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new le("expiresInMs must be an integer");if(n=t.expiresInMs,n<bw||n>xw)throw new le("expiresInMs must be between 1h and 30d")}if(ww.test(e))throw new le(`prompt appears to contain secrets and is rejected. ${nr}`);let o=Aw(e);if(!o)throw new le(`empty prompt. ${nr}`);if(Tw(o))throw new le(`duplicate interval or risk clause. ${nr}`);let i=vw(o),s=kw(o),a=Iw(o);if(!i||!s||!a)throw new le(`could not parse side/coin/interval. ${nr}`);let c=_w(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new le("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new le("position size out of range");let u=r+n,l=Ow(o),d=`Draft ${s} ${i}`.slice(0,100),p=Cw(o),f=Nw(o),m=Rw(o),w=[p,f,m].filter(Boolean);if(w.length!==1)throw new le(`unsupported or ambiguous prompt. ${nr}`);if(!Pw(o,w[0]))throw new le(`unsupported or ambiguous prompt. ${nr}`);let g,y=w[0],b={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:y};y.kind==="ema_cross"?g=Lw(b):y.kind==="rsi"?g=$w(b):g=Bw(b);let T=Zi(g,{nowMs:r});if(!T.ok)throw new le(`draft failed validation: ${T.errors.map(x=>x.message).join("; ")}`);return ns(he(g,{nowMs:r}))}var le,hw,gw,ww,nr,yw,bw,xw,Sw,Gu=S(()=>{Ct();le=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},hw=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),gw=new Set(["BTC","ETH","SOL","HYPE"]),ww=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,nr="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",yw=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),bw=36e5,xw=30*864e5,Sw=864e5});import{createHash as qw}from"node:crypto";function Yu(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function Xu(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function is(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)is(t);return Object.freeze(e)}for(let t of Object.keys(e))is(e[t]);return Object.freeze(e)}function Fr(e){if(Array.isArray(e))return e.map(Fr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Fr(e[r]);return t}return e}function Bn(e){return JSON.stringify(Fr(e))}function Fw(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function Dw(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=Bn(n),s=Bn(o);return i<s?-1:i>s?1:0}),r}function os(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=Bn(r),a=Bn(o);return s<a}function Qu(e,t,r={}){if(!Xu(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Yu(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Ju)throw new TypeError(`maxTrials must be an integer 1..${Ju}`);o=x}let i=r.objective??"netPnlUsd";if(!Ku.has(i))throw new TypeError(`objective must be one of ${[...Ku].join("|")}`);let s=r.backtestOptions??{};if(!Xu(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(Yu(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=he(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},l=1;for(let x of c){let _=Fw(a.parameters[x]);if(_.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=_,l*=_.length}let d=Dw(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,w=null;for(let x of p){let _=$r(a,x),k=pt(_,t,s);w==null&&(w=k.config);let h={netPnlUsd:k.metrics.netPnlUsd,netPnlPct:k.metrics.netPnlPct,maxDrawdownPct:k.metrics.maxDrawdownPct,winRate:k.metrics.winRate,profitFactor:k.metrics.profitFactor,tradeCount:k.metrics.tradeCount,sharpe:k.metrics.sharpe,turnoverUsd:k.metrics.turnoverUsd},E={parameters:{...x},metrics:h};f.push(E),(!m||os(i,h,x,m.metrics,m.parameters))&&(m=E)}f.sort((x,_)=>os(i,x.metrics,x.parameters,_.metrics,_.parameters)?-1:os(i,_.metrics,_.parameters,x.metrics,x.parameters)?1:0);let g={...m.parameters},y=$r(a,g),b={strategyHash:Qt(a),compilerHash:Nt,trainBarsHash:Nr(t),backtestConfig:w,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:g,bestStrategy:y},T={id:qw("sha256").update(JSON.stringify(Fr(b)),"utf8").digest("hex"),...b};return is(Fr(JSON.parse(JSON.stringify(T))))}var Ju,Ku,Zu=S(()=>{Rt();Ct();Nn();Ju=256,Ku=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import ot from"node:fs";import qn from"node:path";function Fn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Xe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Mw(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function or(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>or(r,`${t}[${n}]`));return}if(Fn(e))for(let[r,n]of Object.entries(e)){let o=Mw(r);if(Uw.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);or(n,`${t}.${r}`)}}function jw(e){if(typeof e!="string"||!e||!qn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function el(e){let t;try{t=ot.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function Hw(){return{version:as,runners:[]}}function tl(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Fn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==as)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return or(r,qn.basename(t)),{version:as,runners:r.runners.map(n=>Xe(n))}}function rl(e,t){or(t,"store");let r=qn.dirname(e);ot.mkdirSync(r,{recursive:!0,mode:448});let n=qn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
4
|
+
`;try{ot.writeFileSync(n,o,{mode:384,flag:"wx"}),ot.renameSync(n,e);try{ot.chmodSync(e,384)}catch{}}catch(i){try{ot.unlinkSync(n)}catch{}throw i}}function nl(e={}){let t=e.path;if(jw(t),el(t),ot.existsSync(t)?tl(ot.readFileSync(t,"utf8"),t):rl(t,Hw()),ss.has(t))return ss.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let w=m.fn();r=!1,m.resolve(w),o()}catch(w){r=!1,m.reject(w),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((w,g)=>{n.push({fn:m,resolve:w,reject:g}),queueMicrotask(o)})}function s(){return el(t),tl(ot.readFileSync(t,"utf8"),t)}function a(m){rl(t,m)}function c(m){if(!Fn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");or(m,"record");let w=s();if(w.runners.some(y=>y.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let g=Xe(m);return w.runners.push(g),a(w),Xe(g)}function u(m){let w=s().runners.find(g=>g.id===m);return w?Xe(w):null}function l(){return s().runners.map(m=>Xe(m))}function d(m,w){if(typeof w!="function")throw new Error("shadow-store: updater must be a function");let g=s(),y=g.runners.findIndex(x=>x.id===m);if(y<0)throw new Error(`shadow-store: runner not found: ${m}`);let b=Xe(g.runners[y]),T=w(b);if(!Fn(T)||T.id!==m)throw new Error("shadow-store: updater must return record with same id");return or(T,"record"),g.runners[y]=Xe(T),a(g),Xe(g.runners[y])}function p(m){let w=s(),g=w.runners.findIndex(b=>b.id===m);if(g<0)throw new Error(`shadow-store: runner not found: ${m}`);let y=Xe(w.runners[g]);return y.status!=="stopped"&&(y.status="stopped",w.runners[g]=y,a(w)),Xe(w.runners[g])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,w){return i(()=>d(m,w))},stop(m){return i(()=>p(m))}};return ss.set(t,f),f}var as,Uw,ss,ol=S(()=>{as=1,Uw=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];ss=new Map});import{createHash as ls}from"node:crypto";function cs(e){return e==null?e:JSON.parse(JSON.stringify(e))}function us(e){return Array.isArray(e)?e.map(us):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,us(e[t])])):e}function sl(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return ls("sha256").update(JSON.stringify(us(e))).digest("hex")}function zw(e,t,r,n,o){return ls("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Vw(e,t,r,n){return ls("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Ww(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function il(e){return e==="entryLong"||e==="entryShort"}function ds({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=nl({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=we(c),d=u==null?null:String(u),p=r.list().filter(y=>y.status==="running"&&y.strategyHash===l.strategyHash&&y.compilerHash===l.compilerHash&&y.evidenceId===d).sort((y,b)=>y.createdAt-b.createdAt||y.id.localeCompare(b.id))[0];if(p)return cs(p);let f=t(),m=Vw(f,l.strategyHash,l.compilerHash,d),w=r.get(m);if(w)return cs(w);let g={id:m,strategy:cs(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(g)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.stop(c)}function a(c,u,{markoutHorizons:l=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let f=we(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let w=d.cursor,g=[];for(let I=0;I<u.length;I++){let P=u[I].t;(w==null||P>w)&&g.push(I)}if(g.length===0)return d;let y=new Map(d.intendedOrders.map(I=>[I.id,I])),b=new Set(d.fills.map(I=>I.orderId)),T=new Map(d.missedFills.map(I=>[I.orderId,I])),x=(I,P)=>`${I}|${P}`,_=new Map(d.markouts.map(I=>[x(I.orderId,I.horizon),I])),k=d.position?{...d.position}:null,h=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,E=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function A({action:I,signalBarT:P,signalIndex:D}){let V=Ww(I),Y=zw(d.id,d.strategyHash,P,V,I);if(y.has(Y))return y.get(Y);let q=D+1,j=q<u.length,se={id:Y,action:I,type:I,side:V,signalBarT:P,fillBarT:j?u[q].t:null,status:j?"open":"missed"};return y.set(Y,se),d.intendedOrders.push(se),se}function v(I,P,D){if(b.has(I.id))return;let V={orderId:I.id,action:il(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:D};if(d.fills.push(V),b.add(I.id),I.status="filled",I.fillBarT=P.t,T.has(I.id)&&(T.delete(I.id),d.missedFills=d.missedFills.filter(Y=>Y.orderId!==I.id)),il(I.action)){k={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:D};for(let Y of l){let q=x(I.id,Y);if(_.has(q))continue;let j={orderId:I.id,horizon:Y,entryBarT:P.t,entryPrice:P.o,side:k.side,status:"pending",close:null,barT:null};_.set(q,j),d.markouts.push(j)}}else k=null,h=Number(d.strategy?.risk?.cooldownBars)||0,E=P.t}function R(I){if(b.has(I.id)||T.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};T.set(I.id,P),d.missedFills.push(P),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||b.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let D=P+1;D<u.length&&(w==null||u[D].t>w)&&v(I,u[D],D)}for(let I of g){let P=u[I],D=f[I].signals,V=k,Y=j=>{if(k||h>0&&(E==null||P.t>=E))return;let K=A({action:j,signalBarT:P.t,signalIndex:I}),We=I+1;We<u.length?v(K,u[We],We):R(K)},q=j=>{if(!k||k.side==="long"&&j!=="exitLong"||k.side==="short"&&j!=="exitShort")return;let se=A({action:j,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?v(se,u[K],K):R(se)};V?(D.exitLong&&q("exitLong"),D.exitShort&&q("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&Y("entryLong"),D.entryShort&&Y("entryShort")),h>0&&E!=null&&P.t>=E&&(h-=1,h===0&&(E=null)),d.cursor=P.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let P=d.fills.find(Y=>Y.orderId===I.orderId&&Y.action==="entry");if(!P)continue;let D=m.get(P.barT);if(D==null)continue;let V=D+I.horizon;if(V<u.length){I.close=u[V].c,I.barT=u[V].t,I.status="filled";let Y=I.entryPrice;I.markout=I.side==="long"?(I.close-Y)/Y:(Y-I.close)/Y}}return d.position=k,d.cooldownBarsRemaining=h,d.cooldownStartT=E,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var al=S(()=>{Rt();ol()});var ll={};M(ll,{runStrategyOperation:()=>ey});import Gw from"node:os";import Jw from"node:path";function Dr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yw(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function fs(e){if(Array.isArray(e)){for(let t of e)fs(t);return}if(Dr(e))for(let[t,r]of Object.entries(e)){if(Kw.some(n=>Yw(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);fs(r)}}function Xw(e){if(!Dr(e))throw new TypeError("strategy input must be a plain object");return fs(e),e}function Qw(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function ps(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=Vi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n}),a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function ms(e,t){let r=e.backtestOptions??{};if(!Dr(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function cl(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Dr(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:ms(e,n)}}function ul(){return Jw.join(Gw.homedir(),".oracle","strategy-shadow.json")}function Zw(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function ey(e,t={},r={}){let n=Xw(t),o=Qw(n,r);if(e==="draft")return{strategy:Wu(n.prompt,{nowMs:o})};if(e==="validate"){let i=we(n.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=we(n.strategy),s=await ps(i.strategy,n,r,o);qr(i,s);let a=Di(cl(n,i.strategy,s,o));return e==="evidence"?a:{backtest:pt(i.strategy,s,ms(n,o)),evidence:a}}if(e==="optimize"){let i=we(n.strategy),s=await ps(i.strategy,n,r,o);qr(i,s);let a=n.trainFraction,c=n.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let l=s.slice(0,Math.floor(s.length*u)),d=n.options??{};if(!Dr(d))throw new TypeError("options must be a plain object");let p=Qu(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:ms(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:Di(cl(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=ds({storePath:r.storePath??ul(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await ps(a.strategy,n,r,o);return qr(we(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=we(n.strategy),s=Vi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await ds({storePath:r.storePath??ul(),clock:()=>o}).get(n.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??Zw(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:sl(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Kw,dl=S(()=>{Nn();Rt();Ui();Gu();Zu();al();Wi();Kw=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var vl={};M(vl,{DEFAULT_CROSS_CHAIN_SOURCES:()=>yl,DEFAULT_SAME_CHAIN_SOURCES:()=>wl,NATIVE_TOKEN:()=>hs,canonicalJson:()=>xl,hashFirmQuote:()=>Al,hashRfqIntent:()=>El,normalizeFirmQuote:()=>ws,normalizeRfqIntent:()=>sy,sha256Hex:()=>Ur});import{createHash as ty}from"node:crypto";import{getAddress as gl,isAddress as gs}from"ethers";function ne(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function fl(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&ne(t,"must be a positive chainId"),r}function Dn(e,t){let r=String(e??"").trim();return(!ry.test(r)||BigInt(r)<=0n)&&ne(t,"must be a positive integer string"),r}function ny(e,t){return e==null||e===""?null:Dn(e,t)}function ml(e,t){let r=String(e??"").trim();return r.toLowerCase()===hs.toLowerCase()?hs:(gs(r)||ne(t,"must be an EVM address or native token sentinel"),gl(r))}function bl(e,t){let r=String(e??"").trim();return gs(r)||ne(t,"must be an EVM address"),gl(r)}function oy(e,t){return e==null||e===""?null:bl(e,t)}function hl(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||ne(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function iy(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||ne(n,"must be a finite millisecond timestamp"),o<=t&&ne(n,"expired"),o>t+r&&ne(n,"exceeds maxDeadlineMs"),Math.floor(o)}function ir(e){if(Array.isArray(e))return e.map(ir);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=ir(e[r]));return t}return e}function xl(e){return JSON.stringify(ir(e))}function Ur(e){return`0x${ty("sha256").update(xl(e)).digest("hex")}`}function Sl(e,t){let r={...e};for(let n of t)delete r[n];return r}function El(e){return Ur(Sl(e,["intentHash"]))}function Al(e){return Ur(Sl(e,["firmQuoteHash"]))}function sy(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&ne("time","is invalid");let o=fl(e.fromChainId??e.fromChain,"fromChainId"),i=fl(e.toChainId??e.toChain,"toChainId"),a=o===i?wl:yl,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:ml(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:ml(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Dn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:bl(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:iy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:ny(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:hl(e.allowedSources,"allowedSources",a),allowedRouters:hl(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?ir(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ne("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Ur({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=El(c),Object.freeze(c)}function ay(e){return(!e||typeof e!="object"||Array.isArray(e))&&ne("artifact","required"),e.typedDataHash!=null&&!pl.test(String(e.typedDataHash))&&ne("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!pl.test(String(e.calldataHash))&&ne("artifact.calldataHash","must be bytes32"),e.to!=null&&!gs(String(e.to))&&ne("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ne("artifact.data","must be hex"),ir(e)}function ws(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&ne("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ne("quote expiry","required"),o<=n&&ne("quote","expired"),o>e.deadlineMs&&ne("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ne("source","required"),e.allowedSources.includes(i)||ne("source","not allowed by intent");let s=Dn(t.amountOut??t.buyAmount,"amountOut"),a=Dn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&ne("minBuyAmount","exceeds amountOut");let c=ay(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||ne("quotedAtMs","must be finite");let l=oy(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:l,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(u),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?ir(t.metadata):{}};return d.quoteId||(d.quoteId=Ur({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Al(d),Object.freeze(d)}var hs,wl,yl,pl,ry,ys=S(()=>{hs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",wl=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),yl=Object.freeze(["lifi"]),pl=/^0x[0-9a-fA-F]{64}$/,ry=/^\d+$/});import{readFileSync as cy}from"node:fs";import{homedir as uy}from"node:os";import{join as Un}from"node:path";function ly(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=uy();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Un(t,".config","oracle")).trim();return[e,Un(r,"exec.env")].filter(Boolean)}return[e,Un(t,".config","oracle","exec.env"),Un(t,".config","mad-desk","exec.env")].filter(Boolean)}function Mr(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of ly())try{let i=cy(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var jr=S(()=>{});var sr=S(()=>{});import{createHash as dy,createHmac as Il,timingSafeEqual as py}from"node:crypto";function Mn(e){return Array.isArray(e)?`[${e.map(Mn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Mn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function _l(e,{required:t=!1}={}){try{return Mr(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function xs(e){let{signature:t,...r}=e;return r}function Tl(e,{secret:t}={}){let r=_l(t);return r?{...e,signature:Il("sha256",r).update(Mn(xs(e))).digest("hex")}:e}function fy(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return dy("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ve(e,{chainId:t,venue:r,data:n,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=_l(o);if(i){let f=Il("sha256",i).update(Mn(xs(e))).digest("hex");if(!my(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>it||!Number.isInteger(a)||a<0||a>it||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let l=c*BigInt(1e4-s),d=l/10000n;if(l%10000n!==0n&&(d+=1n),u<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=gy(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return Tl({...xs(e),calldataHash:fy(n)},{secret:o})}function my(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:py(r,n)}function bs(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function hy(e){let t=e==null?it:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,it)}function st({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=bs(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(bs(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,bs(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=hy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function Ss({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=kl,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=st({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||kl)),w=d*BigInt(1e4-p.selectedBps),g=w/10000n;if(w%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let y=Number((d-g)*10000n/(d===0n?1n:d));if(y>p.capBps)throw new Error(`auto-slippage: realised floor implies ${y} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Tl({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:l})}function gy(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ce(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=Ss({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var it,kl,ke=S(()=>{jr();sr();it=100,kl=2e4});function Es(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:ht}var ht,Hn=S(()=>{ht="0x000000000000000000000000000000000000dEaD"});import{Contract as wy,JsonRpcProvider as yy}from"ethers";function vy(e){return Ay.test(String(e||""))}async function Ol(e,{contract:t=by,rpc:r=Sy,chainId:n=xy,balanceOf:o}={}){if(!vy(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new yy(r,n,{staticNetwork:!0}),s=new wy(t,Ey,i);return BigInt(await s.balanceOf(e))}var by,xy,Sy,Ey,Ay,Cl=S(()=>{by="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",xy=999,Sy="https://rpc.hyperliquid.xyz/evm",Ey=["function balanceOf(address owner) view returns (uint256)"],Ay=/^0x[a-fA-F0-9]{40}$/});import{existsSync as ky,readFileSync as Iy,lstatSync as _y}from"node:fs";import{homedir as Nl}from"node:os";import{join as As}from"node:path";function Cy(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Rl,t)?Rl[t]:Oy}function $y(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Pl])return String(e[Pl]);let t=e.ORACLE_CONFIG_DIR||As(Nl(),".config","oracle");return As(t,"fee-recipient")}return As(Nl(),".config","oracle","fee-recipient")}function By(e=process.env){try{let t=$y(e);if(!ky(t)||_y(t).isSymbolicLink())return"";let r=Iy(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function qy(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),Ty)}function Fy({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ry]||"").trim(),o=String(e[Py]||Ly).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Cy(t),s=qy(e[Ny],{fallback:n?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=By(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function zn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Fy({env:t,action:r,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Ol(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Ll(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function $l(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Bl(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Ty,Oy,Rl,Ny,Ry,Py,Pl,Ly,Vn=S(()=>{Cl();Ty=100,Oy=5,Rl=Object.freeze({swap:5,bridge:5,perps:0,nft:0});Ny="ORACLE_INTEGRATOR_FEE_BPS",Ry="ORACLE_INTEGRATOR_FEE_RECIPIENT",Py="ORACLE_INTEGRATOR_ID",Pl="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Ly="oracle"});var Is={};M(Is,{LIFI_API:()=>Fl,lifiChains:()=>Hy,lifiHealth:()=>My,lifiPrepare:()=>jy,lifiQuote:()=>Lt});function ks(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Fl).replace(/\/$/,"")}function Uy(e){let t=String(e||vs).toLowerCase();return t===vs.toLowerCase()||t===Dy}function ql(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function My(e={}){let t=await N(`${ks(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function Lt(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=vs,toToken:i,fromAmount:s,fromAddress:a=ht}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let l=await zn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,y]of Object.entries($l(l)))c.set(g,y);let d=await N(`${ks(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:u,oracleFee:l};let f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ce(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),w=d?.estimate?.toAmountMin||d?.toAmountMin;if(w!=null&&BigInt(w)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function jy(e={},t={}){let r=await Lt(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Uy(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:ql(a,"approval token"),spender:ql(s,"approval spender"),amount:String(e.fromAmount)}}return Z({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:ve(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Hy(e={}){return N(`${ks(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Fl,vs,Dy,Hr=S(()=>{W();ke();Hn();ge();Vn();Fl="https://li.quest/v1";vs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Dy="0x0000000000000000000000000000000000000000"});var Ml={};M(Ml,{PARASWAP_API:()=>Dl,paraswapHealth:()=>Vy,paraswapPrepare:()=>zy,paraswapPrice:()=>cr,paraswapTokens:()=>Ul});function ar(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Ul(e={},t={}){let r=Number(e.chainId||1);return N(`${_s(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function cr(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:ar(e.srcToken,"srcToken"),destToken:ar(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await zn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Bl(o)))n.set(a,c);let i=await N(`${_s(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ce(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function zy(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=ar(e.userAddress,"userAddress"),o=await cr(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:ar(e.srcToken,"srcToken"),destToken:ar(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=ar(e.receiver,"receiver"));let c=await N(`${_s(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return Z({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:ve(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Vy(e={}){let t=await Ul({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Dl,_s,Wn=S(()=>{W();ke();ge();Vn();Dl="https://api.paraswap.io",_s=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Dl).replace(/\/$/,"")});function Gn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Hl(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Hl(t),...r]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[jl]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${jl}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Hl(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Jn(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var jl,Ts=S(()=>{jl="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Kl={};M(Kl,{ZEROX_API:()=>zl,zeroxHealth:()=>Wy,zeroxPrepare:()=>Gy,zeroxPrice:()=>Jl,zeroxQuote:()=>ur});function Vl(e={}){return Gn({provider:"zerox",defaultUrl:zl,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Wl(e={}){return Vl(e).baseUrl}function Kn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Gl(e={}){return Jn({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Kn(e)},Vl(e).trusted)}async function Wy(e={}){if(!Kn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Jl({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Jl(e={},t={}){if(!Kn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),N(`${Wl(t)}/swap/allowance-holder/price?${a}`,{headers:Gl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ur(e={},t={}){if(!Kn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await N(`${Wl(t)}/swap/allowance-holder/quote?${c}`,{headers:Gl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ce(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Gy(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await ur(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return Z({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:ve(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var zl,Yn=S(()=>{W();ke();Ts();ge();zl="https://api.0x.org"});var dT,Yl=S(()=>{dT=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var sd={};M(sd,{COW_CANCEL_TYPES:()=>td,COW_HOSTS:()=>Cs,COW_ORDER_TYPES:()=>Xn,COW_SETTLEMENT:()=>Ql,COW_VAULT_RELAYER:()=>Zl,cowCancelOrders:()=>ib,cowChains:()=>cb,cowHealth:()=>Qy,cowOrder:()=>id,cowOrderStatus:()=>od,cowOrderUid:()=>eb,cowPrepareCancel:()=>nb,cowPrepareOrder:()=>Zy,cowQuote:()=>$t,cowSignCancel:()=>ob,cowSignOrder:()=>tb,cowSubmitSignedOrder:()=>rb,cowVerifyOrderFill:()=>ab});import{TypedDataEncoder as Xl,getAddress as zr,isAddress as Jy}from"ethers";function Qn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Cs[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Ky(e,t="v1",r={}){let n=Qn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function gt(e,t){let r=String(e||"").trim();if(!Jy(r))throw new Error(`cowswap: ${t} must be an address`);return zr(r).toLowerCase()}function lr(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function rd(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function nd(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Yy({digest:e,owner:t,validTo:r}={}){let n=rd(e,"order digest").slice(2),o=gt(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Ns(e){let t=Ql[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:zr(t)}}function Xy(e={},t,r){let n=gt(e.sellToken,"sellToken"),o=gt(e.buyToken,"buyToken"),i=gt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=rd(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:lr(e.sellAmount,"sellAmount"),buyAmount:lr(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:lr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Qy(e={}){try{let t=await $t({chainId:1,sellToken:Os[1],buyToken:ed[1],sellAmountBeforeFee:"1000000000000000",from:ht},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function $t(e={},t={}){let r=Number(e.chainId??1),n=Es(e.from||e.owner),o=e.sellToken||Os[r],i=e.buyToken||ed[r],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Os[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await N(`${Qn(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ce(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Zy(e={},t={}){let r=Number(e.chainId??1),n=gt(Es(e.from||e.owner||e.signer),"owner"),o=await $t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Xy(o?.quote||o,r,n),s=Ns(r),a={domain:s,types:Xn,primaryType:"Order",message:i},c=Xl.hash(s,Xn,i),u=Zl[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return Z({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:zr(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:zr(u).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:zr(u).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function od(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${Qn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function id(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${Qn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function eb(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||Xl.hash(Ns(r),Xn,n),i=e.owner||e.from||e.signer||n.receiver;return Yy({digest:o,owner:i,validTo:n.validTo})}async function tb(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function rb(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function nb(e={}){let t=Number(e.chainId??1),r=gt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>nd(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Ns(t);return Z({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:td,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function ob(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function ib(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function sb(e={}){return lr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function ab(e={},t={}){let r=Number(e.chainId??1),n=nd(e.uid||e.orderUid),o=t.order||await id({chainId:r,uid:n},t),i=t.status||o.status||await od({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${Ky(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?gt(e.expectedOwner,"expectedOwner"):null;if(c&>(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(sb(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(lr(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(lr(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function cb(){return Object.keys(Cs).map(Number)}var Cs,Ql,Zl,Os,ed,Xn,td,Zn=S(()=>{W();ke();Yl();Hn();ge();Cs={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Ql=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zl=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Os={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ed={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Xn=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),td=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var cd={};M(cd,{CHAINS:()=>eo,chainById:()=>Ps,isSupportedChain:()=>ad,registerChain:()=>ub,rpcUrlFor:()=>Ls});function Ps(e){return Rs.get(Number(e))||null}function ub({key:e,chainId:t,name:r,rpcEnv:n=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:r||e,rpcEnv:n,evm:!0};return eo[e]=o,Rs.set(o.chainId,o),o}function Ls(e,t=process.env){let r=Ps(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function ad(e){return Rs.has(Number(e))}var eo,Rs,$s=S(()=>{eo={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Rs=new Map(Object.values(eo).map(e=>[e.chainId,e]))});import{Interface as lb,getAddress as db}from"ethers";function Vr(e,t){try{return db(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function fb(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Ls(e,r);return n||pb[Number(e)]||null}function hb(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!mb.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function X(e,t,r=[],n={}){let o=String(t||"");hb(o);let i=fb(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function ro(e,t={}){let r=await X(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function ud(e,t={}){let r=await X(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function ld(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await X(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function dd(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.owner,"owner"),i=Vr(e.spender,"spender"),s=to.encodeFunctionData("allowance",[o,i]),a=await X(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=to.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function pd(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.account||e.owner||e.address,"account"),i=to.encodeFunctionData("balanceOf",[o]),s=await X(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=to.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var to,pb,mb,at=S(()=>{W();$s();to=new lb(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);pb={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};mb=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function fd(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function no(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=fd(o,c),d=String(l.address||"").toLowerCase(),p=String(l.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,w=String(c.dex||c.dexId||"").toLowerCase(),g=0;return i.has(d)||gb.has(p)?g=300:s&&d===s&&(g=100),w.includes("v4")?g+=20:w.includes("v3")?g+=10:(w.includes("v2")||w.includes("raydium")||w.includes("orca")||w.includes("meteora"))&&(g+=8),{pool:c,score:g*1e12+m,index:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function md(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&fd(e,r[0]).address||null}var gb,Bs=S(()=>{gb=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function xb(e,t,r){let n=$e(t),o=$e(r),i=$e(e?.baseToken?.address),s=$e(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function Sb(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Eb(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||wb).replace(/\/$/,"")}async function oo(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Eb(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hd({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=$e(yb[Number(e)]||e),s=new Set(bb(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>oo(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${$e(f?.chainId)}:${$e(f?.dexId)}:${$e(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>$e(p?.chainId)===i).filter(p=>xb(p,t,r)).filter(p=>!s.size||s.has($e(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Sb(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function gd(e,{chainSlug:t="solana",stables:r=Ab}={},n={}){let o=await oo(e,n),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=no(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var wb,yb,$e,bb,Ab,Gr=S(()=>{W();Bs();wb="https://api.dexscreener.com",yb=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),$e=e=>String(e??"").toLowerCase(),bb=e=>Array.isArray(e)?e:e==null?[]:[e];Ab=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var kd={};M(kd,{PANCAKE_FEE_TIERS:()=>io,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>xd,UNI_V3_VENUES:()=>Ad,uniV3Chains:()=>Cb,uniV3EthUsdc:()=>vd,uniV3Health:()=>Ob,uniV3PrepareExactIn:()=>Tb,uniV3QuoteExactIn:()=>Bt,uniV3QuoteExactInPath:()=>_b});import{Interface as yd,getAddress as Jr,isAddress as bd}from"ethers";function Fs(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=Ad[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function qs(e,t){let r=be[Number(t)];if(!e||e===Sd||e===Ed||/^eth$/i.test(String(e)))return Jr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Jr(r.weth);if(/^usdc$/i.test(n))return Jr(r.usdc);if(!bd(n))throw new Error(`invalid token address: ${e}`);return Jr(n)}function kb(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function Ib(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function Bt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=Fs(e.chainId??8453,e.venue),s=qs(e.tokenIn||"WETH",r),a=qs(e.tokenOut||be[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:xd,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],d=[],p=null;for(let k of l){let h=so.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let E=await X(r,"eth_call",[{to:n,data:h},"latest"],t);if(!E||E==="0x"){d.push({fee:k,ok:!1,error:"empty result"});continue}let A=so.decodeFunctionResult("quoteExactInputSingle",E),v={fee:k,ok:!0,amountOut:A[0].toString(),sqrtPriceX96After:A[1].toString(),initializedTicksCrossed:Number(A[2]),gasEstimate:A[3].toString()};d.push(v),(!p||BigInt(v.amountOut)>BigInt(p.amountOut))&&(p=v)}catch(E){d.push({fee:k,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let k=d.map(h=>`${h.fee}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${k}`)}let f=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:kb(e.venue)},t).catch(()=>[]):[],m={};for(let k of f.slice(0,8))if(!(!k.pairAddress||!bd(k.pairAddress)))try{let h=await X(r,"eth_call",[{to:k.pairAddress,data:vb},"latest"],t),E=h&&h!=="0x"&&h.length<=66?Number.parseInt(h,16):NaN;if(!Number.isFinite(E)||E<=0||E>1e6)continue;(m[E]==null||k.liquidityUsd>m[E].liquidityUsd)&&(m[E]=k)}catch{}let w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&w>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),E=d.filter(A=>A.ok&&Number((k-BigInt(A.amountOut))*10000n/k)<=w).filter(A=>m[A.fee]?.liquidityUsd!=null).sort((A,v)=>m[v.fee].liquidityUsd-m[A.fee].liquidityUsd)[0];E&&E.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:E.fee,chosenPoolUsd:m[E.fee].liquidityUsd,bandBps:w},p=E)}let y=m[p.fee]??null,b=f[0]??null,T=y??b,x=e.liquidityUsd??y?.liquidityUsd??b?.liquidityUsd??null,_=e.liquidityUsd!=null?"caller":y?"pool":b?"pair":null;return ce({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:T,liquidityAttribution:_,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _b(e={},t={}){let{chainId:r,quoter:n,router:o}=Fs(e.chainId??8453),i=(e.tokens||[]).map(p=>qs(p,r)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Ib(i,s),u=so.encodeFunctionData("quoteExactInput",[c,a]),l=await X(r,"eth_call",[{to:n,data:u},"latest"],t),d=so.decodeFunctionResult("quoteExactInput",l);return ce({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:r,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function vd(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Bt({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Tb(e={},t={}){let r=Number(e.chainId??8453),n=Fs(r,e.venue),o=Jr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Sd||i===Ed||/^eth$/i.test(i),a=await Bt(e,t),c=wd.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=wd.encodeFunctionData("multicall",[d,[c]]);return Z({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:ve(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Ob(e={}){let t=Number(e.chainId??8453);try{let r=await vd({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function Cb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,xd,vb,so,wd,Sd,Ed,io,Ad,ao=S(()=>{at();Gr();ke();ge();be={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},xd=[100,500,3e3,1e4],vb="0xddca3f43",so=new yd(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),wd=new yd(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),Sd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ed="0x0000000000000000000000000000000000000000",io=[100,500,2500,1e4],Ad={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:io}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Cd={};M(Cd,{executeRfqCandidates:()=>Td,rankRfqQuotes:()=>Od,requestRfqQuotes:()=>Pb,sourceCandidates:()=>_d});function Kr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Id(e,t){return String(e?.[t]??"").trim()}function Yr(e,t){return Object.freeze({source:e,run:t})}function _d(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Kr(e,"lifi")&&s.push(Yr("lifi",async()=>{let c=await(n.lifiQuote??Lt)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),u=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:u?.toAmount??c?.toAmount,minBuyAmount:u?.toAmountMin??c?.toAmountMin??u?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await Nb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Kr(e,"paraswap")&&s.push(Yr("paraswap",async()=>{let c=await(n.paraswapPrice??cr)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),Kr(e,"0x")&&(Id(r,"ZEROX_API_KEY")||Id(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Yr("0x",async()=>{let c=await(n.zeroxQuote??ur)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Kr(e,"cow")&&s.push(Yr("cow",async()=>{let c=await(n.cowQuote??$t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Kr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Yr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??Bt)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function Nb(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function Rb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Td(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>Rb(a,n))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(ws(e,{...u.value,source:c.source},r))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Od(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Pb(e,t={}){let r=_d(e,t),{quotes:n,failed:o}=await Td(e,r,t),i=Od(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Nd=S(()=>{Hr();Wn();Yn();Zn();ao();ys()});function Rd(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Lb.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||r.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))dr.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Pd(e){let{ok:t,errors:r,warnings:n}=Rd(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
5
|
- ${r.join(`
|
|
6
|
-
- `)}`);let o=e.capabilities||{},s=Ut.filter(a=>typeof o[a]=="function"),i={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:[...s],unsupported:Ut.filter(a=>!s.includes(a))}},supports(a){return s.includes(a)}};for(let a of Ut)s.includes(a)?i[a]=async(...c)=>o[a](...c,{scanner:i}):i[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${s.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(i)}function pn(e){let t=du(e);return Ft.set(t.chainId,t),t}function O0(e){return Ft.get(Number(e))||null}function T0(){return[...Ft.values()]}function N0(){Ft.clear()}function R0(){let e={};for(let t of Ft.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:Ft.size,capabilities:[...Ut],chains:e}}var Ut,F,$,C0,Ft,bt=E(()=>{Ut=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),F=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),$=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),C0=/^0x[0-9a-fA-F]{40}$/;Ft=new Map});function pu(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:s=null,oracleFeeBps:i=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:p=!1,meta:l={}}=e||{};if(u||r==null)return{source:t,quality:_e.FAILED,amountOut:null,error:u||"no amountOut returned"};let d=br(r);if(d==null||d<=0n)return{source:t,quality:_e.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(i);return{source:t,quality:o==null?_e.NO_GAS:_e.FULL,amountOut:d.toString(),minOut:br(n)?.toString()??null,gasUsd:o,feeUsd:s,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:p,meta:l}}async function mu(e,t,{divisor:r=1000n}={}){let n=br(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let s,i;try{[s,i]=await Promise.all([e(o),e(n)])}catch{return null}let a=br(s),c=br(i);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),p=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(p)||u<=0?null:{impactPct:(1-p/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function hu(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],s=(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)}),i=[...e.warnings??[]];return n.length&&i.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&i.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:s,best:s[0]??null,impactRejected:n,impactUnmeasured:o,warnings:i}}function gs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:s=null,nativePriceUsd:i=null}={}){let a=e.filter(w=>w.quality!==_e.FAILED),c=e.filter(w=>w.quality===_e.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,p=Number(s),l=Number(i),d=Number.isFinite(p)&&p>0&&Number.isFinite(l)&&l>0,f=a.map(w=>{let O=BigInt(w.amountOut),P=0n,U=!1,k=!1,R=BigInt(w.oracleFeeBps??0),D=R>0n?O*R/10000n:0n;if(u){let q=w.gasUsd,M=Number(w.meta?.gasUnits??w.estimatedGas);if(q==null&&d&&Number.isFinite(M)&&M>0){let K=M*p/1e18*l;Number.isFinite(K)&&K>=0&&(q=K,k=!0)}let se=(q??0)+(w.feeUsd??0);if(se>0){let K=se/t*10**r;Number.isFinite(K)&&K>=0&&(P=BigInt(Math.floor(K)),U=!0)}else q===0&&(U=!0)}let W=P+D,G=O>W?O-W:0n;return{...w,grossOut:O.toString(),netOut:G.toString(),costInDest:P.toString(),oracleFeeInDest:D.toString(),costAccounted:U,gasEstimated:k}}),m=Number(o)>0?Number(o):0,y=f.reduce((w,O)=>BigInt(O.netOut)>w?BigInt(O.netOut):w,0n),g=w=>y>0n?Number((y-BigInt(w))*10000n/y):0,b=[],S=f.slice().sort((w,O)=>BigInt(O.netOut)>BigInt(w.netOut)?1:-1)[0]??null;f.sort((w,O)=>{let P=g(w.netOut)<=m?0:1,U=g(O.netOut)<=m?0:1;if(n&&m>0&&P!==U)return P-U;if(n&&m>0){let k=w.liquidityUsd??-1,R=O.liquidityUsd??-1;if(k!==R)return R-k}return BigInt(O.netOut)>BigInt(w.netOut)?1:-1}),n&&m>0&&S&&f[0]&&f[0].source!==S.source&&b.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${m} bps`);let C=f.filter(w=>!w.costAccounted).map(w=>w.source);u?C.length&&b.push(`gas not reported by: ${C.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):b.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let w=f.find(O=>O.costAccounted&&g(O.netOut)<=m);w&&b.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${w.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let I=f.filter(w=>w.gasEstimated).map(w=>w.source);I.length&&b.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${I.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,h=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let w=BigInt(f[0].netOut),O=BigInt(f[1].netOut);O>0n&&(v=Number((w-O)*10000n/O),h=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:v,spreadBasis:h,rankedOn:u?"net-of-cost":"gross",warnings:b}}async function fn(e,{timeoutMs:t=12e3}={}){let r=(o,s)=>Promise.race([o,new Promise((i,a)=>setTimeout(()=>a(new Error(`${s}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,s)=>{let i=e[s].source;return o.status==="rejected"?pu({source:i,error:String(o.reason?.message||o.reason)}):pu({source:i,...o.value})})}var _e,fu,br,ys=E(()=>{bt();_e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),fu={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"},br=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function gu(e={}){return Xr({provider:"oneinch",defaultUrl:P0,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function $0(e={}){return gu(e).baseUrl}function yu(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function q0(e={}){let t=yu(e);return Zr({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},gu(e).trusted)}async function bu(e={},t={}){if(!yu(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:s}=e;if(!n||!o||!s)throw new Error("oneinchQuote requires src, dst, amount");let i=new URLSearchParams({src:n,dst:o,amount:String(s)}),a=await T(`${$0(t)}/${r}/quote?${i}`,{headers:q0(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 P0,wu=E(()=>{z();We();us();fe();P0="https://api.1inch.dev/swap/v6.0"});var Eu={};Q(Eu,{UNI_V4_CHAINS:()=>Oe,UNI_V4_FEE_TIERS:()=>bs,computeV4PoolId:()=>ws,uniV4Chains:()=>z0,uniV4Health:()=>V0,uniV4PrepareExactIn:()=>H0,uniV4QuoteExactIn:()=>bn,uniV4QuoteExactOut:()=>j0});import{AbiCoder as B0,Interface as xu,getAddress as Ce,isAddress as gn,keccak256 as U0}from"ethers";function yn(e){let t=Number(e),r=Oe[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Oe).join(", ")})`);return{chainId:t,...r}}function hn(e,t){let r=Oe[Number(t)];if(!e||e===Su||e===nt||/^eth$/i.test(String(e)))return Ce(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ce(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ce(r.usdc);if(!gn(n))throw new Error(`invalid token address: ${e}`);return Ce(n)}function ws({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=nt}){let s=Ce(e),i=Ce(t);if(s.toLowerCase()===i.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=s.toLowerCase()<i.toLowerCase()?[s,i]:[i,s],u=o&&gn(o)?Ce(o):nt;return U0(wr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function ku({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=nt}){let s=Ce(e),i=Ce(t),[a,c]=s.toLowerCase()<i.toLowerCase()?[s,i]:[i,s],u=s.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:o&&gn(o)?Ce(o):nt},zeroForOne:u}}async function bn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:s}=yn(e.chainId??8453),i=hn(e.tokenIn||"WETH",r),a=hn(e.tokenOut||Oe[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],p=e.hooks||nt,l=[],d=null;for(let h of u){let{poolKey:w,zeroForOne:O}=ku({tokenIn:i,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:p}),P=mn.encodeFunctionData("quoteExactInputSingle",[{poolKey:w,zeroForOne:O,exactAmount:c,hookData:"0x"}]);try{let U=await(t.rpcCall||te)(r,"eth_call",[{to:n,data:P},"latest"],t);if(!U||U==="0x"){l.push({...h,ok:!1,error:"empty result"});continue}let k=mn.decodeFunctionResult("quoteExactInputSingle",U),R={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:k[0].toString(),gasEstimate:k[1].toString(),poolKey:w,zeroForOne:O,poolId:ws({...w})};l.push(R),(!d||BigInt(R.amountOut)>BigInt(d.amountOut))&&(d=R)}catch(U){l.push({...h,ok:!1,error:String(U.message||U).slice(0,160)})}}if(!d){let h=l.map(w=>`${w.fee}/${w.tickSpacing}:${w.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${h}`)}let f=e.liquidityUsd==null?await mr({chainId:r,tokenA:i,tokenB:a,dexIds:vu},t).catch(()=>[]):[],m=new Map;for(let h of f){let w=String(h.pairAddress||"").toLowerCase();w&&m.set(w,h)}let y=h=>m.get(String(h.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(d.amountOut)>0n){let h=BigInt(d.amountOut),O=l.filter(P=>P.ok&&Number((h-BigInt(P.amountOut))*10000n/h)<=g).filter(P=>y(P)?.liquidityUsd!=null).sort((P,U)=>y(U).liquidityUsd-y(P).liquidityUsd)[0];O&&O.poolId!==d.poolId&&(b={priceBestFee:d.fee,chosenFee:O.fee,chosenPoolUsd:y(O).liquidityUsd,bandBps:g},d=O)}let S=y(d),C=f[0]??null,x=S??C,I=e.liquidityUsd??S?.liquidityUsd??C?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":S?"pool":C?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:Oe[r].name,poolManager:o,quoter:n,universalRouter:s||null,tokenIn:i,tokenOut:a,amountIn:c.toString(),fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.poolKey.hooks,poolId:d.poolId,zeroForOne:d.zeroForOne,amountOut:d.amountOut,gasEstimate:d.gasEstimate,liquidityUsd:I,liquiditySource:x,liquidityAttribution:v,liquidityPick:b,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&gn(e.recipient)&&e.slippageBps!=null},{chainId:r,venue:s||n,amountOut:d.amountOut,liquidityUsd:I,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function j0(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:s}=yn(e.chainId??8453),i=hn(e.tokenIn||"WETH",r),a=hn(e.tokenOut||Oe[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],p=e.hooks||nt,l=[],d=null;for(let m of u){let{poolKey:y,zeroForOne:g}=ku({tokenIn:i,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:p}),b=mn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||te)(r,"eth_call",[{to:n,data:b},"latest"],t);if(!S||S==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let C=mn.decodeFunctionResult("quoteExactOutputSingle",S),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:C[0].toString(),gasEstimate:C[1].toString(),poolKey:y,zeroForOne:g,poolId:ws({...y})};l.push(x),(!d||BigInt(x.amountIn)<BigInt(d.amountIn))&&(d=x)}catch(S){l.push({...m,ok:!1,error:String(S.message||S).slice(0,160)})}}if(!d){let m=l.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await Gc({chainId:r,tokenA:i,tokenB:a,dexIds:vu},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:Oe[r].name,poolManager:o,quoter:n,universalRouter:s||null,tokenIn:i,tokenOut:a,amountIn:d.amountIn,amountOut:c.toString(),gasEstimate:d.gasEstimate,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.poolKey.hooks,poolId:d.poolId,zeroForOne:d.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:l,best:!0,executionReady:!1,prepareReady:!1}}async function H0(e={},t={}){let r=Number(e.chainId??8453),n=yn(r);if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let o=Ce(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>=1e4)throw new Error("slippageBps must be an integer from 0 through 9999");let i=String(e.tokenIn||"");if(!i||i===Su||i===nt||/^eth$/i.test(i))throw new Error("uniswap-v4 prepare currently requires an ERC-20 tokenIn; native input is not inferred");let a=await bn(e,t);if(!n.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let c=BigInt(a.amountOut)*BigInt(1e4-s)/10000n,u={currency0:a.zeroForOne?a.tokenIn:a.tokenOut,currency1:a.zeroForOne?a.tokenOut:a.tokenIn,fee:a.fee,tickSpacing:a.tickSpacing,hooks:a.hooks},l=wr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[u,a.zeroForOne,BigInt(a.amountIn),c,0n,"0x"]]),d=wr.encode(["address","uint256"],[a.tokenIn,BigInt(a.amountIn)]),f=wr.encode(["address","uint256"],[a.tokenOut,c]),m=wr.encode(["bytes","bytes[]"],[D0,[l,d,f]]),y=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),b=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+y,S=F0.encodeFunctionData("execute",[L0,[m],b]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:b,quote:{...a,amountOutMinimum:c.toString(),slippageBps:s},requiresApproval:{token:a.tokenIn,spender:M0,amount:a.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:o,to:n.universalRouter,data:S,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function z0(){return Object.entries(Oe).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 V0(e={}){let t=yn(e.chainId??8453),r=await te(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 wr,nt,Oe,bs,mn,F0,L0,D0,M0,Su,vu,xs=E(()=>{rt();cn();We();fe();wr=B0.defaultAbiCoder(),nt="0x0000000000000000000000000000000000000000",Oe={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}],mn=new xu(["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)"]),F0=new xu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),L0="0x10",D0="0x060c0f",M0="0x000000000022D473030F116dDEE9F6B43aC78BA3",Su="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";vu=["uniswap-v4","uniswapv4"]});function G0(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||W0).replace(/\/$/,"")}function Q0(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||K0).replace(/\/$/,"")}async function wn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return T(`${G0(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Au(e={}){return T(`${Q0(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var W0,K0,Ss=E(()=>{z();W0="https://coins.llama.fi",K0="https://api.llama.fi"});var xn={};Q(xn,{ACROSS_API:()=>Iu,HOP_API:()=>_u,RELAY_API:()=>Cu,acrossHealth:()=>J0,acrossSuggestedFees:()=>Ou,hopHealth:()=>X0,hopQuote:()=>Tu,relayHealth:()=>Z0,relayPrepare:()=>eg,relayQuote:()=>ks});async function J0(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ou({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 Ou(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:s,amount:i}=e;if(!r||o==null||s==null||!i)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(s),amount:String(i)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Iu).replace(/\/$/,"");return T(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function X0(e={}){try{let t=await Tu({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 Tu(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:s="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let i=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=Ve({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==s,requestedCapBps:e.maxSlippageBps??e.slippageBps??i});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:s,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||_u).replace(/\/$/,""),p=await T(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=p?.estimatedRecieved||p?.estimatedReceived;return l?ae(p,{chainId:Number(e.originChainId||e.chainId||Y0[o]||0),venue:p?.tx?.to||"hop",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==s,requestedCapBps:e.maxSlippageBps??e.slippageBps??i}):{...p,autoSlippagePolicy:a}}async function Z0(e={}){try{let t=await ks({user:et,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=et,originChainId:n,destinationChainId:o,originCurrency:s="0x0000000000000000000000000000000000000000",destinationCurrency:i="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=Ve({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 p=(t.baseUrl||process.env.RELAY_API_URL||Cu).replace(/\/$/,""),l=await T(`${p}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:s,destinationCurrency:i,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),d=l?.details?.currencyOut?.amount;return!d||!/^\d+$/.test(String(d))?{...l,autoSlippagePolicy:u}:ae(l,{chainId:Number(n),venue:l?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function eg(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 s=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==s))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let i=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:i},{provider:"relay",kind:"relay-tx"})}var Iu,_u,Cu,Y0,Sn=E(()=>{z();We();Gr();fe();Iu="https://across.to/api",_u="https://api.hop.exchange/v1",Cu="https://api.relay.link",Y0={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function kn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=De(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Ru(e,t={}){let r=fu[Number(e)];if(!r)return null;try{let n=await wn([r],t);return De(n?.coins?.[r]?.price)}catch{return null}}async function tg(e={}){try{let t=await Au({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function rg(e,t={}){let r=ot(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Nu[r]||[r]),n.push(...Nu[ot(e)]||[e]),n}function ng(e,t,r={}){let n=Array.isArray(e)?e:[],o=rg(t,r).map(ot).filter(Boolean);for(let s of o){let i=n.find(c=>ot(c?.slug)===s||ot(c?.name)===s),a=De(i?.tvl);if(a!=null)return{liquidityUsd:a,protocol:i?.name??i?.slug??s}}for(let s of o){let i=n.find(c=>{let u=ot(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:ot(c?.slug).includes(s)||ot(c?.name).includes(s)}),a=De(i?.tvl);if(a!=null)return{liquidityUsd:a,protocol:i?.name??i?.slug??s}}return null}function vs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:s,decimalsIn:i,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:p={}}){let l=[];return l.push({source:"lifi",run:async()=>{let d=await ht({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},p),f=d?.estimate??d?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:kn(f?.gasCosts),feeUsd:kn(f?.feeCosts),oracleFeeBps:d?.oracleFee?.applies?d.oracleFee.bps:0,meta:{tool:d?.tool??d?.toolDetails?.name,oracleFee:d?.oracleFee??null}}}}),i!=null&&l.push({source:"paraswap",run:async()=>{let d=a??(await Promise.resolve(u))?.decimals;if(d==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await $t({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:d},p),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:De(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&l.push({source:"0x",run:async()=>{let d=await qt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},p),f=null,m=d?.totalNetworkFee,y=await Promise.resolve(c);return m!=null&&y&&(f=Number(m)/1e18*y),{amountOut:d?.buyAmount,minOut:d?.minBuyAmount,gasUsd:f,meta:{source:d?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&l.push({source:"1inch",run:async()=>{let d=await bu({chainId:e,src:t,dst:r,amount:n},p),f=null;return d?.gas!=null&&c&&(f=null),{amountOut:d?.dstAmount,gasUsd:f,meta:{gasUnits:d?.gas}}}}),l.push({source:"cow",run:async()=>{let d=await gt({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},p),f=d?.quote??d,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),me[Number(e)]&&l.push({source:"uniswap-v3",run:async()=>{let d=await yt({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},p);return{amountOut:d?.amountOut,minOut:d?.minOut??d?.amountOutMinimum??null,gasUsd:null,liquidityUsd:d?.liquidityUsd??null,meta:{onchain:!0,fee:d?.fee,gasUnits:d?.gasEstimate,quoter:d?.quoter}}}}),Oe[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let d=await bn({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:s},p);return{amountOut:d?.amountOut,minOut:d?.minOut??d?.amountOutMinimum??null,gasUsd:null,liquidityUsd:d?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:d?.fee,tickSpacing:d?.tickSpacing,poolId:d?.poolId,hooks:d?.hooks,gasUnits:d?.gasEstimate,quoter:d?.quoter,poolManager:d?.poolManager,prepareReady:d?.prepareReady===!0,executionReady:!1}}}}),l}function Pu({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:s,opts:i={}}){let a=[],c=null,u=async(p,l={})=>(c||=tg(i),ng(await c,p,l));return a.push({source:"lifi",run:async()=>{let p=await ht({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},i),l=p?.estimate??p?.[0]?.estimate,d={tool:p?.tool??p?.toolDetails?.name,durationSeconds:De(l?.executionDuration)},f=await u("lifi",d);return{amountOut:l?.toAmount,minOut:l?.toAmountMin,gasUsd:kn(l?.gasCosts),feeUsd:kn(l?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...d,liquidityProtocol:f?.protocol,oracleFee:p?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:p}=await Promise.resolve().then(()=>(Sn(),xn)),d=(await p({user:s,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},i))?.details,f={durationSeconds:De(d?.timeEstimate),rate:d?.rate},m=await u("relay",f);return{amountOut:d?.currencyOut?.amount,minOut:d?.currencyOut?.minimumAmount,gasUsd:De(d?.totalImpact?.usd)!=null?Math.abs(De(d.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:p}=await Promise.resolve().then(()=>(Sn(),xn)),l=await p({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},i),d=l?.totalRelayFee?.total,f=null;if(d!=null)try{let y=BigInt(String(o))-BigInt(String(d));y>0n&&(f=y.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:De(l?.estimatedFillTimeSec),limits:l?.limits?{min:l.limits.minDeposit,max:l.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var De,ot,Nu,$u=E(()=>{dr();Jr();tn();wu();on();dn();xs();Ss();ys();De=e=>{let t=Number(e);return Number.isFinite(t)?t:null};ot=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Nu=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 Bu={};Q(Bu,{QUALITY:()=>_e,bestBridgeRoute:()=>xr,bestSwapRoute:()=>Lt,formatComparisonNote:()=>vn});async function qu(e,t,r){let n=og[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let i=(await wn([o],r))?.coins?.[o],a=Number(i?.price),c=Number(i?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function Lt(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:s}=e;if(r==null||!n||!o||s==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let i=Ru(r,t),a=qu(r,o,t),c=zc(r,t).catch(()=>null),u=vs({...e,nativePriceUsd:i,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[p,l,d]=await Promise.all([fn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);i.catch(()=>{});let f=await i.then(g=>g,()=>null),m=gs(p,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:d,nativePriceUsd:f}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let g=m.best.source,S=await mu(async C=>{let x=vs({...e,amountIn:C.toString(),nativePriceUsd:i,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(v=>v.source===g);return x.length?(await fn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},s);if(S){let C=hu(m,{[g]:S},{maxImpactPct:y});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(s),...C,sourcesTried:u.length,sourcesAnswered:p.filter(x=>x.quality!==_e.FAILED).length,note:vn(C,u.length),priceImpact:{[g]:Number(S.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(s),...m,sourcesTried:u.length,sourcesAnswered:p.filter(g=>g.quality!==_e.FAILED).length,note:vn(m,u.length)}}async function xr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:s,amountIn:i}=e;if(r==null||n==null||!o||!s||i==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=qu(n,s,t),c=Pu({...e,opts:t}),[u,p]=await Promise.all([fn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=gs(u,{destPriceUsd:p.priceUsd,destDecimals:e.decimalsOut??p.decimals,liquidityBandBps:t.liquidityBandBps??50}),d=l.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.seconds!=null);return{kind:"bridge",fromChainId:r,toChainId:n,tokenIn:o,tokenOut:s,amountIn:String(i),...l,durations:d,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==_e.FAILED).length,note:vn(l,c.length)}}function sg(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${fc(t)}`:""}function vn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=sg(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,s=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 i=s>=.01?`${s.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${i} 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 og,Dt=E(()=>{ys();$u();Yr();Ss();rt();og={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Uu={};Q(Uu,{ARTIFACT:()=>Ke,prepareBestRoute:()=>lg,supportedPreparers:()=>ag});function ag(){return Object.keys(En)}async function lg(e,t={}){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(!ug.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(cg.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 Lt(e,t);if(!n.best){let g=n.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:n}}let o=e.source||n.best.source,s=n.routes.find(g=>g.source===o);if(!s)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let i=En[o];if(!i){let g=n.routes.find(b=>En[b.source]&&b.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await i(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),C=/allowance/i.test(S),x=!C&&/not enough|insufficient|balance/i.test(S),I,v;C?(v="approval-required-first",I=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${S}`):x?(v="taker-not-funded",I=`${o} refused to build the transaction: ${S}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(v="provider-error",I=`${o} prepare failed: ${S}`);let h=n.routes.find(w=>En[w.source]&&w.source!==o);return{ok:!1,reason:I,failureKind:v,...h?{alternative:h.source}:{},comparison:n}}let c=e.driftToleranceBps??ig,u=null,p=null;if(a.amountOut!=null&&s.grossOut!=null)try{let g=BigInt(s.grossOut),b=BigInt(a.amountOut);g>0n&&(u=Number((b-g)*10000n/g),u<-c&&(p=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let l=n.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),f=n.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,b)=>Math.max(g,b.liquidityUsd??0),0)||null,m=s.liquidityUsd??null,y=m!=null&&f>0?Math.round(m/f*100):null;return J({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:s.netOut,grossOut:s.grossOut,gasUsd:s.gasUsd,liquidityUsd:s.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===Ke.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...p?[p]:[],...n.warnings||[],...a.artifactKind===Ke.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:l,comparison:{rankedOn:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var Ke,ig,En,cg,ug,Fu=E(()=>{Dt();fe();Ke=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),ig=100,En={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},s)=>{let{uniV3PrepareExactIn:i}=await Promise.resolve().then(()=>(dn(),nu)),a=await i({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},s);return{artifactKind:Ke.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:s,fee:i,tickSpacing:a,hooks:c},u)=>{let{uniV4PrepareExactIn:p}=await Promise.resolve().then(()=>(xs(),Eu)),l=await p({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:s,fee:i,tickSpacing:a,hooks:c},u);return{artifactKind:Ke.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval,amountOut:l.quote?.amountOut??null,minOut:l.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},s)=>{let{lifiPrepare:i}=await Promise.resolve().then(()=>(dr(),as)),a=await i({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},s);return{artifactKind:Ke.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:s,decimalsOut:i},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Jr(),xc)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:i,userAddress:o,side:"SELL"},a);return{artifactKind:Ke.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},s)=>{let{zeroxPrepare:i}=await Promise.resolve().then(()=>(tn(),Cc)),a=await i({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},s);return{artifactKind:Ke.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},s)=>{let{cowPrepareOrder:i}=await Promise.resolve().then(()=>(on(),Lc)),a=await i({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},s);return{artifactKind:Ke.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"}}};cg=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),ug=/^0x[0-9a-fA-F]{40}$/});var Lu={};Q(Lu,{prepareBestBridgeRoute:()=>hg,supportedBridgePreparers:()=>mg});function mg(){return Object.keys(An)}async function hg(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(!dg.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(pg.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 s=await xr(e,t);if(!s.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:s};let i=e.source||s.best.source,a=s.routes.find(g=>g.source===i);if(!a)return{ok:!1,reason:`source "${i}" returned no usable route`,comparison:s};let c=An[i];if(!c){let g=s.routes.find(b=>An[b.source]&&b.source!==i);return{ok:!1,reason:`${i} won the comparison but has no bridge prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...g?{alternative:g.source}:{},winner:i,comparison:s}}let u;try{u=await c(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),C=/allowance/i.test(S),x=!C&&/not enough|insufficient|balance/i.test(S),I=s.routes.find(v=>An[v.source]&&v.source!==i);return{ok:!1,reason:C?`${i} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${S}`:x?`${i} refused to build: ${S}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${i} bridge prepare failed: ${S}`,failureKind:C?"approval-required-first":x?"taker-not-funded":"provider-error",...I?{alternative:I.source}:{},comparison:s}}let p=u.transactions||[];if(!p.length)return{ok:!1,reason:`${i} returned no executable transaction for this route`,failureKind:"provider-error",comparison:s};let l=p.filter(g=>g.chainId!=null&&Number(g.chainId)!==Number(n));if(l.length)return{ok:!1,reason:`${i} returned a transaction for chain ${l[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:s};let d=e.driftToleranceBps??fg,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let g=BigInt(a.grossOut),b=BigInt(u.amountOut);g>0n&&(f=Number((b-g)*10000n/g),f<-d&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(d/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let y=[...m?[m]:[],...s.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 p.length>1&&y.push(`This route needs ${p.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),J({ok:!0,chosen:{source:i,wasWinner:i===s.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:p.length,transactions:p,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:p[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:y,runnersUp:s.routes.filter(g=>g.source!==i).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),comparison:{rankedOn:s.rankedOn,sourcesAnswered:s.sourcesAnswered,sourcesTried:s.sourcesTried,improvementBps:s.improvementBps},note:`UNSIGNED. ${p.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var dg,pg,fg,An,Du=E(()=>{Dt();fe();dg=/^0x[0-9a-fA-F]{40}$/,pg=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fg=100,An={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:s},i)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Sn(),xn)),c=await a({user:s,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},i);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:s,isHolder:i},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(dr(),as)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:s,isHolder:i,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 Hu={};Q(Hu,{buildTwapSchedule:()=>ju,normalizeTwapParams:()=>Mu,prepareTwapChunk:()=>Sg,simulateTwap:()=>kg});function Mu(e={}){let t=Math.max(gg,Math.min(yg,Number(e.splits)||wg)),r=Math.max(.1,Number(e.windowHours)||xg),n=Math.max(bg,r*3600),o=BigInt(e.amount)/BigInt(t),s=Math.floor(n/t),i=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:s,taker:String(e.taker),slippageBps:i,status:"planned",createdAt:new Date().toISOString()}}function ju(e){let t=Mu(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 Sg(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:s,taker:i,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 Lt({chainId:r,tokenIn:n,tokenOut:o,amountIn:s,taker:i}),u=J(c.transaction??c.tx,{chainId:r,taker:i,tokenIn:n,tokenOut:o,amountIn:s,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:s,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function kg(e,{quoteFn:t=Lt}={}){let r=ju(e),n=[],o=0n,s="unknown";for(let a=0;a<r.params.splits;a++)try{let c=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker}),u=BigInt(c.amountOut??c.quote?.amountOut??"0");o+=u,s=c.source??c.venue??s,n.push({splitIndex:a+1,amountOut:String(u),source:c.source??c.venue})}catch(c){n.push({splitIndex:a+1,error:String(c.message||c).slice(0,200)})}let i=o>0n?(Number(o)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(o),averagePrice:i,bestSource:s,chunks:n,simulatedAt:new Date().toISOString()}}var gg,yg,bg,wg,xg,zu=E(()=>{Dt();fe();gg=2,yg=100,bg=60,wg=10,xg=6});async function Ku({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:s=100,affiliateFeePercent:i="0"}={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!Vu.has(Number(e))||!Vu.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let a={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:s,affiliateFeePercent:i},c=await T(`${Wu}/dln/order/quote`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return c.error?{error:String(c.error)}:{estimation:c.estimation??{},order:c.order??{},fixFee:c.fixFee??"0"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}async function Gu(){try{return{ok:!0,chainCount:(await T(`${Wu}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Wu,Vu,Qu=E(()=>{z();fe();Wu="https://dln.debridge.finance/v1.0",Vu=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function Ju({active:e=!0}={}){let t=Date.now();if(Mt.size&&t-Yu<vg)return[...Mt.values()];try{let r=await T(`${Es}/exchange/currencies?active=${e?"true":"false"}`);Mt.clear();for(let n of r??[])Mt.set(String(n.ticker).toLowerCase(),n);return Yu=t,r??[]}catch(r){return Mt.size?[...Mt.values()]:{error:String(r.message||r).slice(0,200)}}}async function Eg(e,t){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await T(`${Es}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Ag(e,t,r,{flow:n="standard"}={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let o=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await T(`${Es}/exchange/estimated-amount?${o}`);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function Xu({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let o=await Eg(e,t);if(o.error)return o;let s=r??o.minAmount,i=await Ag(e,t,s,{flow:n});if(i.error)return i;let a=await Ju(),c=a.find(p=>String(p?.ticker).toLowerCase()===String(e).toLowerCase()),u=a.find(p=>String(p?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:i.toAmount,estimatedRate:i.rate,minAmount:o.minAmount,flow:i.flow,networkFee:c?.networkFee??null,kycRequired:c?.kycRequired??u?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function Zu(){try{let e=await Ju();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 Es,Mt,Yu,vg,el=E(()=>{z();Es="https://api.changenow.io/v2",Mt=new Map,Yu=0,vg=6e5});async function tl({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:s,slippage:i=1}={}){if(!e||!t||!r||!n||!o||!s)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let a={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:s,slippage:i},c=await T(`${Ig}/route`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return{route:c?.route??{},toAmount:c?.route?.estimate?.toAmount,fee:c?.route?.estimate?.feeCosts}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Ig,rl=E(()=>{z();Ig="https://api.squidrouter.com/v1"});async function nl({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:s="0"}={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let i=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(s)}),a=await T(`${_g}/quote?${i}`);return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var _g,ol=E(()=>{z();_g="https://api.stargate.finance"});async function sl({fromAsset:e,toAsset:t,amount:r,destination:n}={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let o=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await T(`${Cg}/quote/swap?${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(o){return{error:String(o.message||o).slice(0,200)}}}var Cg,il=E(()=>{z();Cg="https://midgard.ninerealms.com/v2"});async function al({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:s}={}){if(!e||!t||!r||!n||!o||!s)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let i=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:s,sort:"output",singleTxOnly:"false"}),a=await T(`${Og}/quote?${i}`);return{amountOut:a?.result?.toAmount,feeUsd:a?.result?.totalGasFeesInUsd,route:a?.result?.route,estimatedTime:a?.result?.serviceTime?`${a.result.serviceTime}s`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Og,cl=E(()=>{z();Og="https://api.socket.tech/v2"});async function ul({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},i=await T(`${Tg}/estimate`,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"}});return{amountOut:i?.amountOut,fee:i?.fee,estimatedTime:i?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Tg,ll=E(()=>{z();Tg="https://api.connext.network"});async function dl({fromChain:e,toChain:t,token:r,amount:n}={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let o=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await T(`${Ng}/quote?${o}`);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var Ng,pl=E(()=>{z();Ng="https://api.portalbridge.com/v1"});function Rg(e,t){return`0x${Is.getAmountsOut}`+Se(e)+Se(64)+Se(t.length)+t.map(Sr).join("")}function Pg(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 s=128+o*64;if(t.length<s+64)return null;n.push(BigInt(`0x${t.slice(s,s+64)}`))}return n}function As(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function $g(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>_s)throw new Error(`slippageBps ${r} exceeds the ${_s} 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 fl(e){let{chainId:t,wrappedNative:r}=e;async function n(o,s,i,a){let c=await te(t,"eth_call",[{to:o,data:Rg(s,i)},"latest"],a);return Pg(c?.result??c)}return{async quote({tokenIn:o,tokenOut:s,amountIn:i,path:a},c={}){let u=As(c.scanner);if(!u)return{chainId:t,evidence:F.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let p=a||[o,s];if(p.some(d=>!/^0x[0-9a-fA-F]{40}$/.test(d||"")))throw new Error("quote requires valid 20-byte addresses");let l=await n(u,i,p,c);return l?{chainId:t,router:u,path:p,amountIn:String(i),amountOut:l[l.length-1].toString(),hops:p.length-1,evidence:F.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:p,evidence:F.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:s,base:i},a={}){let c=As(a.scanner),u=i||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:F.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:F.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 p=await n(c,s,[u,o],a);if(!p)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let l=p[p.length-1];if(l===0n)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let d=await n(c,l,[o,u],a);if(!d)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"sell",bought:l.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=d[d.length-1],m=Number(f*10000n/BigInt(s)),y=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(y=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=$.CAUTION,g=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:y,reason:g,amountIn:String(s),bought:l.toString(),returned:f.toString(),retentionBps:m,evidence:F.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:s,amountIn:i,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:p},l={}){let d=l.scanner,f=As(d);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=p||[o,s],y=await this.quote({tokenIn:o,tokenOut:s,amountIn:i,path:m},l);if(y.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let g=$g(y.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=BigInt(Math.floor(Date.now()/1e3)+Number(u)),S=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,C=S?`0x${Is.swapExactETHForTokens}`+Se(g)+Se(128)+Sr(a)+Se(b)+Se(m.length)+m.map(Sr).join(""):`0x${Is.swapExactTokensForTokens}`+Se(i)+Se(g)+Se(160)+Sr(a)+Se(b)+Se(m.length)+m.map(Sr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:C,value:S?`0x${BigInt(i).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:_s,deadline:b.toString()},requires:S?[]:[{step:"approve",token:m[0],spender:f,amount:String(i)}],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 Is,Se,Sr,_s,ml=E(()=>{rt();bt();Is={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Se=e=>BigInt(e).toString(16).padStart(64,"0"),Sr=e=>e.slice(2).toLowerCase().padStart(64,"0");_s=100});function Bg(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 Cs(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function yl(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:s,tokenIn:i,tokenOut:a,amountIn:c,fee:u},p){let l=`0x${hl.quoteExactInputSingle}`+kr(i)+kr(a)+wt(c)+wt(u)+wt(0),d=await te(t,"eth_call",[{to:s,data:l},"latest"],p).catch(()=>null),f=d?.result??d;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:s,tokenIn:i,tokenOut:a,amountIn:c},u){let p=[],l=null;for(let d of qg){let f=await n({quoter:s,tokenIn:i,tokenOut:a,amountIn:c,fee:d},u);p.push({fee:d,amountOut:f?f.toString():null}),f&&(!l||f>l.amountOut)&&(l={fee:d,amountOut:f})}return{best:l,tried:p}}return{async quote({tokenIn:s,tokenOut:i,amountIn:a},c={}){let u=Cs(c.scanner,"quoter");if(!u)return{chainId:t,evidence:F.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let d of[s,i])if(!gl.test(d||""))throw new Error("quote requires valid 20-byte addresses");let{best:p,tried:l}=await o({quoter:u,tokenIn:s,tokenOut:i,amountIn:a},c);return p?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:s,tokenOut:i,amountIn:String(a),amountOut:p.amountOut.toString(),fee:p.fee,useNative:!!r&&String(s).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:l,evidence:F.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:s,tokenOut:i,triedFeeTiers:l,evidence:F.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:s,amountIn:i,base:a},c={}){let u=Cs(c.scanner,"quoter"),p=a||r;if(p&&String(s).toLowerCase()===String(p).toLowerCase())return{chainId:t,token:s,verdict:$.UNKNOWN,evidence:F.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||!p)return{chainId:t,token:s,verdict:$.UNKNOWN,evidence:F.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let l=await o({quoter:u,tokenIn:p,tokenOut:s,amountIn:i},c);if(!l.best)return{chainId:t,token:s,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let d=await o({quoter:u,tokenIn:s,tokenOut:p,amountIn:l.best.amountOut},c);if(!d.best)return{chainId:t,token:s,verdict:$.FAIL,evidence:F.LIVE,leg:"sell",bought:l.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=d.best.amountOut,m=Number(f*10000n/BigInt(i)),y=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(y=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=$.CAUTION,g=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:s,base:p,verdict:y,reason:g,amountIn:String(i),bought:l.best.amountOut.toString(),returned:f.toString(),retentionBps:m,buyFee:l.best.fee,sellFee:d.best.fee,evidence:F.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:s,tokenOut:i,amountIn:a,recipient:c,slippageBps:u=50,fee:p},l={}){let d=Cs(l.scanner,"router");if(!d)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(!gl.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:s,tokenOut:i,amountIn:a},l);if(f.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=p??f.fee,y=Bg(f.amountOut,u);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(l.useNative||f.useNative)&&r&&String(s).toLowerCase()===String(r).toLowerCase(),b=`0x${hl.exactInputSingle}`+kr(s)+kr(i)+wt(m)+kr(c)+wt(a)+wt(y)+wt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:d,data:b,value:g?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:y.toString(),slippageBps:u,maxSlippageBps:Os,fee:m},requires:g?[]:[{step:"approve",token:s,spender:d,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 qg,hl,wt,kr,gl,Os,bl=E(()=>{rt();bt();qg=[100,500,3e3,1e4],hl={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},wt=e=>BigInt(e).toString(16).padStart(64,"0"),kr=e=>e.slice(2).toLowerCase().padStart(64,"0"),gl=/^0x[0-9a-fA-F]{40}$/,Os=100});function wl(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function xl(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),s=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(s)return s}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function Ug(e){let{chainId:t}=e;async function r(n,o,s){return te(t,"eth_call",[{to:n,data:o},"latest"],s)}return{async blockNumber(n={}){let o=await an(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:F.LIVE}},async nativeBalance(n,o={}){let s=await Vc(t,n,o);return{chainId:t,address:n,wei:s?.wei??s?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:F.LIVE}},async tokenBalance({token:n,owner:o},s={}){let i=await Kc({chainId:t,token:n,owner:o},s);return{chainId:t,token:n,owner:o,raw:i?.balance??i,evidence:F.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:F.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[s,i,a,c]=await Promise.all([r(n,In.decimals,o).catch(()=>null),r(n,In.symbol,o).catch(()=>null),r(n,In.name,o).catch(()=>null),r(n,In.totalSupply,o).catch(()=>null)]),u=wl(s?.result??s),p=u!==null||i?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:xl(i?.result??i),name:xl(a?.result??a),totalSupply:(wl(c?.result??c)??null)?.toString()??null,evidence:p?F.LIVE:F.UNKNOWN,warning:p?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let s=e.dexscreenerSlug;if(!s)return{chainId:t,token:n,pools:[],evidence:F.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let i=await fs(n,o).catch(()=>null),c=(i?.pairs||i?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(s).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,p)=>(p.liquidityUsd??0)-(u.liquidityUsd??0));return{chainId:t,token:n,pools:c,evidence:c.length?F.LIVE:F.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:s,topics:i,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=[],p=[];for(let l=n;l<=o;l+=a){let d=Math.min(l+a-1,o);p.push([l,d])}for(let[l,d]of p){let f={fromBlock:`0x${l.toString(16)}`,toBlock:`0x${d.toString(16)}`};s&&(f.address=s),i&&(f.topics=i);let m=await te(t,"eth_getLogs",[f],c).catch(y=>({error:String(y?.message||y)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[l,d],error:m.error,evidence:F.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:p.length,evidence:F.LIVE}},async scoreRisk(n,o={}){let s=[],i=$.PASS,a=p=>{let l={[$.PASS]:0,[$.CAUTION]:1,[$.UNKNOWN]:2,[$.FAIL]:3};l[p]>l[i]&&(i=p)},c=await this.resolveToken(n,o);c.evidence!==F.LIVE?(s.push({check:"erc20-metadata",result:$.UNKNOWN,detail:c.warning}),a($.UNKNOWN)):s.push({check:"erc20-metadata",result:$.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===F.UNAVAILABLE)s.push({check:"liquidity",result:$.UNKNOWN,detail:u.reason}),a($.UNKNOWN);else if(!u.pools.length)s.push({check:"liquidity",result:$.FAIL,detail:"no pool with liquidity found"}),a($.FAIL);else{let p=u.pools[0],l=p.liquidityUsd??0;l<5e3?(s.push({check:"liquidity",result:$.CAUTION,detail:`top pool only $${l}`}),a($.CAUTION)):s.push({check:"liquidity",result:$.PASS,detail:`$${l} on ${p.dex}`}),p.createdAt&&Date.now()-p.createdAt<24*3600*1e3&&(s.push({check:"age",result:$.CAUTION,detail:"pool under 24h old"}),a($.CAUTION))}if(typeof this.sellSimulation=="function"){let p=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:$.UNKNOWN,reason:String(l?.message||l)}));s.push({check:"sellability",result:p.verdict,detail:p.retentionBps!=null?`round trip returns ${(p.retentionBps/100).toFixed(2)}% -- ${p.reason}`:p.reason}),a(p.verdict)}else s.push({check:"sellability",result:$.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a($.UNKNOWN);return{chainId:t,token:n,verdict:i,checks:s,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ts(e){let r={...Ug(e)},n=new Set((e.venues||[]).map(s=>s.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,yl({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,fl({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[s,i]of Object.entries(r))o[s]=i.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 In,Sl=E(()=>{rt();cn();bt();ml();bl();In={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function kl(){return vr.map(e=>pn(Ts(e)))}function vl(e){return pn(Ts(e))}var vr,Ns=E(()=>{Sl();bt();vr=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",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",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",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",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",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",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",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",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 Ol,getAddress as Fg,id as Tl}from"ethers";function jt(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function $s(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function _n(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 ty(e,t){try{return Fg(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ry(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Cl(e){return`0x${String(e).slice(-40).toLowerCase()}`}function ny({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>Qg)return"stale"}return"scoped"}function oy(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,s=e%n;if(s===0n)return o.toLocaleString("en-US");let i=s.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${i?`.${i}`:""}`}async function sy(e,t,r,n){let o=`${e}:${t}`,s=n?.get(o);if(s)return s;if(jt(r)){let a=$s(Il,o,Yg);if(a)return a.value}let i=(async()=>{let a=async l=>{try{let d=El.encodeFunctionData(l,[]),f=await te(e,"eth_call",[{to:t,data:d},"latest"],r);return!f||f==="0x"?null:El.decodeFunctionResult(l,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),p={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return jt(r)&&_n(Il,o,p,Zg),p})();return n?.set(o,i),i}async function iy(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Dg,1),Mg),o=await an(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let s=Math.max(0,o-n),i=await te(e,"eth_getLogs",[{fromBlock:`0x${s.toString(16)}`,toBlock:"latest",topics:[Lg,ry(t)]}],r);if(!Array.isArray(i))throw new Error("log scan returned no array");let a=new Map;for(let c of i){let u=String(c?.address||"").toLowerCase(),p=c?.topics?.[2];!u||!p||a.set(`${u}:${Cl(p)}`,{token:u,spender:Cl(p)})}return{pairs:[...a.values()],fromBlock:s,toBlock:o}}function ay(e){return(Wg[e]||[]).flatMap(r=>Hg.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function cy(e,t,r={}){let n=[],o="direct-probe",s=null,i=ay(e),a=Ps(e),c=jt(r)&&$s(Rs,e,Jg)?.value===!1;if(i.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 iy(e,t,r);n=u.pairs,o="log-scan",s={fromBlock:u.fromBlock,toBlock:u.toBlock},jt(r)&&_n(Rs,e,!0,64)}catch{if(jt(r)&&_n(Rs,e,!1,64),n=i,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,l=(await qr(n,r.concurrency||4,async f=>{try{let m=await Wc({chainId:e,token:f.token,owner:t,spender:f.spender},r),y=BigInt(m.allowance);if(y<=0n)return null;let g=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await sy(e,f.token,r,u),b=y>=Gg,S=jg[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:g.symbol,decimals:g.decimals,spender:f.spender,spenderLabel:S,allowance:y.toString(),allowanceDisplay:oy(y,g.decimals,b),unlimited:b,lastActivityAt:null,risk:ny({unlimited:b,spenderLabel:S,lastActivityAt:null})}}catch{return null}})).filter(Boolean),d=await ly(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:Ps(e).length,...s||{}},approvals:[...l,...d]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function uy(e,t,r,n,o){try{let s=Al.encodeFunctionData("isApprovedForAll",[r,n]),i=await te(e,"eth_call",[{to:t,data:s},"latest"],o);return!i||i==="0x"?null:!!Al.decodeFunctionResult("isApprovedForAll",i)[0]}catch{return null}}function Ps(e){return(Vg[e]||[]).flatMap(r=>zg.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function ly(e,t,r){let n=Ps(e);return n.length===0?[]:(await qr(n,r.concurrency||4,async s=>await uy(e,s.collection,t,s.operator,r)!==!0?null:{id:`${e}:${s.collection}:${s.operator}:all`,chainId:e,standard:"erc721",token:s.collection,tokenSymbol:s.collectionName,decimals:null,spender:s.operator,spenderLabel:s.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Nl(e={},t={}){let r=ty(e.owner||e.address,"owner"),n=new Map(vr.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()],s=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,i=jt(t)&&!e.refresh;if(i){let f=$s(_l,s,Xg);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await qr(o,e.concurrency||3,f=>cy(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),p=u.find(f=>f.method==="log-scan"&&f.toBlock),l=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),d={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:p?`last ${p.toBlock-p.fromBlock} blocks`:l?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return i&&_n(_l,s,d,ey),{...d,cached:!1,cachedAgeMs:0}}var El,Al,Lg,Vv,Dg,Mg,jg,Hg,zg,Vg,Wg,Kg,Gg,Qg,Yg,Jg,Xg,Zg,ey,Il,Rs,_l,Rl=E(()=>{Ns();z();rt();El=new Ol(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Al=new Ol(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Lg=Tl("Approval(address,address,uint256)"),Vv=Tl("ApprovalForAll(address,address,bool)"),Dg=1e4,Mg=2e5,jg=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)"}),Hg=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"}]),zg=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"}]),Vg=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"}]}),Wg=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}]}),Kg=(1n<<256n)-1n,Gg=Kg/2n,Qg=4320*60*60*1e3,Yg=360*60*1e3,Jg=600*1e3,Xg=45*1e3,Zg=512,ey=128,Il=new Map,Rs=new Map,_l=new Map});var ql={};Q(ql,{aggregateBridgeQuotes:()=>Pl,bridgeAggregatorHealth:()=>py,checkRevokeNeeded:()=>$l,scanBridgeRoutes:()=>dy});async function Pl(e={}){let{fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amount:s,taker:i,fromSymbol:a="?",toSymbol:c="?",fromDecimals:u=18,toDecimals:p=18}=e,l=[],d=[],f=Ku({srcChainId:t,srcChainTokenIn:n,srcChainTokenInAmount:s,dstChainId:r,dstChainTokenOut:o}).then(h=>h.error?(d.push(`debridge: ${h.error}`),null):{provider:"debridge",amountOut:h.estimation?.dstChainTokenOut?.amount??h.estimation?.toAmount,feeUsd:h.estimation?.fixFee??h.fixFee,estimatedTime:h.estimation?.execution?.estimatedTransferTime?`${h.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:h}).catch(h=>(d.push(`debridge: ${h.message}`),null)),m=xr({fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amountIn:s,taker:i}).then(h=>!h||h.error?(d.push(`lifi: ${h?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:h.amountOut??h.quote?.amountOut,feeUsd:h.feeUsd??h.totalFee,estimatedTime:h.estimatedTime??h.duration??"unknown",preparable:!!h.transaction,raw:h}).catch(h=>(d.push(`lifi: ${h.message}`),null)),y=tl({fromChain:t,toChain:r,fromToken:n,toToken:o,fromAmount:s,fromAddress:i}).then(h=>h.error?(d.push(`squid: ${h.error}`),null):{provider:"squid",amountOut:h.toAmount,feeUsd:Array.isArray(h.fee)?h.fee.reduce((w,O)=>w+(Number(O.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:h}).catch(h=>(d.push(`squid: ${h.message}`),null)),g=nl({srcChainId:t,dstChainId:r,token:n,amount:s}).then(h=>h.error?(d.push(`stargate: ${h.error}`),null):{provider:"stargate",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"1-5 min",preparable:!1,raw:h}).catch(h=>(d.push(`stargate: ${h.message}`),null)),b=sl({fromAsset:a,toAsset:c,amount:s,destination:i}).then(h=>h.error?(d.push(`thorchain: ${h.error}`),null):{provider:"thorchain",amountOut:h.expectedAmountOut,feeUsd:h.fees?.total,estimatedTime:h.estimatedTime||"10-30 min",preparable:!1,raw:h}).catch(h=>(d.push(`thorchain: ${h.message}`),null)),S=(async()=>{if(!a||!c||a==="?"||c==="?")return d.push("changenow: ticker symbols required, skipping"),null;try{let h=await Xu({fromTicker:a,toTicker:c,fromAmount:s});return h.error?(d.push(`changenow: ${h.error}`),null):{provider:"changenow",amountOut:h.toAmount,feeUsd:h.networkFee,estimatedTime:h.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:h.kycRequired,raw:h}}catch(h){return d.push(`changenow: ${h.message}`),null}})(),C=al({fromChainId:t,toChainId:r,fromToken:n,toToken:o,fromAmount:s,userAddress:i}).then(h=>h.error?(d.push(`bungee: ${h.error}`),null):{provider:"bungee",amountOut:h.amountOut,feeUsd:h.feeUsd,estimatedTime:h.estimatedTime,preparable:!1,raw:h}).catch(h=>(d.push(`bungee: ${h.message}`),null)),x=ul({originDomain:t,destinationDomain:r,originToken:n,destinationToken:o,amount:s}).then(h=>h.error?(d.push(`connext: ${h.error}`),null):{provider:"connext",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-20 min",preparable:!1,raw:h}).catch(h=>(d.push(`connext: ${h.message}`),null)),I=dl({fromChain:t,toChain:r,token:n,amount:s}).then(h=>h.error?(d.push(`wormhole: ${h.error}`),null):{provider:"wormhole",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-15 min",preparable:!1,raw:h}).catch(h=>(d.push(`wormhole: ${h.message}`),null)),v=await Promise.allSettled([f,m,y,g,b,C,x,I,S]);for(let h of v)h.status==="fulfilled"&&h.value&&l.push(h.value);return l.sort((h,w)=>{let O=Number(h.amountOut??0),P=Number(w.amountOut??0);return O!==P?P-O:h.preparable&&!w.preparable?-1:!h.preparable&&w.preparable?1:0}),{providers:l.map(h=>h.provider),bestRoute:l[0]?.provider??"none",winner:l[0]??null,runnersUp:l.slice(1),errors:d.length?d:null}}async function $l({chainId:e,taker:t,tokenIn:r}={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let o=(await Nl({chainIds:[e],address:t})).approvals;if(!o?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?o.find(i=>String(i.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 (${o.length} total approvals on chain)`}}catch(n){return{needsRevoke:!1,note:`revoke check unavailable: ${String(n.message||n).slice(0,100)}`}}}async function dy(e={}){let[t,r]=await Promise.all([Pl(e),$l({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn})]),n=t.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:n.provider??"none",amountOut:n.amountOut,feeUsd:n.feeUsd,estimatedTime:n.estimatedTime,preparable:n.preparable?"yes":"no (manual send)",providers:t.providers,runnersUp:t.runnersUp,revokeCheck:r,errors:t.errors,confidence:t.providers.length>=2?.85:t.providers.length===1?.6:.1}}async function py(){let[e,t]=await Promise.all([Gu().catch(r=>({ok:!1,error:r.message})),Zu().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var yE,Bl=E(()=>{Dt();Qu();el();rl();ol();il();cl();ll();pl();Rl();yE=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Ul={};Q(Ul,{DYDX_API:()=>Cn,dydxHealth:()=>hy,dydxMarkets:()=>fy,dydxOrderbook:()=>my});async function fy(e=50){try{return((await T(`${Cn}/v4/perpetualMarkets?limit=${e}`))?.markets||[]).map(r=>({ticker:r?.ticker,oraclePrice:r?.oraclePrice,indexPrice:r?.indexPrice,nextFundingRate:r?.nextFundingRate?`${(Number(r.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:r?.openInterest,volume24h:r?.volume24H}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function my(e){try{let t=await T(`${Cn}/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 hy(){try{return{ok:!0,serverTime:(await T(`${Cn}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cn,Fl=E(()=>{z();Cn="https://api.dydx.exchange"});var Dl={};Q(Dl,{DRIFT_API:()=>Ll,driftHealth:()=>yy,driftMarkets:()=>gy});async function gy(){try{return((await T(`${Ll}/v2/markets`))?.markets||[]).map(t=>({symbol:t?.symbol||t?.marketIndex,oraclePrice:t?.amm?.oraclePrice,markPrice:t?.amm?.markPrice,fundingRate:t?.amm?.lastFundingRate?`${(Number(t.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:t?.amm?.longFunding,short:t?.amm?.shortFunding},volume24h:t?.amm?.quoteAssetVolume}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function yy(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ll,Ml=E(()=>{z();Ll="https://dlob.drift.trade"});var jl={};Q(jl,{VERTEX_API:()=>On,vertexHealth:()=>xy,vertexMarkets:()=>by,vertexOrderbook:()=>wy});async function by(){try{return((await T(`${On}/query`,{method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json"}}))?.data?.all_markets||[]).map(t=>({market:t?.market,type:t?.type,oraclePrice:t?.oracle_price_x18?(Number(BigInt(t.oracle_price_x18))/1e18).toFixed(4):null,minSize:t?.min_size,productId:t?.product_id}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function wy(e){try{let r=(await T(`${On}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function xy(){try{return{ok:!0,status:(await T(`${On}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var On,Hl=E(()=>{z();On="https://gateway.prod.vertexprotocol.com/v2"});var zl={};Q(zl,{pancakeHealth:()=>vy,pancakeQuote:()=>ky});async function ky({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},i=await T(`${Sy}/quote`,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"}});return{amountOut:i?.amountOut,route:i?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function vy(){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 Sy,Vl=E(()=>{z();Sy="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Kl={};Q(Kl,{sushiHealth:()=>Iy,sushiQuote:()=>Ay});async function Ay({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,i=await T(`${Ey(e)}/quote?query=${encodeURIComponent(s)}`);return{amountOut:i?.data?.quote?.amountOut,route:i?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Iy(){try{return{ok:!0,chains:Object.keys(Wl).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ey,Wl,Gl=E(()=>{z();Ey=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${Wl[e]||"ethereum"}`,Wl={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 Ql={};Q(Ql,{raydiumHealth:()=>Oy,raydiumQuote:()=>Cy});async function Cy({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let o=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await T(`${_y}/quote?${o}`),i=(s?.routePlan||[]).filter(a=>a?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:i.length,allRoutes:s?.routePlan?.length||0}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function Oy(){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 _y,Yl=E(()=>{z();_y="https://quote-api.jup.ag/v6"});var Jl={};Q(Jl,{AEVO_API:()=>qs,aevoHealth:()=>Ny,aevoMarkets:()=>Ty});async function Ty(){try{return(await T(`${qs}/markets`)||[]).map(t=>({instrument:t?.instrument_name,type:t?.instrument_type,markPrice:t?.mark_price,indexPrice:t?.index_price,fundingRate:t?.funding_rate?`${(Number(t.funding_rate)*100).toFixed(4)}%`:null,openInterest:t?.open_interest,volume24h:t?.volume_24h}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Ny(){try{return{ok:(await T(`${qs}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var qs,Xl=E(()=>{z();qs="https://api.aevo.xyz"});var Zl={};Q(Zl,{compoundHealth:()=>$y,compoundMarkets:()=>Py});async function Py(){try{return((await T(`${Ry}/ctoken`))?.cToken||[]).map(t=>({symbol:t?.symbol,underlying:t?.underlying_symbol,supplyApy:t?.supply_rate?.value?`${(Number(t.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:t?.borrow_rate?.value?`${(Number(t.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:t?.total_supply?.value,totalBorrow:t?.total_borrows?.value,collateralFactor:t?.collateral_factor?.value?`${(Number(t.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function $y(){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 Ry,ed=E(()=>{z();Ry="https://api.compound.finance/api/v2"});var td={};Q(td,{yearnHealth:()=>Uy,yearnVaults:()=>By});async function By(){try{return(await T(`${qy}/vaults/all`)||[]).map(t=>({name:t?.name,symbol:t?.symbol,apy:t?.apy?.net_apy?`${(Number(t.apy.net_apy)*100).toFixed(2)}%`:null,tvl:t?.tvl?.tvl_deposited,chain:t?.chainId,type:t?.type||"v2"}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Uy(){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 qy,rd=E(()=>{z();qy="https://api.yearn.fi/v1"});var nd={};Q(nd,{convexHealth:()=>Dy,convexPools:()=>Ly});async function Ly(){try{return(await T(`${Fy}/pools`)||[]).map(t=>({name:t?.curvePool?.name||t?.name,curveApy:t?.curvePool?.apy?`${(Number(t.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:t?.apy?`${(Number(t.apy)*100).toFixed(2)}%`:null,tvl:t?.tvl,boosted:t?.boosted||!1}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Dy(){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 Fy,od=E(()=>{z();Fy="https://api.convexfinance.com/api"});function xt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Me(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return xt(t),Object.freeze({mantissa:e,scale:t})}function st(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`);xt(e.scale)}function Tn(e){return xt(e),10n**BigInt(e)}function B(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("."),s=`${n}${o}`,i=BigInt(s)*(t?-1n:1n);return Me(i,o.length)}function he(e,t){if(xt(t),typeof e=="bigint")return Me(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Me(BigInt(e),t)}function Te(e){st(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 Er(e,t){return st(e),xt(t),t===e.scale?Me(e.mantissa,e.scale):t>e.scale?Me(e.mantissa*Tn(t-e.scale),t):Me(e.mantissa/Tn(e.scale-t),t)}function Bs(e,t){st(e,"left"),st(t,"right");let r=Math.max(e.scale,t.scale);return[Er(e,r),Er(t,r),r]}function it(e,t){let[r,n,o]=Bs(e,t);return Me(r.mantissa+n.mantissa,o)}function Ar(e,t){let[r,n,o]=Bs(e,t);return Me(r.mantissa-n.mantissa,o)}function be(e,t){st(e,"left"),st(t,"right");let r=e.scale+t.scale;return xt(r),Me(e.mantissa*t.mantissa,r)}function Ne(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(st(e,"left"),st(t,"right"),xt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*Tn(t.scale+r),o=t.mantissa*Tn(e.scale);return Me(n/o,r)}function at(e,t){let[r,n]=Bs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var CE,ke=E(()=>{CE=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as id,readFileSync as My}from"node:fs";import{dirname as sd,join as Us}from"node:path";import{fileURLToPath as jy}from"node:url";function Hy(e){let t=sd(jy(e));for(let r=0;r<8;r+=1){let n=Us(t,"package.json");if(id(n))try{let s=JSON.parse(My(n,"utf8"));if(s&&typeof s.version=="string")return t}catch{}let o=sd(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ad(e,t){let r=Hy(t),n=Us(r,e);return id(n)?n:Us(r,"dist","assets",e)}var cd=E(()=>{});import{readFileSync as zy,existsSync as Vy}from"node:fs";import{fileURLToPath as Wy}from"node:url";import{dirname as Ky,join as ld}from"node:path";function Qy(){try{let e=ad("equities-fixtures",import.meta.url);if(e&&Vy(e))return e}catch{}return Gy}function Jy(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function H(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){Jy(e)||H(t,`${r} must be an object`)}function V(e,t,r){(typeof e!="string"||e.length===0)&&H(t,`${r} must be a nonempty string`)}function je(e,t,r){Number.isSafeInteger(e)||H(t,`${r} must be a safe integer`)}function ct(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))V(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function Xy(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 s=e.venues[n];oe(s,t,`venues.${n}`),V(s.type,t,`venues.${n}.type`),V(s.chain,t,`venues.${n}.chain`),V(s.tier,t,`venues.${n}.tier`),ct(s[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))ct(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function Zy(e,t){ct(e,t,"root"),Object.keys(e).length===0&&H(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||H(t,`${r}.venues must be an array`),n.venues.forEach((o,s)=>V(o,t,`${r}.venues[${s}]`))}function eb(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])je(e[r],t,r);V(e.usdg,t,"usdg"),ct(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))V(n.oracle,t,`assets.${r}.oracle`),V(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&H(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&H(t,`assets.${r}.usd must be a nonnegative finite source number`)}function tb(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||H(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&H(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>je(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>V(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&H(t,`dates[${o}] must use YYYY-MM-DD`)})}function rb(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&H(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let s of["year","startUtc","endUtc"])je(n[s],t,`dstTransitions[${o}].${s}`);n.startUtc>=n.endUtc&&H(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&H(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function nb(e,t){ct(e,t,"root"),Object.keys(e).length===0&&H(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])V(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&H(t,`${r}.liq must be a nonnegative finite source number`)}}function ob(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),je(e.block,t,"block"),je(e.chainId,t,"chainId"),V(e.gasPriceWei,t,"gasPriceWei"),V(e.stateView,t,"stateView"),ct(e.pools,t,"pools"),Object.keys(e.pools).length===0&&H(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])V(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&H(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&H(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&H(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function sb(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&H(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))&&H(t,`books.${r} must have bids and asks arrays`);for(let[o,s]of n.bids.entries())oe(s,t,`books.${r}.bids[${o}]`),V(s.px,t,`books.${r}.bids[${o}].px`),V(s.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,s]of n.asks.entries())oe(s,t,`books.${r}.asks[${o}]`),V(s.px,t,`books.${r}.asks[${o}].px`),V(s.sz,t,`books.${r}.asks[${o}].sz`)}}function ib(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),V(e.chain,t,"chain"),ct(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&H(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){V(n.symbolRaw,t,`tokens.${r}.symbolRaw`),V(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||H(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&H(t,`pairs.${r} must be a nonempty array`);for(let[o,s]of e.pairs[r].entries())oe(s,t,`pairs.${r}[${o}]`),V(s.pairAddress,t,`pairs.${r}[${o}].pairAddress`),V(s.dexId,t,`pairs.${r}[${o}].dexId`),(typeof s.priceUsd!="number"||!Number.isFinite(s.priceUsd)||s.priceUsd<=0)&&H(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof s.liquidityUsd!="number"||!Number.isFinite(s.liquidityUsd)||s.liquidityUsd<0)&&H(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function ab(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),V(e.chain,t,"chain"),e.chain!=="ton"&&H(t,'chain must be "ton"'),ct(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&H(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){V(n.symbolRaw,t,`tokens.${r}.symbolRaw`),V(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||H(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&H(t,`pairs.${r} must be a nonempty array`);for(let[o,s]of e.pairs[r].entries())oe(s,t,`pairs.${r}[${o}]`),V(s.pairAddress,t,`pairs.${r}[${o}].pairAddress`),V(s.dexId,t,`pairs.${r}[${o}].dexId`),(typeof s.priceUsd!="number"||!Number.isFinite(s.priceUsd)||s.priceUsd<=0)&&H(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof s.liquidityUsd!="number"||!Number.isFinite(s.liquidityUsd)||s.liquidityUsd<0)&&H(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function ub(e,t){let r=dd[t],n=ld(e,r),o;try{o=zy(n,"utf8")}catch(i){throw i?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${i.message}`)}let s;try{s=JSON.parse(o)}catch(i){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${i.message}`)}return cb[t](s,r),s}function pd(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))pd(t)}return e}function Fs({fixtureDir:e=Yy}={}){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(dd))t[r]=ub(e,r);return pd(t)}function Ge(){return ud??=Fs(),ud}function we(){return Ge().venues}function fd(){return Ge().universe}function md(){return Ge().oracles}function hd(){return Ge().nyseHolidays}function gd(){return Ge().dstTransitions}function Nn(){return Ge().rhPoolState}function yd(){return Ge().solanaXstocks}function bd(){return Ge().tonXstocks}function wd(){return Ge().hip3L2Books}var Gy,Yy,dd,cb,ud,Re=E(()=>{cd();Gy=ld(Ky(Wy(import.meta.url)),"fixtures");Yy=Qy(),dd=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"});cb=Object.freeze({venues:Xy,universe:Zy,oracles:eb,nyseHolidays:tb,dstTransitions:rb,equityDexPools:nb,rhPoolState:ob,solanaXstocks:ib,tonXstocks:ab,hip3L2Books:sb})});function pb(){let e=gd().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ds,endMs:n.endUtc*Ds}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function _d(){return Sd??=pb(),Sd}function fb(){return Ls===void 0&&(Ls=new Set(hd().holidayDayIndex)),Ls}function Cd(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function mb(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:s}=_d();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${s}). Refusing to assume a UTC offset.`)}function hb(e){for(let t of _d().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function gb(e){return hb(e)?db:lb}function yb(e){let t=e+gb(e),r=Math.floor(t/xd),n=t-r*xd,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/kd),msIntoDay:n,weekday:o.getUTCDay()}}function bb({dayIndex:e,weekday:t}){return t===0||t===6?!1:!fb().has(e)}function wb(e){return e<vd?"dark":e<Ed?"extended":e<Ad?"core":e<Id?"extended":"dark"}function Ir(e){Cd(e,"sessionState"),mb(e,"sessionState");let t=yb(e);return bb(t)?wb(t.minuteOfDay):"dark"}function js(e){return Cd(e,"isDark"),Ir(e)==="dark"}var Ds,kd,Ms,xd,lb,db,vd,Ed,Ad,Id,DE,ME,Sd,Ls,Rn=E(()=>{Re();Ds=1e3,kd=60*Ds,Ms=60*kd,xd=24*Ms,lb=-5*Ms,db=-4*Ms,vd=240,Ed=570,Ad=960,Id=1200,DE=Object.freeze([vd,Ed,Ad,Id]),ME=Object.freeze(["core","extended","dark"])});function $n(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function kb(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function vb(e){return!e.bid||!e.ask?!1:at(e.bid,e.ask)>0}function Od(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function qn(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??xb,o=t.oracleFreshnessMs??Sb,s=t.includeDormant===!0,i=[],a=[];for(let c of e){if(kb(c)){s?i.push(Object.freeze({...c,staleData:!0})):$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(vb(c)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.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(Od(c,r,n)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.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=Ir(r),p=u==="core"?o:o*2;if(Od(c,r,p)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}i.push(c)}return{survivors:i,excluded:a}}var Pn,xb,Sb,Hs=E(()=>{ke();Rn();Pn=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),xb=12e4,Sb=6e5});function Eb(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),s=r.startsWith("-"),i=s?r.slice(1):r,[a,c=""]=i.split("."),u=`${a}${c}`,p=a.length+o,l;return p<=0?l=`0.${"0".repeat(-p)}${u}`:p>=u.length?l=`${u}${"0".repeat(p-u.length)}`:l=`${u.slice(0,p)}.${u.slice(p)}`,`${s?"-":""}${l}`}function ue(e){return e==null?null:typeof e=="string"?B(e):typeof e!="number"||!Number.isFinite(e)?null:B(Eb(e))}function Pe(e,t){let r=ue(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var St=E(()=>{ke()});function X(e,t){throw new TypeError(`${e} ${t}`)}function Rd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function kt(e,t){Rd(e)||X(t,"must be an object")}function Pd(e,t,r){Object.hasOwn(e,t)||X(`${r}.${t}`,"is required")}function Ht(e,t){(typeof e!="string"||e.length===0)&&X(t,"must be a nonempty string")}function _r(e,t,r){t.has(e)||X(r,`must be one of ${[...t].join(", ")}`)}function Vs(e,t){(!Number.isSafeInteger(e)||e<0)&&X(t,"must be a nonnegative safe integer")}function zs(e,t,r=!1){e===null&&r||(Rd(e)||X(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&X(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&X(`${t}.scale`,"must be a nonnegative safe integer"))}function Bn(e,t,r=!1){e===null&&r||kt(e,t)}function Nd(e,t){kt(e,t),Ht(e.venue,`${t}.venue`),Ht(e.reason,`${t}.reason`),Nb.test(e.reason)||X(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&Ht(e.symbol,`${t}.symbol`)}function ge(e){kt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Td,"costAccounted","capturedAt","blockOrSeq","raw"])Pd(e,r,"quote");Ht(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&X("quote.chain","must be a nonempty string or nonnegative chain id"),_r(e.instrument,Ab,"quote.instrument"),_r(e.tier,Ib,"quote.tier"),Ht(e.symbolRaw,"quote.symbolRaw"),Ht(e.symbol,"quote.symbol"),_r(e.side,_b,"quote.side"),zs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&X("quote.requestedSize","must not be negative");let t=0;for(let r of Tb)Object.hasOwn(e,r)&&(zs(e[r],`quote.${r}`),t+=1);t===0&&X("quote","must contain at least one of bid, ask, mid, mark");for(let r of Td)zs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&X("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&X(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&X("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&X("quote.fundingHourly","must be null for a spot quote"),Vs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&X("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),kt(e.raw,"quote.raw"),e}function Un(e){kt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Pd(e,t,"rankResult");return _r(e.rankedOn,Cb,"rankResult.rankedOn"),Array.isArray(e.ranked)||X("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>Bn(t,`rankResult.ranked[${r}]`)),Bn(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&X("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&X("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||X("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>Bn(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&X("rankResult.improvementBps","must be a finite number or null"),Vs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Vs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&X("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||X("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Nd(t,`failed[${r}]`)),Array.isArray(e.excluded)||X("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Nd(t,`excluded[${r}]`)),e.darkWindow!==null&&kt(e.darkWindow,"rankResult.darkWindow"),_r(e.instrumentMix,Ob,"rankResult.instrumentMix"),Bn(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&kt(e.carry,"rankResult.carry"),e}var Ab,Ib,_b,Cb,Ob,Tb,Td,Nb,Qe=E(()=>{Ab=new Set(["spot","perp"]),Ib=new Set(["read-only","quote-only","prepare","intent"]),_b=new Set(["buy","sell"]),Cb=new Set(["net-of-cost","gross"]),Ob=new Set(["homogeneous","heterogeneous"]),Tb=["bid","ask","mid","mark"],Td=["fees","gasEstimate","priceImpact","fundingHourly"],Nb=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function $d(){return we().venues.arcus}function qb(){return Object.keys($d().markets).sort()}function Bb({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=$d().markets[n];if(!o)return null;let s=Pe(o.mark,`${n}.mark`),i=ue(o.oracle),a=ue(o.fundingHourly),c=r===null?B("0"):r,u={venue:Rb,chain:Pb,instrument:"perp",tier:$b,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:s,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:we().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:Fn,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return i!==null&&(u.raw.oracleFixed=i),ge(u)}function Ln({side:e="buy",sizeUsd:t=null}={}){return qb().map(r=>Bb({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Rb,Pb,$b,Fn,Ws=E(()=>{Re();St();ke();Qe();Rb="arcus_perp",Pb="robinhood-4663",$b="quote-only",Fn="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 B("0");let n=B(String(t)),o=he(10000n,0);return be(be(e,n),o)}function Bd(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:B("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,s=e.fundingHourly;if(o&&s!==null){let a=Ub(n,t),c=t-a,u=B(Fn),p=Ks(s,c),l=Ks(u,a),d=Math.max(p.scale,l.scale),f={mantissa:p.mantissa*10n**BigInt(d-p.scale)+l.mantissa*10n**BigInt(d-l.scale),scale:d};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Te(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Fn,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(s===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let i=Ks(s,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:i,carryBpsDisplay:Te(i),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function Ub(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)js(e+o*qd)&&(r+=1);return t>n&&js(e+n*qd)&&(r+=t-n),r}var qd,oA,Ud=E(()=>{ke();Ws();Rn();qd=36e5,oA=24*365});function Fb(e){return e.mid??e.mark??e.ask??e.bid??null}function Lb(e){let t=Fb(e);if(t===null)return null;let r=e.costAccounted===!0,n=B("0");e.fees!==null?n=it(n,e.fees):r=!1,e.priceImpact!==null?n=it(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=it(n,e.gasEstimate);let o;if(e.fees!==null&&at(e.fees,B("1"))<0&&at(e.fees,B("0"))>=0){let s=it(B("1"),e.fees);o=be(t,s),e.priceImpact!==null&&(o=it(o,be(t,e.priceImpact)))}else o=it(t,n);return{net:o,costAccounted:r,px:t}}function Db(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 Mb(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=Ar(t.net,e.net);return Ne(be(r,he(10000n,0)),t.net,4)}function Dn(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,s=[];if(!t.skipLiveness){let h=qn(e,{nowMs:r});o=h.survivors,s=h.excluded}let i=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,p=[];for(let h of o){let w=Lb(h);if(w===null)continue;let O=null;if(u&&h.instrument==="perp"&&(O=Bd(h,c,{nowMs:r}),O.carryBps!==null)){let P=it(B("1"),Ne(O.carryBps,he(10000n,0),12));w.net=be(w.net,P),w.costAccounted=!1}p.push(Db(h,w,O))}let l=p,d="homogeneous";if(u)d="heterogeneous",l=p;else{let h=p.filter(O=>O.instrument==="spot"),w=p.filter(O=>O.instrument==="perp");h.length>0&&w.length>0?(l=h.length>=w.length?h:w,d="homogeneous"):(l=p,d="homogeneous")}l.sort((h,w)=>{let O=at(h.net,w.net);return O!==0?O:h.venue<w.venue?-1:h.venue>w.venue?1:0});let f=l[0]??null,m=l.slice(1),y=l,g="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(g="net-of-cost");let b=m.length===0?null:Mb(f,m[0]),S=p.find(h=>h.tier==="prepare")??null,C=Ir(r),x=C==="core"?null:{session:C,warning:C==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},I=null;u&&(I=jb(p));let v={rankedOn:g,ranked:y,winner:f,runnersUp:m,improvementBps:b===null?null:Number(Te(b)),sourcesAnswered:i,sourcesTried:n,failed:a,excluded:s,darkWindow:x,instrumentMix:d,bestPreparable:S,carry:f?.carry??null,breakEvenHorizonHours:I};return Un(v)}function jb(e){let t=e.filter(s=>s.instrument==="spot").sort((s,i)=>at(s.net,i.net))[0],r=e.filter(s=>s.instrument==="perp").sort((s,i)=>at(s.net,i.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=Ar(t.net,r.net);if(n.mantissa===0n)return 0;let o=be(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let s=Ne(n,o,4),i=Number(Te(s));return!Number.isFinite(i)||i<0?null:i}catch{return null}}var Gs=E(()=>{Hs();Ud();Rn();ke();Qe()});function Qs(){return Nn()}function Gb(e){return{mantissa:e*e*10n**BigInt(zt)/Wb,scale:zt}}function Qb(e){let t=Gb(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ne(be(t,he(10n**BigInt(r),0)),he(10n**BigInt(n),0),zt);return o.mantissa===0n?null:Ne(B("1"),o,zt)}return Ne(be(t,he(10n**BigInt(n),0)),he(10n**BigInt(r),0),zt)}function Yb(e){let t=md(),r=t.assets[e];return r?he(r.rawPrice,t.oracleScaleExp):null}function Jb(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ne(t,Xb(r,t),zt)}function Xb(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Er(e,r).mantissa+Er(t,r).mantissa,scale:r}}function Zb(e){let t=Qs(),r=Kb[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ys(){return Object.keys(Qs().pools).sort()}function Vt({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=Qs(),o=n.pools[e];if(!o)return null;let s=Qb(o);if(s===null)return null;let i=ue(o.liqUsd),a=r===null?B("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:Ne(he(BigInt(o.feePpm),0),he(1000000n,0),8),u=a.mantissa===0n?B("0"):Jb(i,a),p=Zb(o.version),f={venue:Hb,chain:zb,instrument:"spot",tier:Vb,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:s,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:p===null?null:p.wei.toString(),gasUnits:p===null?null:p.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=Yb(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Te(Ne(be(Ar(s,m),he(10000n,0)),m,4))),ge(f)}function Fd({side:e="buy",sizeUsd:t=null}={}){return Ys().map(r=>Vt({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Hb,zb,Vb,Wb,zt,Kb,Js=E(()=>{Re();St();ke();Qe();Hb="rh_uniswap",zb=4663,Vb="prepare",Wb=1n<<192n,zt=18,Kb=Object.freeze({v3:180000n,v4:240000n})});function Mn(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:s=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 i=Vt({symbol:t,side:r,sizeUsd:n});if(i===null)throw new Error(`no RH Uniswap pool for ${t}`);if(i.tier!=="prepare")throw new Error(`route tier is ${i.tier}, only prepare tier can be prepared`);let a=s-i.capturedAt;if(a>Ld)throw new Error(`quote is stale (${a}ms old, bound ${Ld}ms); re-quote before preparing`);let u=Nn().pools[t],p=u.version==="v4"?tw:ew,l=p,d=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:p,data:"0x",value:"0",requiresApproval:{spender:l,token:d,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:i.venue,symbol:i.symbol,symbolRaw:i.symbolRaw,capturedAt:i.capturedAt,blockOrSeq:i.blockOrSeq,mid:i.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 Ld,ew,tw,Xs=E(()=>{Js();Re();Ld=12e4,ew="0x0000000000000000000000000000000000000000",tw="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Cr(){return we().venues.hyperliquid_hip3}function Dd(){return Object.keys(Cr().dexs).sort()}function sw(){let e=[];for(let[t,r]of Object.entries(Cr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function iw(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),s=Cr().dexs[n]?.[o];return s?[{dex:n,ticker:o,market:s}]:[]}let r=[];for(let[n,o]of Object.entries(Cr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function aw(e,t){try{return wd().books[`${e}:${t}`]??null}catch{return null}}function cw(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(Te(r));if(!Number.isFinite(o)||o<=0)return null;let s=0,i=0,a=0;for(let c of n){let u=Number(c.px),p=Number(c.sz);if(!(u>0)||!(p>0))continue;let l=u*p,d=Math.min(o,l),f=d/u;if(s+=d,i+=f,o-=d,a+=1,o<=1e-9)break}return i<=0?null:{vwap:s/i,filledUsd:s,unfilledUsd:Math.max(0,o),levelsUsed:a}}function uw(e,t,r,n){let o=cw(e,t,r);if(!o)return{impact:null,depth:null};let s=Number(Te(n));if(!(s>0))return{impact:null,depth:o};let i=t==="buy"?(o.vwap-s)/s:(s-o.vwap)/s,a=Math.max(0,i);return{impact:ue(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Md({dex:e,ticker:t,market:r,side:n,size:o}){let s=Pe(r.mark,`${e}:${t}.mark`),i=ue(r.fundingHourly),a=ue(r.vol24h),c=ue(r.oi),u=o===null?B("0"):o,p=aw(e,t),l=null,d=null,f="fees and gas not captured";if(u.mantissa>0n)if(p){let g=uw(p,n,u,s);l=g.impact,d=g.depth,d?.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 p?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:rw,chain:nw,instrument:"perp",tier:ow,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:s,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:i,costAccounted:!1,capturedAt:we().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:p!==null,l2BookFixture:p?"fixtures/hip3_l2books.json":null,depth:d}};return a!==null&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),p?.bids?.[0]&&p?.asks?.[0]&&(y.bid=B(String(p.bids[0].px)),y.ask=B(String(p.asks[0].px))),ge(y)}function jd({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=iw(e);return n.length===0||n.length>1?null:Md({...n[0],side:t,size:r})}function jn({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of sw()){let[s,i]=o.split(":");if(r!==null&&i!==r)continue;let a=Cr().dexs[s][i];n.push(Md({dex:s,ticker:i,market:a,side:e,size:t}))}return n}var rw,nw,ow,Hd=E(()=>{Re();St();ke();Qe();rw="hyperliquid_hip3",nw="hyperliquid",ow="quote-only"});function zd(){return we().venues.arcus_spot}function fw(){return Object.keys(zd().pairs).sort()}function mw({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=zd().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Pe(n.bid,`${e}.bid`),s=n.ask===void 0||n.ask===null?null:Pe(n.ask,`${e}.ask`),i=ue(n.last),a=null;if(o!==null&&s!==null){a={mantissa:o.mantissa+s.mantissa,scale:o.scale===s.scale?o.scale+1:Math.max(o.scale,s.scale)+1};let l=Math.max(o.scale,s.scale),d=o.scale===l?o.mantissa:o.mantissa*10n**BigInt(l-o.scale),f=s.scale===l?s.mantissa:s.mantissa*10n**BigInt(l-s.scale);a={mantissa:d+f,scale:l+1},a={mantissa:(d+f)/2n,scale:l}}else i!==null&&(a=i);if(o===null&&s===null&&a===null)return null;let c=r===null?B("0"):r,u=B("0"),p={venue:lw,chain:dw,instrument:"spot",tier:pw,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:we().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&&(p.bid=o),s!==null&&(p.ask=s),a!==null&&(p.mid=a),ge(p)}function Hn({side:e="buy",sizeUsd:t=null}={}){return fw().map(r=>mw({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var lw,dw,pw,Vd=E(()=>{Re();St();ke();Qe();lw="arcus_spot",dw="robinhood-4663",pw="quote-only"});function zn(){return yd()}function Zs(){return Object.keys(zn().tokens).sort()}function bw(e){let t=zn().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function ww(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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),s=o*10n**6n,i=n+o;return{mantissa:s/i,scale:6}}function ei({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,s=zn().tokens;if(Object.hasOwn(s,e))n=e,o=s[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}else return null;let i=s[n],a=bw(n);if(!i||!a)return null;let c=Pe(a.priceUsd,`${n}.priceUsd`),u=ue(a.liquidityUsd),p=r===null?B("0"):r,l=p.mantissa===0n?B("0"):ww(u,p),d=!1;p.mantissa===0n&&(a.liquidityUsd??0)>=Wd&&(d=!1);let f={venue:hw,chain:gw,instrument:"spot",tier:yw,symbolRaw:o,symbol:n,side:t,requestedSize:p,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:d,capturedAt:zn().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:i.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)<Wd}};return ge(f)}function Kd({side:e="buy",sizeUsd:t=null}={}){return Zs().map(r=>ei({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var hw,gw,yw,Wd,Gd=E(()=>{Re();St();ke();Qe();hw="solana_xstocks",gw="solana",yw="quote-only",Wd=25e3});function Vn(){return bd()}function ti(){return Object.keys(Vn().tokens).sort()}function Aw(e){let t=Vn().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function Iw(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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),s=o*10n**6n,i=n+o;return{mantissa:s/i,scale:6}}function ri({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,s=Vn().tokens;if(Object.hasOwn(s,e))n=e,o=s[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}let i=s[n],a=Aw(n);if(!i||!a)return null;let c=Pe(a.priceUsd,`${n}.priceUsd`),u=ue(a.liquidityUsd),p=r===null?B("0"):r,l=p.mantissa===0n?B("0"):Iw(u,p),f={venue:xw,chain:Sw,instrument:"spot",tier:kw,symbolRaw:o,symbol:n,side:t,requestedSize:p,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:Vn().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:i.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)<vw,impactSizeFractionHint:Ew}};return ge(f)}function Qd({side:e="buy",sizeUsd:t=null}={}){return ti().map(r=>ri({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var xw,Sw,kw,vw,Ew,Yd=E(()=>{Re();St();ke();Qe();xw="ton_stonfi",Sw="ton",kw="quote-only",vw=25e3,Ew=.01});var Wn={};Q(Wn,{bestEquityRoute:()=>_w,collectEquityQuotes:()=>Xd,equityVenues:()=>Cw,getUniverse:()=>fd,getVenues:()=>we,loadFixtures:()=>Fs,prepareEquity:()=>Mn,prepareEquityRoute:()=>Ow,rankEquityQuotes:()=>Dn,toJsonSafe:()=>Tw,validateQuote:()=>ge,validateRankResult:()=>Un});function ni(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:B(String(e))}function Xd(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=ni(t),o=[],s=jd({symbol:`xyz:${r}`,sizeUsd:n});if(s)o.push(s);else for(let u of jn({ticker:r,sizeUsd:n}))o.push(u);for(let u of Ln({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Hn({sizeUsd:n}))u.symbol===r&&o.push(u);let i=Vt({symbol:r,sizeUsd:n});i&&o.push(i);let a=ei({symbol:r,sizeUsd:n});a&&o.push(a);let c=ri({symbol:r,sizeUsd:n});return c&&o.push(c),o}function _w(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=ni(e.sizeUsd??e.size??null),n=Xd(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,s=String(o).length<=10?o*1e3:o,i=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-s),u=Dn(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:i?"fixture":"caller-clock",capturedAt:s,ageMs:c,stale:c>Jd}}function Cw(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:jn().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Ln().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Hn().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ys().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Zs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ti().length}],t=[...jn(),...Ln(),...Hn(),...Fd(),...Kd(),...Qd()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=qn(t,{nowMs:r});return{inventory:e,hip3Dexs:Dd(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((s,i)=>(s[i.reason]=(s[i.reason]??0)+1,s),{})},capturedAt:we().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function Ow(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=ni(e.sizeUsd??e.size??null),o=Vt({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 s=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,i=e.nowMs!=null,a=i?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-s),u=Mn({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:i?"caller-clock":"live-clock",capturedAt:s,ageMs:c,stale:c>Jd}}catch(s){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(s.message||s)}}}function Tw(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var Jd,Kn=E(()=>{ke();Gs();Xs();Hs();Hd();Vd();Ws();Js();Gd();Yd();Re();Gs();Xs();Qe();Re();Jd=3600*1e3});var Gn={};Q(Gn,{CHAIN_CONFIGS:()=>vr,EVIDENCE:()=>F,RISK:()=>$,SCANNER_CAPABILITIES:()=>Ut,__clearScanners:()=>N0,createScanner:()=>du,getScanner:()=>O0,listScanners:()=>T0,registerBuiltinScanners:()=>kl,registerCustomChain:()=>vl,registerScanner:()=>pn,scannerCoverage:()=>R0,validateScanner:()=>lu});var Qn=E(()=>{bt();Ns()});import Zd from"node:fs";import oi from"node:process";import{fileURLToPath as Nw}from"node:url";import{homedir as to}from"node:os";import{join as ro}from"node:path";var fi=process.env.ORACLE_PUBLIC_DESKTOP==="1",no=fi?process.env.ORACLE_CONFIG_DIR||ro(to(),".config","oracle"):ro(to(),".config","oracle"),jw=fi?no:ro(to(),".config","mad-desk");function Qt(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}import Yt from"node:fs";import Jt from"node:path";var hi=/^0x[0-9a-fA-F]{40}$/,dp=new Set(["privatekey","private_key","secret","seed","mnemonic","passphrase","signature","keystore"]),pp=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","signature","wif","xprv","xpriv","apikey","bearer","credential"],fp=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/,/\b(?:[a-z]{3,8}\s+){11,}[a-z]{3,8}\b/i],mp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/;function hp(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function gp(e,t){let r=hp(e);if(dp.has(String(e).toLowerCase())||pp.some(n=>r.includes(n)))throw new Error(`address-book: ${t} is forbidden; the book stores labels, never key material`)}function yp(e,t){if(typeof e=="string"&&(fp.some(r=>r.test(e))||mp.test(e)))throw new Error(`address-book: ${t} looks like key material; the book stores labels, never key material`)}function gi(){let e=Qt("ORACLE_ADDRESS_BOOK","MAD_ADDRESS_BOOK","");if(e)return Jt.resolve(e);let t=Qt("ORACLE_CONFIG_DIR","MAD_CONFIG_DIR",no);return Jt.join(t,"address-book.json")}function oo(e,t="field"){if(Array.isArray(e)){e.forEach((r,n)=>oo(r,`${t}[${n}]`));return}if(!e||typeof e!="object"){yp(e,t);return}for(let[r,n]of Object.entries(e))gp(r,r),oo(n,r)}function so(e){let t=String(e||"").trim();if(!hi.test(t))throw new Error("address-book: address must be 0x + 40 hex characters");return t.toLowerCase()}function vt(e,t){return e==null||e===""?null:String(e).slice(0,t)}function mi(){return{version:1,updatedAt:null,entries:[]}}function yi(e){return{address:String(e.address).toLowerCase(),label:vt(e.label,80)||"unknown",who:vt(e.who,120),role:vt(e.role,40),chainIds:Array.isArray(e.chainIds)?e.chainIds.map(Number).filter(Number.isFinite):[],notes:vt(e.notes,500),source:vt(e.source,80),firstSeenAt:e.firstSeenAt||null,lastSeenAt:e.lastSeenAt||null}}function Rr(){try{let e=JSON.parse(Yt.readFileSync(gi(),"utf8"));if(!e||typeof e!="object")return mi();let t=Array.isArray(e.entries)?e.entries:[];return{version:1,updatedAt:e.updatedAt||null,entries:t.filter(r=>r&&typeof r=="object"&&hi.test(String(r.address||""))).map(yi)}}catch{return mi()}}function bi(e){let t=gi();Yt.mkdirSync(Jt.dirname(t),{recursive:!0,mode:448});let r={...e,version:1,updatedAt:new Date().toISOString()},n=Jt.join(Jt.dirname(t),`.address-book.${process.pid}.tmp`);Yt.writeFileSync(n,`${JSON.stringify(r,null,2)}
|
|
7
|
-
`,{mode:384}),Yt.renameSync(n,t);try{Yt.chmodSync(t,384)}catch{}return r}function wi(e={}){let t=Rr(),r=t.entries;if(e.role&&(r=r.filter(n=>n.role===String(e.role))),e.who){let n=String(e.who).toLowerCase();r=r.filter(o=>(o.who||"").toLowerCase().includes(n)||(o.label||"").toLowerCase().includes(n))}if(e.q){let n=String(e.q).toLowerCase();r=r.filter(o=>o.address.includes(n)||(o.label||"").toLowerCase().includes(n)||(o.who||"").toLowerCase().includes(n)||(o.notes||"").toLowerCase().includes(n))}return{updatedAt:t.updatedAt,count:r.length,entries:r}}function xi(e){let t=so(e),r=Rr().entries.filter(n=>n.address===t);return{address:t,found:r.length>0,entries:r}}function Si(e={}){oo(e);let t=so(e.address),r=vt(e.label??e.role,80)||"wallet",n=new Date().toISOString(),o=Rr(),s=o.entries.findIndex(u=>u.address===t&&u.label===r),i=yi({address:t,label:r,who:e.who,role:e.role,chainIds:e.chainIds,notes:e.notes,source:e.source||"agent",firstSeenAt:s>=0&&o.entries[s].firstSeenAt||n,lastSeenAt:n});s>=0?o.entries[s]=i:o.entries.push(i);let a=u=>u==="agent"?0:u==="owner"?1:2;o.entries.sort((u,p)=>a(u.role)-a(p.role)||u.label.localeCompare(p.label)||u.address.localeCompare(p.address));let c=bi(o);return{ok:!0,entry:i,count:c.entries.length}}function ki(e,t=null){let r=so(e),n=Rr(),o=n.entries.length;return n.entries=n.entries.filter(s=>s.address!==r?!0:t==null?!1:s.label!==String(t)),bi(n),{ok:!0,removed:o-n.entries.length,count:n.entries.length}}import{createInterface as bp}from"node:readline";var Be=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),wp=/^[A-Za-z0-9_-]{1,64}$/;function Pr(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function le(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function xp(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Sp(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=Be.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";!wp.test(o)||r.has(o)||(r.add(o),t.push(n))}return t}function kp(e){let t=Number(e)||Be.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Be.maxCallTimeoutMs)}async function vp(e,t){let r;try{return await Promise.race([e,new Promise((n,o)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",o(s)},t)})])}finally{clearTimeout(r)}}function io(e,t={}){let r=Sp(e?.tools),n=new Set(r.map(c=>c.name)),o=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",i=kp(t.callTimeoutMs),a=!1;return async function(u){let p=u?.id??null;if(!xp(u))return le(p,-32600,"invalid request");if(u.method==="initialize")return a=!0,Pr(p,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:o,version:s}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return Pr(p,{});if(!a)return le(p,-32002,"server not initialized");if(u.method==="tools/list")return Pr(p,{tools:r});if(u.method==="tools/call"){let l=u.params?.name,d=u.params?.arguments??{};if(typeof l!="string"||!n.has(l))return le(p,-32602,"unknown tool");if(!d||typeof d!="object"||Array.isArray(d))return le(p,-32602,"tool arguments must be an object");let f;try{f=JSON.stringify(d)}catch{return le(p,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(f)>Be.maxArgumentBytes)return le(p,-32602,"tool arguments exceeded the size limit");try{let m=await vp(Promise.resolve(e.call(l,d)),i);return Pr(p,m)}catch(m){if(m?.code==="ORACLE_MCP_TIMEOUT")return le(p,-32001,"tool call timed out");let y=typeof m?.message=="string"?m.message.replace(/\s+/g," ").trim():"",g=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(y),b=/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(y.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return g&&!b&&y.length<=200?le(p,-32e3,`tool call failed: ${y}`):le(p,-32e3,"tool call failed")}}return le(p,-32601,"method not found")}}function vi(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Be.maxRequestBytes,64),Be.maxRequestBytes),s=Math.min(Math.max(Number(t.maxResponseBytes)||Be.maxResponseBytes,256),Be.maxResponseBytes),i=Math.min(Math.max(Number(t.maxConcurrentCalls)||Be.maxConcurrentCalls,1),Be.maxConcurrentCalls),a=i*8,c=io(e,t),u={closed:!1,inflight:0},p=bp({input:r,terminal:!1,crlfDelay:1/0}),l=0,d=[],f=!1,m=!1;function y(){if(u.closed||u.readerClosed)return;let x=u.inflight>=i||d.length>0||m;x&&!f?(f=!0,p.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),p.resume())}function g(x){if(!x||u.closed)return;let I=JSON.stringify(x);Buffer.byteLength(I)>s&&(I=JSON.stringify(le(x.id,-32003,"response exceeded the size limit"))),n.write(`${I}
|
|
8
|
-
`)
|
|
9
|
-
`);for(let v=0;v<I.length;v+=1){if(l+=Buffer.byteLength(I[v]),l>o){C();return}v<I.length-1&&(l=0)}}),p.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){C();return}let I;try{I=JSON.parse(x)}catch{g(le(null,-32700,"parse error"));return}if(d.length>=a){g(le(I?.id,-32e3,"server busy"));return}d.push(I),S()}),p.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ei=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"}}),Ep=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 Ye(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function ye(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 Xt(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 ye(o)}return`${r} raw`}return ye(e)}var Ap=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 Ip(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Ap[String(e||"").toUpperCase()]}function Ai(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((l,d)=>l+(Number(d.amountUSD)||0),0)||null,p=(c.feeCosts||[]).reduce((l,d)=>l+(Number(d.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:p,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let s=[],i=(c,u,p={})=>{u==null||u===""||s.push({label:c,value:String(u),...p})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Ip(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);i("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&i("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let p=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,l=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,d=Xt(p,u);i(d!=null?"NET OUT":"EST OUT (GROSS)",d??Xt(l,u),{hero:!0}),i("GROSS OUT",p!==void 0&&l!==void 0&&String(p)!==String(l)?Xt(l,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?i("GAS",`$${ye(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?i("GAS+FEES",`$${ye(c.feeUsd)}`):i("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(i("MIN RECEIVED",Xt(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)i("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&l!==void 0){let b=Number(l),S=Number(m);Number.isFinite(b)&&Number.isFinite(S)&&b>0&&S>0&&S<=b&&i("SLIPPAGE",`${((1-S/b)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&i("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&i("LIQUIDITY",`$${ye(c.liquidityUsd)}`),o.rankedOn&&i("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let g=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(b=>b!==a).slice(0,3):[];for(let b of g){let S=b?.provider||b?.venue||b?.source,C=Xt(b?.netOut??b?.amountOut??b?.toAmount,u);S&&C&&i(`vs ${S}`,C,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;i("KNOWN USD",u!=null?`$${ye(u)}`:null,{hero:!0});let p=Array.isArray(o.chains)?o.chains:null;if(i("CHAINS",p?p.length:o.chainCount),i("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),i("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),p){let f=p.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)i(String(m.name||m.family||m.chainId),`$${ye(m.knownUsd)}`,{dim:!0})}let l=o.avgEntryUsd??o.avgCostUsd;if(l!==void 0)i("AVG ENTRY",`$${ye(l)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((y,g)=>y+g,0)/f.length;i("AVG ENTRY",`$${ye(m)} \xB7 ${f.length} coins`)}}let d=o.coverage;d&&typeof d=="object"?(Number(d.unavailable)||0)+(Number(d.notConfigured)||0)>0&&i("COVERAGE",`${d.ok??0}/${d.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&i("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){i("COLLECTION",o.collection||o.slug||o.name),i("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),i("PNL",o.pnlUsd!==void 0?`$${ye(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)i("AVG BUY",ye(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(p=>Number(p?.priceEth??p?.price??p?.costEth)).filter(p=>Number.isFinite(p)&&p>0);u.length>0&&i("AVG BUY",`${ye(u.reduce((p,l)=>p+l,0)/u.length)} \xB7 ${u.length} buys`)}i("OWNERS",ye(o.owners??o.numOwners))}return s}function _p(e,t,r){let n=Ei[e]||Ei.generic,o=Ai(e,r),s=o.find(u=>u.hero),i=o.filter(u=>!u.hero),a=Ye(JSON.stringify(r,null,2)).slice(0,2e4),c=i.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${Ye(u.label)}</span><b>${Ye(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
|
|
6
|
+
- `)}`);let o=e.capabilities||{},i=dr.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:dr.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of dr)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function co(e){let t=Pd(e);return pr.set(t.chainId,t),t}function Ds(e){return pr.get(Number(e))||null}function Ld(){return[...pr.values()]}function $b(){pr.clear()}function Bb(){let e={};for(let t of pr.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:pr.size,capabilities:[...dr],chains:e}}var dr,B,$,Lb,pr,wt=S(()=>{dr=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),B=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),$=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Lb=/^0x[0-9a-fA-F]{40}$/;pr=new Map});function $d(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:l=!1,meta:d={}}=e||{};if(u||r==null)return{source:t,quality:Be.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Xr(r);if(p==null||p<=0n)return{source:t,quality:Be.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Be.NO_GAS:Be.FULL,amountOut:p.toString(),minOut:Xr(n)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:l,meta:d}}async function qd(e,t,{divisor:r=1000n}={}){let n=Xr(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=Xr(i),c=Xr(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),l=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(l)||u<=0?null:{impactPct:(1-l/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function Fd(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:n,impactUnmeasured:o,warnings:s}}function Us(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(E=>E.quality!==Be.FAILED),c=e.filter(E=>E.quality===Be.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,l=Number(i),d=Number(s),p=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,f=a.map(E=>{let A=BigInt(E.amountOut),v=0n,R=!1,I=!1,P=BigInt(E.oracleFeeBps??0),D=P>0n?A*P/10000n:0n;if(u){let q=E.gasUsd,j=Number(E.meta?.gasUnits??E.estimatedGas);if(q==null&&p&&Number.isFinite(j)&&j>0){let K=j*l/1e18*d;Number.isFinite(K)&&K>=0&&(q=K,I=!0)}let se=(q??0)+(E.feeUsd??0);if(se>0){let K=se/t*10**r;Number.isFinite(K)&&K>=0&&(v=BigInt(Math.floor(K)),R=!0)}else q===0&&(R=!0)}let V=v+D,Y=A>V?A-V:0n;return{...E,grossOut:A.toString(),netOut:Y.toString(),costInDest:v.toString(),oracleFeeInDest:D.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,w=f.reduce((E,A)=>BigInt(A.netOut)>E?BigInt(A.netOut):E,0n),g=E=>w>0n?Number((w-BigInt(E))*10000n/w):0,y=[],b=f.slice().sort((E,A)=>BigInt(A.netOut)>BigInt(E.netOut)?1:-1)[0]??null;f.sort((E,A)=>{let v=g(E.netOut)<=m?0:1,R=g(A.netOut)<=m?0:1;if(n&&m>0&&v!==R)return v-R;if(n&&m>0){let I=E.liquidityUsd??-1,P=A.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(A.netOut)>BigInt(E.netOut)?1:-1}),n&&m>0&&b&&f[0]&&f[0].source!==b.source&&y.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${b.source} within ${m} bps`);let T=f.filter(E=>!E.costAccounted).map(E=>E.source);u?T.length&&y.push(`gas not reported by: ${T.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):y.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let E=f.find(A=>A.costAccounted&&g(A.netOut)<=m);E&&y.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${E.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let _=f.filter(E=>E.gasEstimated).map(E=>E.source);_.length&&y.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${_.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let k=null,h=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let E=BigInt(f[0].netOut),A=BigInt(f[1].netOut);A>0n&&(k=Number((E-A)*10000n/A),h=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:k,spreadBasis:h,rankedOn:u?"net-of-cost":"gross",warnings:y}}async function uo(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?$d({source:s,error:String(o.reason?.message||o.reason)}):$d({source:s,...o.value})})}var Be,Bd,Xr,Ms=S(()=>{wt();Be=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Bd={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Xr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Dd(e={}){return Gn({provider:"oneinch",defaultUrl:qb,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Fb(e={}){return Dd(e).baseUrl}function Ud(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Db(e={}){let t=Ud(e);return Jn({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Dd(e).trusted)}async function Md(e={},t={}){if(!Ud(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await N(`${Fb(t)}/${r}/quote?${s}`,{headers:Db(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ce(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var qb,jd=S(()=>{W();ke();Ts();ge();qb="https://api.1inch.dev/swap/v6.0"});var Vd={};M(Vd,{UNI_V4_CHAINS:()=>qe,UNI_V4_FEE_TIERS:()=>zs,computeV4PoolId:()=>fo,decodeV4HookPermissions:()=>Ws,uniV4Chains:()=>Qb,uniV4Health:()=>Zb,uniV4InspectHook:()=>Kb,uniV4PrepareExactIn:()=>Xb,uniV4QuoteExactIn:()=>mo,uniV4QuoteExactOut:()=>Yb});import{AbiCoder as Ub,Interface as js,getAddress as Qe,isAddress as Hs,keccak256 as Mb}from"ethers";function Ws(e){let t=tn(e),r=Number(BigInt(t)&Hb),n=Object.fromEntries(Hd.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Hd.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function en(e){let t=Number(e),r=qe[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(qe).join(", ")})`);return{chainId:t,...r}}function tn(e){if(e==null||e==="")return ye;let t=String(e);if(!Hs(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Qe(t)}function fr(e,t){let r=qe[Number(t)];if(Zr(e))return Qe(r.weth);let n=String(e);if(/^weth$/i.test(n))return Qe(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Qe(r.usdc);if(!Hs(n))throw new Error(`invalid token address: ${e}`);return Qe(n)}function Zr(e){let t=String(e||"").trim().toLowerCase();return!t||t===Gb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function fo({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Qe(e),s=Qe(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=tn(o);return Mb(Qr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function Gs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Qe(e),s=Qe(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:tn(o)},zeroForOne:u}}function Jb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=Ws(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==ye&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),n&&e===ye&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==ye&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==ye&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==ye,returnsDelta:i,reasons:Object.freeze(a)})}async function Kb(e={},t={}){let r=en(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=fr(e.tokenIn||"WETH",r.chainId),o=fr(e.tokenOut||r.usdc,r.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=tn(e.hooks),{poolKey:c}=Gs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=fo(c),l=t.rpcCall||X,d=lo.encodeFunctionData("getSlot0",[u]),p=lo.encodeFunctionData("getLiquidity",[u]),[f,m,w]=await Promise.all([l(r.chainId,"eth_call",[{to:r.stateView,data:d},"latest"],t),l(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===ye?Promise.resolve(null):l(r.chainId,"eth_getCode",[a,"latest"],t)]),g=lo.decodeFunctionResult("getSlot0",f),y=lo.decodeFunctionResult("getLiquidity",m)[0],b=g[0],T=b>0n,x=a===ye?null:typeof w=="string"&&w!=="0x"&&w.length>4,_=!!(i&Vs),k=Jb({hook:a,codePresent:x,initialized:T,dynamicFee:_});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:T,sqrtPriceX96:b.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:y.toString(),dynamicFee:_}),hook:Object.freeze({address:a,codePresent:x,codeBytes:x?(w.length-2)/2:0,permissions:Ws(a)}),risk:k})}async function mo(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=fr(e.tokenIn||"WETH",r),a=fr(e.tokenOut||qe[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...zs],l=e.hooks||ye,d=[],p=null;for(let h of u){let{poolKey:E,zeroForOne:A}=Gs({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:l}),v=po.encodeFunctionData("quoteExactInputSingle",[{poolKey:E,zeroForOne:A,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||X)(r,"eth_call",[{to:n,data:v},"latest"],t);if(!R||R==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let I=po.decodeFunctionResult("quoteExactInputSingle",R),P={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:E,zeroForOne:A,poolId:fo({...E})};d.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(R){d.push({...h,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let h=d.map(E=>`${E.fee}/${E.tickSpacing}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${h}`)}let f=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:zd},t).catch(()=>[]):[],m=new Map;for(let h of f){let E=String(h.pairAddress||"").toLowerCase();E&&m.set(E,h)}let w=h=>m.get(String(h.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),y=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let h=BigInt(p.amountOut),A=d.filter(v=>v.ok&&Number((h-BigInt(v.amountOut))*10000n/h)<=g).filter(v=>w(v)?.liquidityUsd!=null).sort((v,R)=>w(R).liquidityUsd-w(v).liquidityUsd)[0];A&&A.poolId!==p.poolId&&(y={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:w(A).liquidityUsd,bandBps:g},p=A)}let b=w(p),T=f[0]??null,x=b??T,_=e.liquidityUsd??b?.liquidityUsd??T?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":T?"pair":null;return ce({venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:_,liquiditySource:x,liquidityAttribution:k,liquidityPick:y,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Hs(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!Zr(e.tokenIn)&&!Zr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&Vs)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:_,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=fr(e.tokenIn||"WETH",r),a=fr(e.tokenOut||qe[r].usdc,r),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...zs],l=e.hooks||ye,d=[],p=null;for(let m of u){let{poolKey:w,zeroForOne:g}=Gs({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:l}),y=po.encodeFunctionData("quoteExactOutputSingle",[{poolKey:w,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let b=await(t.rpcCall||X)(r,"eth_call",[{to:n,data:y},"latest"],t);if(!b||b==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let T=po.decodeFunctionResult("quoteExactOutputSingle",b),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:T[0].toString(),gasEstimate:T[1].toString(),poolKey:w,zeroForOne:g,poolId:fo({...w})};d.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(b){d.push({...m,ok:!1,error:String(b.message||b).slice(0,160)})}}if(!p){let m=d.map(w=>`${w.fee}/${w.tickSpacing}:${w.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await hd({chainId:r,tokenA:s,tokenB:a,dexIds:zd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Xb(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=en(n);if(tn(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Vs)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let s=Qe(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Zr(e.tokenIn)||Zr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await mo(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let l=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,d={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Qr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,u.zeroForOne,BigInt(u.amountIn),l,0n,"0x"]]),m=Qr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),w=Qr.encode(["address","uint256"],[u.tokenOut,l]),g=Qr.encode(["bytes","bytes[]"],[Vb,[f,m,w]]),b=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,T=jb.encodeFunctionData("execute",[zb,[g],b]);return Z({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:b,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:Wb,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:T,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Qb(){return Object.entries(qe).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Zb(e={}){let t=en(e.chainId??8453),r=await X(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Qr,ye,qe,zs,po,jb,lo,Hd,Hb,Vs,zb,Vb,Wb,Gb,zd,Js=S(()=>{at();Gr();ke();ge();Qr=Ub.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",qe={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},zs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],po=new js(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),jb=new js(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),lo=new js(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Hd=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Hb=(1n<<14n)-1n,Vs=8388608;zb="0x10",Vb="0x060c0f",Wb="0x000000000022D473030F116dDEE9F6B43aC78BA3",Gb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";zd=["uniswap-v4","uniswapv4"]});function rx(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||ex).replace(/\/$/,"")}function nx(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||tx).replace(/\/$/,"")}async function ho(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${rx(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wd(e={}){return N(`${nx(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var ex,tx,Ks=S(()=>{W();ex="https://coins.llama.fi",tx="https://api.llama.fi"});var go={};M(go,{ACROSS_API:()=>Gd,HOP_API:()=>Jd,RELAY_API:()=>Kd,acrossHealth:()=>ix,acrossSuggestedFees:()=>Yd,hopHealth:()=>sx,hopQuote:()=>Xd,relayHealth:()=>ax,relayPrepare:()=>cx,relayQuote:()=>Ys});async function ix(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Yd({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Yd(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Gd).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sx(e={}){try{let t=await Xd({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Xd(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Jd).replace(/\/$/,""),l=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ce(l,{chainId:Number(e.originChainId||e.chainId||ox[o]||0),venue:l?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...l,autoSlippagePolicy:a}}async function ax(e={}){try{let t=await Ys({user:ht,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ys(e={},t={}){let{user:r=ht,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=st({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let l=(t.baseUrl||process.env.RELAY_API_URL||Kd).replace(/\/$/,""),d=await N(`${l}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:u}:ce(d,{chainId:Number(n),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function cx(e={},t={}){let r=await Ys(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:n,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:ve(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return Z({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Gd,Jd,Kd,ox,wo=S(()=>{W();ke();Hn();ge();Gd="https://across.to/api",Jd="https://api.hop.exchange/v1",Kd="https://api.relay.link",ox={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function yo(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Ze(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Zd(e,t={}){let r=Bd[Number(e)];if(!r)return null;try{let n=await ho([r],t);return Ze(n?.coins?.[r]?.price)}catch{return null}}async function ux(e={}){try{let t=await Wd({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function lx(e,t={}){let r=yt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Qd[r]||[r]),n.push(...Qd[yt(e)]||[e]),n}function dx(e,t,r={}){let n=Array.isArray(e)?e:[],o=lx(t,r).map(yt).filter(Boolean);for(let i of o){let s=n.find(c=>yt(c?.slug)===i||yt(c?.name)===i),a=Ze(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=yt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:yt(c?.slug).includes(i)||yt(c?.name).includes(i)}),a=Ze(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Xs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:l={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await Lt({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},l),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:yo(f?.gasCosts),feeUsd:yo(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await cr({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:Ze(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await ur({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,w=await Promise.resolve(c);return m!=null&&w&&(f=Number(m)/1e18*w),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Md({chainId:e,src:t,dst:r,amount:n},l),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await $t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},l),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),be[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await Bt({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),qe[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await mo({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function ep({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=ux(s),dx(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await Lt({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,p={tool:l?.tool??l?.toolDetails?.name,durationSeconds:Ze(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:yo(d?.gasCosts),feeUsd:yo(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(wo(),go)),p=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:Ze(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Ze(p?.totalImpact?.usd)!=null?Math.abs(Ze(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(wo(),go)),d=await l({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,f=null;if(p!=null)try{let w=BigInt(String(o))-BigInt(String(p));w>0n&&(f=w.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Ze(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Ze,yt,Qd,tp=S(()=>{Hr();Wn();Yn();jd();Zn();ao();Js();Ks();Ms();Ze=e=>{let t=Number(e);return Number.isFinite(t)?t:null};yt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Qd=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var np={};M(np,{QUALITY:()=>Be,bestBridgeRoute:()=>rn,bestSwapRoute:()=>mr,formatComparisonNote:()=>bo});async function rp(e,t,r){let n=px[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await ho([o],r))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function mr(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Zd(r,t),a=rp(r,o,t),c=ud(r,t).catch(()=>null),u=Xs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([uo(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(g=>g,()=>null),m=Us(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),w=t.maxImpactPct===void 0?25:t.maxImpactPct;if(w!=null&&m.best){let g=m.best.source,b=await qd(async T=>{let x=Xs({...e,amountIn:T.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(k=>k.source===g);return x.length?(await uo(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(b){let T=Fd(m,{[g]:b},{maxImpactPct:w});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...T,sourcesTried:u.length,sourcesAnswered:l.filter(x=>x.quality!==Be.FAILED).length,note:bo(T,u.length),priceImpact:{[g]:Number(b.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(g=>g.quality!==Be.FAILED).length,note:bo(m,u.length)}}async function rn(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=rp(n,i,t),c=ep({...e,opts:t}),[u,l]=await Promise.all([uo(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Us(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.seconds!=null);return{kind:"bridge",fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==Be.FAILED).length,note:bo(d,c.length)}}function fx(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Ll(t)}`:""}function bo(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=fx(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var px,hr=S(()=>{Ms();tp();Vn();Ks();at();px={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var op={};M(op,{ARTIFACT:()=>ct,prepareBestRoute:()=>bx,supportedPreparers:()=>hx});function hx(){return Object.keys(xo)}async function bx(e,t={}){if(yx.some(g=>Object.hasOwn(e,g)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:r}=e;if(!r)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!wx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(gx.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let n=await mr(e,t);if(!n.best){let g=n.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=xo[o];if(!s){let g=n.routes.find(y=>xo[y.source]&&y.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await s(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),T=/allowance/i.test(b),x=!T&&/not enough|insufficient|balance/i.test(b),_,k;T?(k="approval-required-first",_=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${b}`):x?(k="taker-not-funded",_=`${o} refused to build the transaction: ${b}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(k="provider-error",_=`${o} prepare failed: ${b}`);let h=n.routes.find(E=>xo[E.source]&&E.source!==o);return{ok:!1,reason:_,failureKind:k,...h?{alternative:h.source}:{},comparison:n}}let c=e.driftToleranceBps??mx,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),y=BigInt(a.amountOut);g>0n&&(u=Number((y-g)*10000n/g),u<-c&&(l=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=n.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),f=n.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,y)=>Math.max(g,y.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,w=m!=null&&f>0?Math.round(m/f*100):null;return Z({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:w},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===ct.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===ct.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var ct,mx,xo,gx,wx,yx,ip=S(()=>{hr();ge();ct=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),mx=100,xo={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(ao(),kd)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Js(),Vd)),p=await d({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:ct.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Hr(),Is)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Wn(),Ml)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:ct.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(Yn(),Kl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:ct.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(Zn(),sd)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:ct.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};gx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),wx=/^0x[0-9a-fA-F]{40}$/,yx=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var sp={};M(sp,{prepareBestBridgeRoute:()=>vx,supportedBridgePreparers:()=>Ax});function Ax(){return Object.keys(So)}async function vx(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!xx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Sx.has(r.toLowerCase()))throw new Error(`taker "${r}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await rn(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(g=>g.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=So[s];if(!c){let g=i.routes.find(y=>So[y.source]&&y.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...g?{alternative:g.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),T=/allowance/i.test(b),x=!T&&/not enough|insufficient|balance/i.test(b),_=i.routes.find(k=>So[k.source]&&k.source!==s);return{ok:!1,reason:T?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${b}`:x?`${s} refused to build: ${b}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${b}`,failureKind:T?"approval-required-first":x?"taker-not-funded":"provider-error",..._?{alternative:_.source}:{},comparison:i}}let l=u.transactions||[];if(!l.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let d=l.filter(g=>g.chainId!=null&&Number(g.chainId)!==Number(n));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??Ex,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let g=BigInt(a.grossOut),y=BigInt(u.amountOut);g>0n&&(f=Number((y-g)*10000n/g),f<-p&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(p/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let w=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&w.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),Z({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:l.length,transactions:l,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:l[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:w,runnersUp:i.routes.filter(g=>g.source!==s).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var xx,Sx,Ex,So,ap=S(()=>{hr();ge();xx=/^0x[0-9a-fA-F]{40}$/,Sx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Ex=100,So={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(wo(),go)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Hr(),Is)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var lp={};M(lp,{buildTwapSchedule:()=>up,normalizeTwapParams:()=>cp,prepareTwapChunk:()=>Cx,simulateTwap:()=>Nx});function cp(e={}){let t=Math.max(kx,Math.min(Ix,Number(e.splits)||Tx)),r=Math.max(.1,Number(e.windowHours)||Ox),n=Math.max(_x,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function up(e){let t=cp(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function Cx(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await mr({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=Z(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function Nx(e,{quoteFn:t=mr}={}){let r=up(e),n=[],o=0n,i="unknown";for(let a=0;a<r.params.splits;a++)try{let c=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker}),u=BigInt(c.amountOut??c.quote?.amountOut??"0");o+=u,i=c.source??c.venue??i,n.push({splitIndex:a+1,amountOut:String(u),source:c.source??c.venue})}catch(c){n.push({splitIndex:a+1,error:String(c.message||c).slice(0,200)})}let s=o>0n?(Number(o)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(o),averagePrice:s,bestSource:i,chunks:n,simulatedAt:new Date().toISOString()}}var kx,Ix,_x,Tx,Ox,dp=S(()=>{hr();ge();kx=2,Ix=100,_x=60,Tx=10,Ox=6});async function mp({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!pp.has(Number(e))||!pp.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let a={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},c=await N(`${fp}/dln/order/quote`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return c.error?{error:String(c.error)}:{estimation:c.estimation??{},order:c.order??{},fixFee:c.fixFee??"0"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}async function hp(){try{return{ok:!0,chainCount:(await N(`${fp}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var fp,pp,gp=S(()=>{W();ge();fp="https://dln.debridge.finance/v1.0",pp=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function yp({active:e=!0}={}){let t=Date.now();if(gr.size&&t-wp<Rx)return[...gr.values()];try{let r=await N(`${Qs}/exchange/currencies?active=${e?"true":"false"}`);gr.clear();for(let n of r??[])gr.set(String(n.ticker).toLowerCase(),n);return wp=t,r??[]}catch(r){return gr.size?[...gr.values()]:{error:String(r.message||r).slice(0,200)}}}async function Px(e,t){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${Qs}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Lx(e,t,r,{flow:n="standard"}={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let o=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),i=await N(`${Qs}/exchange/estimated-amount?${o}`);return{fromAmount:i?.fromAmount,toAmount:i?.toAmount,rate:i?.rate,flow:i?.flow??n}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function bp({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let o=await Px(e,t);if(o.error)return o;let i=r??o.minAmount,s=await Lx(e,t,i,{flow:n});if(s.error)return s;let a=await yp(),c=a.find(l=>String(l?.ticker).toLowerCase()===String(e).toLowerCase()),u=a.find(l=>String(l?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:i,toAmount:s.toAmount,estimatedRate:s.rate,minAmount:o.minAmount,flow:s.flow,networkFee:c?.networkFee??null,kycRequired:c?.kycRequired??u?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function xp(){try{let e=await yp();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Qs,gr,wp,Rx,Sp=S(()=>{W();Qs="https://api.changenow.io/v2",gr=new Map,wp=0,Rx=6e5});async function Ep({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let a={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},c=await N(`${$x}/route`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return{route:c?.route??{},toAmount:c?.route?.estimate?.toAmount,fee:c?.route?.estimate?.feeCosts}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var $x,Ap=S(()=>{W();$x="https://api.squidrouter.com/v1"});async function vp({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let s=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),a=await N(`${Bx}/quote?${s}`);return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Bx,kp=S(()=>{W();Bx="https://api.stargate.finance"});async function Ip({fromAsset:e,toAsset:t,amount:r,destination:n}={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let o=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),i=await N(`${qx}/quote/swap?${o}`);return{expectedAmountOut:i?.expected_amount_out,fees:i?.fees,slippageBps:i?.slippage_bps,inboundAddress:i?.inbound_address,memo:i?.memo,estimatedTime:i?.total_swap_seconds?`${Math.round(i.total_swap_seconds/60)} min`:"unknown"}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var qx,_p=S(()=>{W();qx="https://midgard.ninerealms.com/v2"});async function Tp({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={}){if(!e||!t||!r||!n||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let s=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),a=await N(`${Fx}/quote?${s}`);return{amountOut:a?.result?.toAmount,feeUsd:a?.result?.totalGasFeesInUsd,route:a?.result?.route,estimatedTime:a?.result?.serviceTime?`${a.result.serviceTime}s`:"unknown"}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Fx,Op=S(()=>{W();Fx="https://api.socket.tech/v2"});async function Cp({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let i={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},s=await N(`${Dx}/estimate`,{method:"POST",body:JSON.stringify(i),headers:{"content-type":"application/json"}});return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTransferTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Dx,Np=S(()=>{W();Dx="https://api.connext.network"});async function Rp({fromChain:e,toChain:t,token:r,amount:n}={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let o=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),i=await N(`${Ux}/quote?${o}`);return{amountOut:i?.amountOut,fee:i?.fee,estimatedTime:i?.estimatedTime}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var Ux,Pp=S(()=>{W();Ux="https://api.portalbridge.com/v1"});function Mx(e,t){return`0x${ea.getAmountsOut}`+Oe(e)+Oe(64)+Oe(t.length)+t.map(nn).join("")}function jx(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Zs(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Hx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>ta)throw new Error(`slippageBps ${r} exceeds the ${ta} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function Lp(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await X(t,"eth_call",[{to:o,data:Mx(i,s)},"latest"],a);return jx(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Zs(c.scanner);if(!u)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let l=a||[o,i];if(l.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await n(u,s,l,c);return d?{chainId:t,router:u,path:l,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:l.length-1,evidence:B.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:B.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Zs(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let l=await n(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=l[l.length-1];if(d===0n)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,d,[o,u],a);if(!p)return{chainId:t,token:o,verdict:$.FAIL,evidence:B.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p[p.length-1],m=Number(f*10000n/BigInt(i)),w=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(w=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(w=$.CAUTION,g=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:w,reason:g,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:l},d={}){let p=d.scanner,f=Zs(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=l||[o,i],w=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(w.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${w.evidence}: ${w.reason??"no reason given"})`);let g=Hx(w.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=BigInt(Math.floor(Date.now()/1e3)+Number(u)),b=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,T=b?`0x${ea.swapExactETHForTokens}`+Oe(g)+Oe(128)+nn(a)+Oe(y)+Oe(m.length)+m.map(nn).join(""):`0x${ea.swapExactTokensForTokens}`+Oe(s)+Oe(g)+Oe(160)+nn(a)+Oe(y)+Oe(m.length)+m.map(nn).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:T,value:b?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:w.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:ta,deadline:y.toString()},requires:b?[]:[{step:"approve",token:m[0],spender:f,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var ea,Oe,nn,ta,$p=S(()=>{at();wt();ea={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Oe=e=>BigInt(e).toString(16).padStart(64,"0"),nn=e=>e.slice(2).toLowerCase().padStart(64,"0");ta=100});function Vx(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>na)throw new Error(`slippageBps ${r} exceeds the ${na} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(r))/10000n}function ra(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Fp(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Bp.quoteExactInputSingle}`+on(s)+on(a)+qt(c)+qt(u)+qt(0),p=await X(t,"eth_call",[{to:i,data:d},"latest"],l).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let l=[],d=null;for(let p of zx){let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);l.push({fee:p,amountOut:f?f.toString():null}),f&&(!d||f>d.amountOut)&&(d={fee:p,amountOut:f})}return{best:d,tried:l}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=ra(c.scanner,"quoter");if(!u)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!qp.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:l,tried:d}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return l?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:l.amountOut.toString(),fee:l.fee,useNative:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:d,evidence:B.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:B.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=ra(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(_=>String(_).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||d||(l[0]&&p!==l[0]?l[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:$.UNKNOWN,evidence:B.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let w=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!w.best){let _=l.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(_){let k=await o({quoter:u,tokenIn:_,tokenOut:i,amountIn:s},c);if(k.best){let h=await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c);if(h.best){let E=h.best.amountOut,A=Number(E*10000n/BigInt(s)),v=$.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return A<5e3?(v=$.FAIL,R=`round trip vs dollar book returns only ${(A/100).toFixed(2)}% -- punitive tax or no real liquidity`):A<9e3&&(v=$.CAUTION,R=`round trip vs dollar book returns ${(A/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:v,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:h.best.fee,evidence:B.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:$.FAIL,evidence:B.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:w.best.amountOut},c);if(!g.best){let _=l.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(_){let k=await o({quoter:u,tokenIn:_,tokenOut:i,amountIn:s},c),h=k.best?await o({quoter:u,tokenIn:i,tokenOut:_,amountIn:k.best.amountOut},c):{best:null};if(k.best&&h.best){let E=h.best.amountOut,A=Number(E*10000n/BigInt(s)),v=$.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return A<5e3?(v=$.FAIL,R=`dollar-book round trip returns only ${(A/100).toFixed(2)}%`):A<9e3&&(v=$.CAUTION,R=`dollar-book round trip returns ${(A/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:_,quoteAsset:_,verdict:v,reason:R,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:A,buyFee:k.best.fee,sellFee:h.best.fee,evidence:B.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:$.FAIL,evidence:B.LIVE,leg:"sell",bought:w.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let y=g.best.amountOut,b=Number(y*10000n/BigInt(s)),T=$.PASS,x="round trip completes with expected fee/impact loss";return b<5e3?(T=$.FAIL,x=`round trip returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(T=$.CAUTION,x=`round trip returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:T,reason:x,amountIn:String(s),bought:w.best.amountOut.toString(),returned:y.toString(),retentionBps:b,buyFee:w.best.fee,sellFee:g.best.fee,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:l},d={}){let p=ra(d.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!qp.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(f.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,w=Vx(f.amountOut,u);if(w<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),y=`0x${Bp.exactInputSingle}`+on(i)+on(s)+qt(m)+on(c)+qt(a)+qt(w)+qt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:y,value:g?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:w.toString(),slippageBps:u,maxSlippageBps:na,fee:m},requires:g?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var zx,Bp,qt,on,qp,na,Dp=S(()=>{at();wt();zx=[100,500,3e3,1e4],Bp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},qt=e=>BigInt(e).toString(16).padStart(64,"0"),on=e=>e.slice(2).toLowerCase().padStart(64,"0"),qp=/^0x[0-9a-fA-F]{40}$/,na=100});function Up(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Mp(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function Wx(e){let{chainId:t}=e;async function r(n,o,i){return X(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await ro(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:B.LIVE}},async nativeBalance(n,o={}){let i=await ld(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:B.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await pd({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:B.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:B.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,Eo.decimals,o).catch(()=>null),r(n,Eo.symbol,o).catch(()=>null),r(n,Eo.name,o).catch(()=>null),r(n,Eo.totalSupply,o).catch(()=>null)]),u=Up(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Mp(s?.result??s),name:Mp(a?.result??a),totalSupply:(Up(c?.result??c)??null)?.toString()??null,evidence:l?B.LIVE:B.UNKNOWN,warning:l?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:B.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await oo(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,d)=>(d.liquidityUsd??0)-(l.liquidityUsd??0)),u=no(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:md(n,u),evidence:u.length?B.LIVE:B.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],l=[];for(let d=n;d<=o;d+=a){let p=Math.min(d+a-1,o);l.push([d,p])}for(let[d,p]of l){let f={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let m=await X(t,"eth_getLogs",[f],c).catch(w=>({error:String(w?.message||w)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[d,p],error:m.error,evidence:B.UNKNOWN};for(let w of m?.result??m??[])u.push(w)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:B.LIVE}},async scoreRisk(n,o={}){let i=[],s=$.PASS,a=l=>{let d={[$.PASS]:0,[$.CAUTION]:1,[$.UNKNOWN]:2,[$.FAIL]:3};d[l]>d[s]&&(s=l)},c=await this.resolveToken(n,o);c.evidence!==B.LIVE?(i.push({check:"erc20-metadata",result:$.UNKNOWN,detail:c.warning}),a($.UNKNOWN)):i.push({check:"erc20-metadata",result:$.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===B.UNAVAILABLE)i.push({check:"liquidity",result:$.UNKNOWN,detail:u.reason}),a($.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:$.FAIL,detail:"no pool with liquidity found"}),a($.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:$.CAUTION,detail:`top pool only $${d}`}),a($.CAUTION)):i.push({check:"liquidity",result:$.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:$.CAUTION,detail:"pool under 24h old"}),a($.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:$.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:l.verdict,detail:l.retentionBps!=null?`round trip returns ${(l.retentionBps/100).toFixed(2)}% -- ${l.reason}`:l.reason}),a(l.verdict)}else i.push({check:"sellability",result:$.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a($.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function oa(e){let r={...Wx(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Fp({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,Lp({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var Eo,jp=S(()=>{at();Gr();wt();$p();Dp();Bs();Eo={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Ao(){return sn.map(e=>co(oa(e)))}function Hp(e){return co(oa(e))}var sn,vo=S(()=>{jp();wt();sn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Kp,getAddress as Gx,id as Yp}from"ethers";function wr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function aa(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function ko(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function lS(e,t){try{return Gx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function dS(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Jp(e){return`0x${String(e).slice(-40).toLowerCase()}`}function pS({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>oS)return"stale"}return"scoped"}function fS(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function mS(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(wr(r)){let a=aa(Wp,o,iS);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=zp.encodeFunctionData(d,[]),f=await X(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:zp.decodeFunctionResult(d,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),l={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return wr(r)&&ko(Wp,o,l,cS),l})();return n?.set(o,s),s}async function hS(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Kx,1),Yx),o=await ro(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await X(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[Jx,dS(t)]}],r);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),l=c?.topics?.[2];!u||!l||a.set(`${u}:${Jp(l)}`,{token:u,spender:Jp(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function gS(e){return(tS[e]||[]).flatMap(r=>Qx.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function wS(e,t,r={}){let n=[],o="direct-probe",i=null,s=gS(e),a=sa(e),c=wr(r)&&aa(ia,e,sS)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let u=await hS(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},wr(r)&&ko(ia,e,!0,64)}catch{if(wr(r)&&ko(ia,e,!1,64),n=s,n.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,d=(await Tn(n,r.concurrency||4,async f=>{try{let m=await dd({chainId:e,token:f.token,owner:t,spender:f.spender},r),w=BigInt(m.allowance);if(w<=0n)return null;let g=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await mS(e,f.token,r,u),y=w>=nS,b=Xx[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:g.symbol,decimals:g.decimals,spender:f.spender,spenderLabel:b,allowance:w.toString(),allowanceDisplay:fS(w,g.decimals,y),unlimited:y,lastActivityAt:null,risk:pS({unlimited:y,spenderLabel:b,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await bS(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:sa(e).length,...i||{}},approvals:[...d,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function yS(e,t,r,n,o){try{let i=Vp.encodeFunctionData("isApprovedForAll",[r,n]),s=await X(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Vp.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function sa(e){return(eS[e]||[]).flatMap(r=>Zx.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function bS(e,t,r){let n=sa(e);return n.length===0?[]:(await Tn(n,r.concurrency||4,async i=>await yS(e,i.collection,t,i.operator,r)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Xp(e={},t={}){let r=lS(e.owner||e.address,"owner"),n=new Map(sn.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=wr(t)&&!e.refresh;if(s){let f=aa(Gp,i,aS);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await Tn(o,e.concurrency||3,f=>wS(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),l=u.find(f=>f.method==="log-scan"&&f.toBlock),d=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:l?`last ${l.toBlock-l.fromBlock} blocks`:d?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&ko(Gp,i,p,uS),{...p,cached:!1,cachedAgeMs:0}}var zp,Vp,Jx,dC,Kx,Yx,Xx,Qx,Zx,eS,tS,rS,nS,oS,iS,sS,aS,cS,uS,Wp,ia,Gp,Qp=S(()=>{vo();W();at();zp=new Kp(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Vp=new Kp(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Jx=Yp("Approval(address,address,uint256)"),dC=Yp("ApprovalForAll(address,address,bool)"),Kx=1e4,Yx=2e5,Xx=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),Qx=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),Zx=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),eS=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),tS=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),rS=(1n<<256n)-1n,nS=rS/2n,oS=4320*60*60*1e3,iS=360*60*1e3,sS=600*1e3,aS=45*1e3,cS=512,uS=128,Wp=new Map,ia=new Map,Gp=new Map});var tf={};M(tf,{aggregateBridgeQuotes:()=>Zp,bridgeAggregatorHealth:()=>SS,checkRevokeNeeded:()=>ef,scanBridgeRoutes:()=>xS});async function Zp(e={}){let{fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amount:i,taker:s,fromSymbol:a="?",toSymbol:c="?",fromDecimals:u=18,toDecimals:l=18}=e,d=[],p=[],f=mp({srcChainId:t,srcChainTokenIn:n,srcChainTokenInAmount:i,dstChainId:r,dstChainTokenOut:o}).then(h=>h.error?(p.push(`debridge: ${h.error}`),null):{provider:"debridge",amountOut:h.estimation?.dstChainTokenOut?.amount??h.estimation?.toAmount,feeUsd:h.estimation?.fixFee??h.fixFee,estimatedTime:h.estimation?.execution?.estimatedTransferTime?`${h.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:h}).catch(h=>(p.push(`debridge: ${h.message}`),null)),m=rn({fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}).then(h=>!h||h.error?(p.push(`lifi: ${h?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:h.amountOut??h.quote?.amountOut,feeUsd:h.feeUsd??h.totalFee,estimatedTime:h.estimatedTime??h.duration??"unknown",preparable:!!h.transaction,raw:h}).catch(h=>(p.push(`lifi: ${h.message}`),null)),w=Ep({fromChain:t,toChain:r,fromToken:n,toToken:o,fromAmount:i,fromAddress:s}).then(h=>h.error?(p.push(`squid: ${h.error}`),null):{provider:"squid",amountOut:h.toAmount,feeUsd:Array.isArray(h.fee)?h.fee.reduce((E,A)=>E+(Number(A.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:h}).catch(h=>(p.push(`squid: ${h.message}`),null)),g=vp({srcChainId:t,dstChainId:r,token:n,amount:i}).then(h=>h.error?(p.push(`stargate: ${h.error}`),null):{provider:"stargate",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"1-5 min",preparable:!1,raw:h}).catch(h=>(p.push(`stargate: ${h.message}`),null)),y=Ip({fromAsset:a,toAsset:c,amount:i,destination:s}).then(h=>h.error?(p.push(`thorchain: ${h.error}`),null):{provider:"thorchain",amountOut:h.expectedAmountOut,feeUsd:h.fees?.total,estimatedTime:h.estimatedTime||"10-30 min",preparable:!1,raw:h}).catch(h=>(p.push(`thorchain: ${h.message}`),null)),b=(async()=>{if(!a||!c||a==="?"||c==="?")return p.push("changenow: ticker symbols required, skipping"),null;try{let h=await bp({fromTicker:a,toTicker:c,fromAmount:i});return h.error?(p.push(`changenow: ${h.error}`),null):{provider:"changenow",amountOut:h.toAmount,feeUsd:h.networkFee,estimatedTime:h.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:h.kycRequired,raw:h}}catch(h){return p.push(`changenow: ${h.message}`),null}})(),T=Tp({fromChainId:t,toChainId:r,fromToken:n,toToken:o,fromAmount:i,userAddress:s}).then(h=>h.error?(p.push(`bungee: ${h.error}`),null):{provider:"bungee",amountOut:h.amountOut,feeUsd:h.feeUsd,estimatedTime:h.estimatedTime,preparable:!1,raw:h}).catch(h=>(p.push(`bungee: ${h.message}`),null)),x=Cp({originDomain:t,destinationDomain:r,originToken:n,destinationToken:o,amount:i}).then(h=>h.error?(p.push(`connext: ${h.error}`),null):{provider:"connext",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-20 min",preparable:!1,raw:h}).catch(h=>(p.push(`connext: ${h.message}`),null)),_=Rp({fromChain:t,toChain:r,token:n,amount:i}).then(h=>h.error?(p.push(`wormhole: ${h.error}`),null):{provider:"wormhole",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-15 min",preparable:!1,raw:h}).catch(h=>(p.push(`wormhole: ${h.message}`),null)),k=await Promise.allSettled([f,m,w,g,y,T,x,_,b]);for(let h of k)h.status==="fulfilled"&&h.value&&d.push(h.value);return d.sort((h,E)=>{let A=Number(h.amountOut??0),v=Number(E.amountOut??0);return A!==v?v-A:h.preparable&&!E.preparable?-1:!h.preparable&&E.preparable?1:0}),{providers:d.map(h=>h.provider),bestRoute:d[0]?.provider??"none",winner:d[0]??null,runnersUp:d.slice(1),errors:p.length?p:null}}async function ef({chainId:e,taker:t,tokenIn:r}={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let o=(await Xp({chainIds:[e],address:t})).approvals;if(!o?.length)return{needsRevoke:!1,note:"no active approvals found"};let i=r?o.find(s=>String(s.token).toLowerCase()===String(r).toLowerCase()):null;return i&&BigInt(i.allowance??"0")>0n?{needsRevoke:!0,spender:i.spender,amount:i.allowance,symbol:i.symbol??"?",decimals:i.decimals??18,note:`approval found for ${i.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${o.length} total approvals on chain)`}}catch(n){return{needsRevoke:!1,note:`revoke check unavailable: ${String(n.message||n).slice(0,100)}`}}}async function xS(e={}){let[t,r]=await Promise.all([Zp(e),ef({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn})]),n=t.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:n.provider??"none",amountOut:n.amountOut,feeUsd:n.feeUsd,estimatedTime:n.estimatedTime,preparable:n.preparable?"yes":"no (manual send)",providers:t.providers,runnersUp:t.runnersUp,revokeCheck:r,errors:t.errors,confidence:t.providers.length>=2?.85:t.providers.length===1?.6:.1}}async function SS(){let[e,t]=await Promise.all([hp().catch(r=>({ok:!1,error:r.message})),xp().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var qC,rf=S(()=>{hr();gp();Sp();Ap();kp();_p();Op();Np();Pp();Qp();qC=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var nf={};M(nf,{DYDX_API:()=>Io,dydxHealth:()=>vS,dydxMarkets:()=>ES,dydxOrderbook:()=>AS});async function ES(e=50){try{return((await N(`${Io}/v4/perpetualMarkets?limit=${e}`))?.markets||[]).map(r=>({ticker:r?.ticker,oraclePrice:r?.oraclePrice,indexPrice:r?.indexPrice,nextFundingRate:r?.nextFundingRate?`${(Number(r.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:r?.openInterest,volume24h:r?.volume24H}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function AS(e){try{let t=await N(`${Io}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function vS(){try{return{ok:!0,serverTime:(await N(`${Io}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Io,of=S(()=>{W();Io="https://api.dydx.exchange"});var af={};M(af,{DRIFT_API:()=>sf,driftHealth:()=>IS,driftMarkets:()=>kS});async function kS(){try{return((await N(`${sf}/v2/markets`))?.markets||[]).map(t=>({symbol:t?.symbol||t?.marketIndex,oraclePrice:t?.amm?.oraclePrice,markPrice:t?.amm?.markPrice,fundingRate:t?.amm?.lastFundingRate?`${(Number(t.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:t?.amm?.longFunding,short:t?.amm?.shortFunding},volume24h:t?.amm?.quoteAssetVolume}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function IS(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var sf,cf=S(()=>{W();sf="https://dlob.drift.trade"});var uf={};M(uf,{VERTEX_API:()=>_o,vertexHealth:()=>OS,vertexMarkets:()=>_S,vertexOrderbook:()=>TS});async function _S(){try{return((await N(`${_o}/query`,{method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json"}}))?.data?.all_markets||[]).map(t=>({market:t?.market,type:t?.type,oraclePrice:t?.oracle_price_x18?(Number(BigInt(t.oracle_price_x18))/1e18).toFixed(4):null,minSize:t?.min_size,productId:t?.product_id}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function TS(e){try{let r=(await N(`${_o}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function OS(){try{return{ok:!0,status:(await N(`${_o}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var _o,lf=S(()=>{W();_o="https://gateway.prod.vertexprotocol.com/v2"});var df={};M(df,{pancakeHealth:()=>RS,pancakeQuote:()=>NS});async function NS({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let i={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},s=await N(`${CS}/quote`,{method:"POST",body:JSON.stringify(i),headers:{"content-type":"application/json"}});return{amountOut:s?.amountOut,route:s?.route}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function RS(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var CS,pf=S(()=>{W();CS="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var mf={};M(mf,{sushiHealth:()=>$S,sushiQuote:()=>LS});async function LS({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let i=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,s=await N(`${PS(e)}/quote?query=${encodeURIComponent(i)}`);return{amountOut:s?.data?.quote?.amountOut,route:s?.data?.quote?.route}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function $S(){try{return{ok:!0,chains:Object.keys(ff).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var PS,ff,hf=S(()=>{W();PS=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${ff[e]||"ethereum"}`,ff={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var gf={};M(gf,{raydiumHealth:()=>FS,raydiumQuote:()=>qS});async function qS({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let o=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),i=await N(`${BS}/quote?${o}`),s=(i?.routePlan||[]).filter(a=>a?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:i?.outAmount,priceImpactPct:i?.priceImpactPct,raydiumRoutes:s.length,allRoutes:i?.routePlan?.length||0}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function FS(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var BS,wf=S(()=>{W();BS="https://quote-api.jup.ag/v6"});var yf={};M(yf,{AEVO_API:()=>ca,aevoHealth:()=>US,aevoMarkets:()=>DS});async function DS(){try{return(await N(`${ca}/markets`)||[]).map(t=>({instrument:t?.instrument_name,type:t?.instrument_type,markPrice:t?.mark_price,indexPrice:t?.index_price,fundingRate:t?.funding_rate?`${(Number(t.funding_rate)*100).toFixed(4)}%`:null,openInterest:t?.open_interest,volume24h:t?.volume_24h}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function US(){try{return{ok:(await N(`${ca}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ca,bf=S(()=>{W();ca="https://api.aevo.xyz"});var xf={};M(xf,{compoundHealth:()=>HS,compoundMarkets:()=>jS});async function jS(){try{return((await N(`${MS}/ctoken`))?.cToken||[]).map(t=>({symbol:t?.symbol,underlying:t?.underlying_symbol,supplyApy:t?.supply_rate?.value?`${(Number(t.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:t?.borrow_rate?.value?`${(Number(t.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:t?.total_supply?.value,totalBorrow:t?.total_borrows?.value,collateralFactor:t?.collateral_factor?.value?`${(Number(t.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function HS(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var MS,Sf=S(()=>{W();MS="https://api.compound.finance/api/v2"});var Ef={};M(Ef,{yearnHealth:()=>WS,yearnVaults:()=>VS});async function VS(){try{return(await N(`${zS}/vaults/all`)||[]).map(t=>({name:t?.name,symbol:t?.symbol,apy:t?.apy?.net_apy?`${(Number(t.apy.net_apy)*100).toFixed(2)}%`:null,tvl:t?.tvl?.tvl_deposited,chain:t?.chainId,type:t?.type||"v2"}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function WS(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var zS,Af=S(()=>{W();zS="https://api.yearn.fi/v1"});var vf={};M(vf,{convexHealth:()=>KS,convexPools:()=>JS});async function JS(){try{return(await N(`${GS}/pools`)||[]).map(t=>({name:t?.curvePool?.name||t?.name,curveApy:t?.curvePool?.apy?`${(Number(t.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:t?.apy?`${(Number(t.apy)*100).toFixed(2)}%`:null,tvl:t?.tvl,boosted:t?.boosted||!1}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function KS(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var GS,kf=S(()=>{W();GS="https://api.convexfinance.com/api"});function Ft(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function et(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Ft(t),Object.freeze({mantissa:e,scale:t})}function bt(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Ft(e.scale)}function To(e){return Ft(e),10n**BigInt(e)}function F(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return et(s,o.length)}function xe(e,t){if(Ft(t),typeof e=="bigint")return et(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return et(BigInt(e),t)}function Fe(e){bt(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function an(e,t){return bt(e),Ft(t),t===e.scale?et(e.mantissa,e.scale):t>e.scale?et(e.mantissa*To(t-e.scale),t):et(e.mantissa/To(e.scale-t),t)}function ua(e,t){bt(e,"left"),bt(t,"right");let r=Math.max(e.scale,t.scale);return[an(e,r),an(t,r),r]}function xt(e,t){let[r,n,o]=ua(e,t);return et(r.mantissa+n.mantissa,o)}function cn(e,t){let[r,n,o]=ua(e,t);return et(r.mantissa-n.mantissa,o)}function Ie(e,t){bt(e,"left"),bt(t,"right");let r=e.scale+t.scale;return Ft(r),et(e.mantissa*t.mantissa,r)}function De(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(bt(e,"left"),bt(t,"right"),Ft(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*To(t.scale+r),o=t.mantissa*To(e.scale);return et(n/o,r)}function St(e,t){let[r,n]=ua(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var JC,Ce=S(()=>{JC=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as _f,readFileSync as YS}from"node:fs";import{dirname as If,join as la}from"node:path";import{fileURLToPath as XS}from"node:url";function QS(e){let t=If(XS(e));for(let r=0;r<8;r+=1){let n=la(t,"package.json");if(_f(n))try{let i=JSON.parse(YS(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=If(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Oo(e,t){let r=QS(t),n=la(r,e);return _f(n)?n:la(r,"dist","assets",e)}var da=S(()=>{});import{readFileSync as ZS,existsSync as eE}from"node:fs";import{fileURLToPath as tE}from"node:url";import{dirname as rE,join as Of}from"node:path";function oE(){try{let e=Oo("equities-fixtures",import.meta.url);if(e&&eE(e))return e}catch{}return nE}function sE(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function z(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function ie(e,t,r){sE(e)||z(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&z(t,`${r} must be a nonempty string`)}function tt(e,t,r){Number.isSafeInteger(e)||z(t,`${r} must be a safe integer`)}function Et(e,t,r){ie(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),ie(o,t,`${r}.${n}`)}function aE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),ie(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];ie(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),Et(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))Et(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function cE(e,t){Et(e,t,"root"),Object.keys(e).length===0&&z(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||z(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function uE(e,t){ie(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])tt(e[r],t,r);G(e.usdg,t,"usdg"),Et(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&z(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&z(t,`assets.${r}.usd must be a nonnegative finite source number`)}function lE(e,t){ie(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||z(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&z(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>tt(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&z(t,`dates[${o}] must use YYYY-MM-DD`)})}function dE(e,t){ie(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&z(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{ie(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])tt(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&z(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&z(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function pE(e,t){Et(e,t,"root"),Object.keys(e).length===0&&z(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&z(t,`${r}.liq must be a nonnegative finite source number`)}}function fE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),tt(e.block,t,"block"),tt(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),Et(e.pools,t,"pools"),Object.keys(e.pools).length===0&&z(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&z(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&z(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&z(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function mE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),ie(e.books,t,"books"),Object.keys(e.books).length===0&&z(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){ie(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&z(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())ie(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())ie(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function hE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),Et(e.tokens,t,"tokens"),ie(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&z(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||z(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&z(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())ie(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&z(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&z(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function gE(e,t){ie(e,t,"root"),tt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&z(t,'chain must be "ton"'),Et(e.tokens,t,"tokens"),ie(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&z(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||z(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&z(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())ie(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&z(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&z(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function yE(e,t){let r=Cf[t],n=Of(e,r),o;try{o=ZS(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return wE[t](i,r),i}function Nf(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Nf(t)}return e}function pa({fixtureDir:e=iE}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Cf))t[r]=yE(e,r);return Nf(t)}function ut(){return Tf??=pa(),Tf}function _e(){return ut().venues}function Rf(){return ut().universe}function Pf(){return ut().oracles}function Lf(){return ut().nyseHolidays}function $f(){return ut().dstTransitions}function Co(){return ut().rhPoolState}function Bf(){return ut().solanaXstocks}function qf(){return ut().tonXstocks}function Ff(){return ut().hip3L2Books}var nE,iE,Cf,wE,Tf,Ue=S(()=>{da();nE=Of(rE(tE(import.meta.url)),"fixtures");iE=oE(),Cf=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});wE=Object.freeze({venues:aE,universe:cE,oracles:uE,nyseHolidays:lE,dstTransitions:dE,equityDexPools:pE,rhPoolState:fE,solanaXstocks:hE,tonXstocks:gE,hip3L2Books:mE})});function SE(){let e=$f().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*ma,endMs:n.endUtc*ma}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function Wf(){return Uf??=SE(),Uf}function EE(){return fa===void 0&&(fa=new Set(Lf().holidayDayIndex)),fa}function Gf(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function AE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Wf();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function vE(e){for(let t of Wf().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function kE(e){return vE(e)?xE:bE}function IE(e){let t=e+kE(e),r=Math.floor(t/Df),n=t-r*Df,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Mf),msIntoDay:n,weekday:o.getUTCDay()}}function _E({dayIndex:e,weekday:t}){return t===0||t===6?!1:!EE().has(e)}function TE(e){return e<jf?"dark":e<Hf?"extended":e<zf?"core":e<Vf?"extended":"dark"}function un(e){Gf(e,"sessionState"),AE(e,"sessionState");let t=IE(e);return _E(t)?TE(t.minuteOfDay):"dark"}function ga(e){return Gf(e,"isDark"),un(e)==="dark"}var ma,Mf,ha,Df,bE,xE,jf,Hf,zf,Vf,sN,aN,Uf,fa,No=S(()=>{Ue();ma=1e3,Mf=60*ma,ha=60*Mf,Df=24*ha,bE=-5*ha,xE=-4*ha,jf=240,Hf=570,zf=960,Vf=1200,sN=Object.freeze([jf,Hf,zf,Vf]),aN=Object.freeze(["core","extended","dark"])});function Po(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function NE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function RE(e){return!e.bid||!e.ask?!1:St(e.bid,e.ask)>0}function Jf(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function Lo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??OE,o=t.oracleFreshnessMs??CE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(NE(c)){i?s.push(Object.freeze({...c,staleData:!0})):Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(RE(c)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Jf(c,r,n)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=un(r),l=u==="core"?o:o*2;if(Jf(c,r,l)){Po(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ro.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Ro,OE,CE,wa=S(()=>{Ce();No();Ro=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),OE=12e4,CE=6e5});function PE(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[a,c=""]=s.split("."),u=`${a}${c}`,l=a.length+o,d;return l<=0?d=`0.${"0".repeat(-l)}${u}`:l>=u.length?d=`${u}${"0".repeat(l-u.length)}`:d=`${u.slice(0,l)}.${u.slice(l)}`,`${i?"-":""}${d}`}function de(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(PE(e))}function Me(e,t){let r=de(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Dt=S(()=>{Ce()});function ee(e,t){throw new TypeError(`${e} ${t}`)}function Xf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e,t){Xf(e)||ee(t,"must be an object")}function Qf(e,t,r){Object.hasOwn(e,t)||ee(`${r}.${t}`,"is required")}function yr(e,t){(typeof e!="string"||e.length===0)&&ee(t,"must be a nonempty string")}function ln(e,t,r){t.has(e)||ee(r,`must be one of ${[...t].join(", ")}`)}function ba(e,t){(!Number.isSafeInteger(e)||e<0)&&ee(t,"must be a nonnegative safe integer")}function ya(e,t,r=!1){e===null&&r||(Xf(e)||ee(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&ee(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&ee(`${t}.scale`,"must be a nonnegative safe integer"))}function $o(e,t,r=!1){e===null&&r||Ut(e,t)}function Yf(e,t){Ut(e,t),yr(e.venue,`${t}.venue`),yr(e.reason,`${t}.reason`),UE.test(e.reason)||ee(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&yr(e.symbol,`${t}.symbol`)}function Se(e){Ut(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Kf,"costAccounted","capturedAt","blockOrSeq","raw"])Qf(e,r,"quote");yr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&ee("quote.chain","must be a nonempty string or nonnegative chain id"),ln(e.instrument,LE,"quote.instrument"),ln(e.tier,$E,"quote.tier"),yr(e.symbolRaw,"quote.symbolRaw"),yr(e.symbol,"quote.symbol"),ln(e.side,BE,"quote.side"),ya(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&ee("quote.requestedSize","must not be negative");let t=0;for(let r of DE)Object.hasOwn(e,r)&&(ya(e[r],`quote.${r}`),t+=1);t===0&&ee("quote","must contain at least one of bid, ask, mid, mark");for(let r of Kf)ya(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&ee("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&ee(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&ee("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&ee("quote.fundingHourly","must be null for a spot quote"),ba(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&ee("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Ut(e.raw,"quote.raw"),e}function Bo(e){Ut(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Qf(e,t,"rankResult");return ln(e.rankedOn,qE,"rankResult.rankedOn"),Array.isArray(e.ranked)||ee("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>$o(t,`rankResult.ranked[${r}]`)),$o(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&ee("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&ee("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||ee("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>$o(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&ee("rankResult.improvementBps","must be a finite number or null"),ba(e.sourcesAnswered,"rankResult.sourcesAnswered"),ba(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&ee("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||ee("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Yf(t,`failed[${r}]`)),Array.isArray(e.excluded)||ee("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Yf(t,`excluded[${r}]`)),e.darkWindow!==null&&Ut(e.darkWindow,"rankResult.darkWindow"),ln(e.instrumentMix,FE,"rankResult.instrumentMix"),$o(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Ut(e.carry,"rankResult.carry"),e}var LE,$E,BE,qE,FE,DE,Kf,UE,lt=S(()=>{LE=new Set(["spot","perp"]),$E=new Set(["read-only","quote-only","prepare","intent"]),BE=new Set(["buy","sell"]),qE=new Set(["net-of-cost","gross"]),FE=new Set(["homogeneous","heterogeneous"]),DE=["bid","ask","mid","mark"],Kf=["fees","gasEstimate","priceImpact","fundingHourly"],UE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Zf(){return _e().venues.arcus}function zE(){return Object.keys(Zf().markets).sort()}function VE({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=Zf().markets[n];if(!o)return null;let i=Me(o.mark,`${n}.mark`),s=de(o.oracle),a=de(o.fundingHourly),c=r===null?F("0"):r,u={venue:ME,chain:jE,instrument:"perp",tier:HE,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:qo,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),Se(u)}function Fo({side:e="buy",sizeUsd:t=null}={}){return zE().map(r=>VE({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ME,jE,HE,qo,xa=S(()=>{Ue();Dt();Ce();lt();ME="arcus_perp",jE="robinhood-4663",HE="quote-only",qo="0.00000480324074074"});function Sa(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return F("0");let n=F(String(t)),o=xe(10000n,0);return Ie(Ie(e,n),o)}function tm(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=WE(n,t),c=t-a,u=F(qo),l=Sa(i,c),d=Sa(u,a),p=Math.max(l.scale,d.scale),f={mantissa:l.mantissa*10n**BigInt(p-l.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Fe(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:qo,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Sa(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Fe(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function WE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)ga(e+o*em)&&(r+=1);return t>n&&ga(e+n*em)&&(r+=t-n),r}var em,vN,rm=S(()=>{Ce();xa();No();em=36e5,vN=24*365});function GE(e){return e.mid??e.mark??e.ask??e.bid??null}function JE(e){let t=GE(e);if(t===null)return null;let r=e.costAccounted===!0,n=F("0");e.fees!==null?n=xt(n,e.fees):r=!1,e.priceImpact!==null?n=xt(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=xt(n,e.gasEstimate);let o;if(e.fees!==null&&St(e.fees,F("1"))<0&&St(e.fees,F("0"))>=0){let i=xt(F("1"),e.fees);o=Ie(t,i),e.priceImpact!==null&&(o=xt(o,Ie(t,e.priceImpact)))}else o=xt(t,n);return{net:o,costAccounted:r,px:t}}function KE(e,t,r=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:r,quote:e}}function YE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=cn(t.net,e.net);return De(Ie(r,xe(10000n,0)),t.net,4)}function Do(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let h=Lo(e,{nowMs:r});o=h.survivors,i=h.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let h of o){let E=JE(h);if(E===null)continue;let A=null;if(u&&h.instrument==="perp"&&(A=tm(h,c,{nowMs:r}),A.carryBps!==null)){let v=xt(F("1"),De(A.carryBps,xe(10000n,0),12));E.net=Ie(E.net,v),E.costAccounted=!1}l.push(KE(h,E,A))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let h=l.filter(A=>A.instrument==="spot"),E=l.filter(A=>A.instrument==="perp");h.length>0&&E.length>0?(d=h.length>=E.length?h:E,p="homogeneous"):(d=l,p="homogeneous")}d.sort((h,E)=>{let A=St(h.net,E.net);return A!==0?A:h.venue<E.venue?-1:h.venue>E.venue?1:0});let f=d[0]??null,m=d.slice(1),w=d,g="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(g="net-of-cost");let y=m.length===0?null:YE(f,m[0]),b=l.find(h=>h.tier==="prepare")??null,T=un(r),x=T==="core"?null:{session:T,warning:T==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},_=null;u&&(_=XE(l));let k={rankedOn:g,ranked:w,winner:f,runnersUp:m,improvementBps:y===null?null:Number(Fe(y)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:b,carry:f?.carry??null,breakEvenHorizonHours:_};return Bo(k)}function XE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>St(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>St(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=cn(t.net,r.net);if(n.mantissa===0n)return 0;let o=Ie(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=De(n,o,4),s=Number(Fe(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Ea=S(()=>{wa();rm();No();Ce();lt()});function Aa(){return Co()}function nA(e){return{mantissa:e*e*10n**BigInt(br)/tA,scale:br}}function oA(e){let t=nA(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=De(Ie(t,xe(10n**BigInt(r),0)),xe(10n**BigInt(n),0),br);return o.mantissa===0n?null:De(F("1"),o,br)}return De(Ie(t,xe(10n**BigInt(n),0)),xe(10n**BigInt(r),0),br)}function iA(e){let t=Pf(),r=t.assets[e];return r?xe(r.rawPrice,t.oracleScaleExp):null}function sA(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return De(t,aA(r,t),br)}function aA(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:an(e,r).mantissa+an(t,r).mantissa,scale:r}}function cA(e){let t=Aa(),r=rA[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function va(){return Object.keys(Aa().pools).sort()}function xr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Aa(),o=n.pools[e];if(!o)return null;let i=oA(o);if(i===null)return null;let s=de(o.liqUsd),a=r===null?F("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:De(xe(BigInt(o.feePpm),0),xe(1000000n,0),8),u=a.mantissa===0n?F("0"):sA(s,a),l=cA(o.version),f={venue:QE,chain:ZE,instrument:"spot",tier:eA,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:l===null?null:l.wei.toString(),gasUnits:l===null?null:l.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},m=iA(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Fe(De(Ie(cn(i,m),xe(10000n,0)),m,4))),Se(f)}function nm({side:e="buy",sizeUsd:t=null}={}){return va().map(r=>xr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var QE,ZE,eA,tA,br,rA,ka=S(()=>{Ue();Dt();Ce();lt();QE="rh_uniswap",ZE=4663,eA="prepare",tA=1n<<192n,br=18,rA=Object.freeze({v3:180000n,v4:240000n})});function Uo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=xr({symbol:t,side:r,sizeUsd:n});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>om)throw new Error(`quote is stale (${a}ms old, bound ${om}ms); re-quote before preparing`);let u=Co().pools[t],l=u.version==="v4"?lA:uA,d=l,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var om,uA,lA,Ia=S(()=>{ka();Ue();om=12e4,uA="0x0000000000000000000000000000000000000000",lA="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function dn(){return _e().venues.hyperliquid_hip3}function im(){return Object.keys(dn().dexs).sort()}function mA(){let e=[];for(let[t,r]of Object.entries(dn().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function hA(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=dn().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(dn().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function gA(e,t){try{return Ff().books[`${e}:${t}`]??null}catch{return null}}function wA(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(Fe(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,p=Math.min(o,d),f=p/u;if(i+=p,s+=f,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function yA(e,t,r,n){let o=wA(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Fe(n));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:de(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function sm({dex:e,ticker:t,market:r,side:n,size:o}){let i=Me(r.mark,`${e}:${t}.mark`),s=de(r.fundingHourly),a=de(r.vol24h),c=de(r.oi),u=o===null?F("0"):o,l=gA(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let g=yA(l,n,u,i);d=g.impact,p=g.depth,p?.fullyFilled?f="impact measured from l2Book; fees and gas still not captured":f="book walked but size exceeds visible depth; fees and gas not captured"}else f="no order book depth wired for this coin; fees and gas not captured";else l?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let w={venue:dA,chain:pA,instrument:"perp",tier:fA,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(w.raw.vol24hFixed=a),c!==null&&(w.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(w.bid=F(String(l.bids[0].px)),w.ask=F(String(l.asks[0].px))),Se(w)}function am({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=hA(e);return n.length===0||n.length>1?null:sm({...n[0],side:t,size:r})}function Mo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of mA()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=dn().dexs[i][s];n.push(sm({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var dA,pA,fA,cm=S(()=>{Ue();Dt();Ce();lt();dA="hyperliquid_hip3",pA="hyperliquid",fA="quote-only"});function um(){return _e().venues.arcus_spot}function EA(){return Object.keys(um().pairs).sort()}function AA({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=um().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Me(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Me(n.ask,`${e}.ask`),s=de(n.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),f=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+f,scale:d+1},a={mantissa:(p+f)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=r===null?F("0"):r,u=F("0"),l={venue:bA,chain:xA,instrument:"spot",tier:SA,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:_e().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(l.bid=o),i!==null&&(l.ask=i),a!==null&&(l.mid=a),Se(l)}function jo({side:e="buy",sizeUsd:t=null}={}){return EA().map(r=>AA({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var bA,xA,SA,lm=S(()=>{Ue();Dt();Ce();lt();bA="arcus_spot",xA="robinhood-4663",SA="quote-only"});function Ho(){return Bf()}function _a(){return Object.keys(Ho().tokens).sort()}function _A(e){let t=Ho().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function TA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Ta({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Ho().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=_A(n);if(!s||!a)return null;let c=Me(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):TA(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=dm&&(p=!1);let f={venue:vA,chain:kA,instrument:"spot",tier:IA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ho().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<dm}};return Se(f)}function pm({side:e="buy",sizeUsd:t=null}={}){return _a().map(r=>Ta({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var vA,kA,IA,dm,fm=S(()=>{Ue();Dt();Ce();lt();vA="solana_xstocks",kA="solana",IA="quote-only",dm=25e3});function zo(){return qf()}function Oa(){return Object.keys(zo().tokens).sort()}function LA(e){let t=zo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function $A(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Ca({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=zo().tokens;if(Object.hasOwn(i,e))n=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=LA(n);if(!s||!a)return null;let c=Me(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?F("0"):r,d=l.mantissa===0n?F("0"):$A(u,l),f={venue:OA,chain:CA,instrument:"spot",tier:NA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:zo().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<RA,impactSizeFractionHint:PA}};return Se(f)}function mm({side:e="buy",sizeUsd:t=null}={}){return Oa().map(r=>Ca({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var OA,CA,NA,RA,PA,hm=S(()=>{Ue();Dt();Ce();lt();OA="ton_stonfi",CA="ton",NA="quote-only",RA=25e3,PA=.01});var Vo={};M(Vo,{bestEquityRoute:()=>BA,collectEquityQuotes:()=>wm,equityVenues:()=>qA,getUniverse:()=>Rf,getVenues:()=>_e,loadFixtures:()=>pa,prepareEquity:()=>Uo,prepareEquityRoute:()=>FA,rankEquityQuotes:()=>Do,toJsonSafe:()=>DA,validateQuote:()=>Se,validateRankResult:()=>Bo});function Na(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function wm(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Na(t),o=[],i=am({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Mo({ticker:r,sizeUsd:n}))o.push(u);for(let u of Fo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of jo({sizeUsd:n}))u.symbol===r&&o.push(u);let s=xr({symbol:r,sizeUsd:n});s&&o.push(s);let a=Ta({symbol:r,sizeUsd:n});a&&o.push(a);let c=Ca({symbol:r,sizeUsd:n});return c&&o.push(c),o}function BA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Na(e.sizeUsd??e.size??null),n=wm(t,{sizeUsd:r});if(n.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=n[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=Do(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>gm}}function qA(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Mo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Fo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:jo().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:va().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:_a().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Oa().length}],t=[...Mo(),...Fo(),...jo(),...nm(),...pm(),...mm()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=Lo(t,{nowMs:r});return{inventory:e,hip3Dexs:im(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:_e().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function FA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=Na(e.sizeUsd??e.size??null),o=xr({symbol:t,sizeUsd:n});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=Uo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>gm}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function DA(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var gm,Wo=S(()=>{Ce();Ea();Ia();wa();cm();lm();xa();ka();fm();hm();Ue();Ea();Ia();lt();Ue();gm=3600*1e3});var Go={};M(Go,{CHAIN_CONFIGS:()=>sn,EVIDENCE:()=>B,RISK:()=>$,SCANNER_CAPABILITIES:()=>dr,__clearScanners:()=>$b,createScanner:()=>Pd,getScanner:()=>Ds,listScanners:()=>Ld,registerBuiltinScanners:()=>Ao,registerCustomChain:()=>Hp,registerScanner:()=>co,scannerCoverage:()=>Bb,validateScanner:()=>Rd});var Jo=S(()=>{wt();vo()});var ym={};M(ym,{classifyReceipt:()=>Ra});function Ra(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var Pa=S(()=>{});var Fa={};M(Fa,{createWatch:()=>qa,listWatches:()=>Ba,removeWatch:()=>HA});import pn from"node:fs";import La from"node:path";import{randomUUID as UA}from"node:crypto";import{homedir as MA}from"node:os";function jA(e=process.env){return e.ORACLE_CONFIG_DIR||La.join(MA(),".config","oracle")}function bm(e=process.env){return La.join(jA(e),"watches.json")}function $a(e=process.env){let t=bm(e);if(!pn.existsSync(t))return{watches:[]};try{let r=JSON.parse(pn.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function xm(e,t=process.env){let r=bm(t);pn.mkdirSync(La.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;pn.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
7
|
+
`,{mode:384}),pn.renameSync(n,r)}function Ba(e=process.env){return $a(e).watches}function qa({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:UA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=$a(o);return s.watches.push(i),xm(s,o),i}function HA(e,t=process.env){let r=$a(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(xm({watches:n},t),!0)}var Ko=S(()=>{});function Da(e){let t=VA[Number(e)]||[];return new Set([...t,...zA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var zA,VA,Ua=S(()=>{zA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],VA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});import{isAddress as L2}from"ethers";var Ma=S(()=>{ke();jr();sr()});import{Interface as JA,isAddress as U2}from"ethers";var z2,Sm=S(()=>{Ma();jr();sr();z2=new JA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as KA,isAddress as G2}from"ethers";var X2,Q2,Em=S(()=>{Ma();jr();sr();X2=new KA(["function approve(address spender,uint256 amount) returns (bool)"]),Q2=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var Mt=S(()=>{});import{Interface as YA,MaxUint256 as oR,isAddress as iR,keccak256 as sR,toUtf8Bytes as aR}from"ethers";var fR,fn=S(()=>{Ua();Sm();Em();Mt();sr();fR=new YA(["function approve(address spender,uint256 amount) returns (bool)"])});var Yo=S(()=>{fn()});import{Address as yR,NETWORK as bR,OutScript as xR,RawTx as SR,SigHash as ER,TEST_NETWORK as AR,Transaction as vR}from"@scure/btc-signer";var za=S(()=>{});import{createHash as QA}from"node:crypto";import{base58 as TR}from"@scure/base";import{getCompiledTransactionMessageDecoder as CR}from"@solana/transaction-messages";var Am,NR,Va=S(()=>{Am=e=>QA("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),NR=new Map([[Am("route"),{name:"route",prefixBytes:0}],[Am("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var vm=S(()=>{Cn()});var DR,UR,Ga=S(()=>{Mt();vm();DR=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),UR=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var HR,Ja=S(()=>{Mt();HR="0x"+"00".repeat(32)});var ZA,JR,Ka=S(()=>{Ja();Mt();ZA=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),JR=Object.freeze(ZA.map(e=>e[0]))});var Xo=S(()=>{Mt()});import{Interface as Om}from"ethers";var ov,pP,iv,fP,mP,hP,gP,sv,wP,Qo=S(()=>{fn();ke();ge();Yo();za();Va();Ga();Ka();Xo();ov=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]),pP=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0}),iv=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),fP=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),mP=new Om(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),hP=new Om(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),gP=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),sv=Object.freeze([...ov]),wP=Object.freeze({...iv})});import{encode as xP}from"@msgpack/msgpack";import{keccak256 as EP,verifyTypedData as AP}from"ethers";var vP,kP,Ya=S(()=>{vP=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),kP=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Xa=S(()=>{Xo()});import{ed25519 as PP}from"@noble/curves/ed25519.js";import{base58 as $P}from"@scure/base";import{RawTx as qP,SigHash as FP,Transaction as DP}from"@scure/btc-signer";import{Transaction as MP,keccak256 as jP,verifyTypedData as HP}from"ethers";var Qa=S(()=>{Ya();Xa()});import{base58 as YP}from"@scure/base";var Zo=S(()=>{Qo();Yo();fn();Qa()});var Nm=S(()=>{Zo();Qo()});import jt from"node:fs";function uv(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function ei(e){let t;try{t=jt.openSync(e,jt.constants.O_RDONLY|jt.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=jt.fstatSync(t);if(uv(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=jt.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return jt.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{jt.closeSync(t)}}var uL,lL,dL,ti=S(()=>{uL=Object.freeze({N:1<<17,r:8,p:1}),lL=256*1024*1024,dL=16*1024});var fL,Rm=S(()=>{fL=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});var wL,yL,bL,Pm=S(()=>{Kt();wL="0".repeat(64),yL=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),bL=Promise.resolve()});var Lm=S(()=>{Pm();Mt();ti();Zo()});var $m=S(()=>{});import{Wallet as OL}from"ethers";import{base58 as NL}from"@scure/base";import{ed25519 as PL}from"@noble/curves/ed25519.js";import{NETWORK as $L,TEST_NETWORK as BL,WIF as qL,p2wpkh as FL}from"@scure/btc-signer";import{pubECDSA as UL}from"@scure/btc-signer/utils.js";var Bm=S(()=>{});import je from"node:path";import dv from"node:os";import{createHash as pv,randomBytes as y$}from"node:crypto";import{Interface as Za,keccak256 as x$}from"ethers";import{Transaction as E$}from"@scure/btc-signer";import{ed25519 as v$}from"@noble/curves/ed25519.js";function ec(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||je.join(process.env.XDG_STATE_HOME||je.join(dv.homedir(),".local","state"),"oracle"),r=pv("sha256").update(je.resolve(e)).digest("hex").slice(0,16);return{vault:je.join(e,"vault.json"),policy:je.join(e,"signer-policy.json"),policyKey:je.join(e,"policy-integrity-key"),policyAnchor:je.join(t,`signer-policy-${r}.high-water`),ledger:je.join(e,"signer-ledger.json"),ledgerAnchor:je.join(t,`signer-ledger-${r}.high-water`),token:je.join(e,"signer-token"),lock:je.join(t,`signer-${r}.lock`)}}var W$,G$,J$,qm=S(()=>{Nm();Zo();ti();Rm();Lm();$m();fn();Qo();Yo();Qa();Ga();Ka();Xo();Xa();Ja();Ya();za();Va();Bm();W$=new Za(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),G$=new Za(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),J$=new Za(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var Ht={};M(Ht,{CRYPTO_DESK_TOOLS:()=>yv,runCryptoDeskTool:()=>wv,signerAck:()=>Hm,signerDeny:()=>zm,signerPending:()=>Mm,signerQueue:()=>jm,signerStatus:()=>Um,vaultStatus:()=>Dm});import tc from"node:fs";import rc from"node:path";import{homedir as fv}from"node:os";function Fm(){return process.env.ORACLE_CONFIG_DIR||rc.join(fv(),".config","oracle")}function Dm(){let e=ec(rc.join(Fm(),"signer")),t=tc.existsSync(e.vault),r=tc.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:tc.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function hv(){let e=process.env.ORACLE_SIGNER_HOST||"127.0.0.1";if(!mv.has(e))throw new Error("signer: loopback host required");let t=Number(process.env.ORACLE_SIGNER_PORT||9462);if(!Number.isInteger(t)||t<1||t>65535)throw new Error("signer: invalid port");return{host:e,port:t,origin:`http://${e}`}}function gv(){let e=ec(rc.join(Fm(),"signer"));return ei(e.token)}async function At(e,t,r){let{host:n,port:o,origin:i}=hv(),s;try{s=gv()}catch{throw new Error("local signer is not running")}if(!s)throw new Error("local signer is not running");let a;try{a=await fetch(`http://${n}:${o}${t}`,{method:e,headers:{authorization:`Bearer ${s}`,origin:i,host:`${n}:${o}`,...r?{"content-type":"application/json"}:{}},body:r?JSON.stringify(r):void 0})}catch{throw new Error("local signer is not running")}let c=await a.json().catch(()=>({}));if(!a.ok)throw new Error(c?.error||`signer ${a.status}`);return c}async function Um(){try{return{ok:!0,running:!0,...await At("GET","/status")}}catch{try{return{ok:!0,running:!0,...await At("GET","/health")}}catch{return{ok:!1,running:!1,error:"local signer is not running"}}}}function nc(e={}){let{confirmationNonce:t,token:r,authorization:n,...o}=e&&typeof e=="object"?e:{};return o}async function Mm(){try{let e=await At("GET","/pending");return{ok:!0,running:!0,items:Array.isArray(e.items)?e.items:[],armed:e.armed===!0,execution:!1,note:"Queue with signer_queue, fill with signer_ack when the loopback signer is armed."}}catch{return{ok:!1,running:!1,items:[],error:"local signer is not running"}}}async function jm(e){if(!e||typeof e!="object")return{ok:!1,error:"artifact required"};try{let t=await At("POST","/pending",{artifact:e});return{ok:!0,queued:!0,execution:!1,...nc(t)}}catch(t){return{ok:!1,queued:!1,error:String(t?.message||t)}}}async function Hm(e){let t=String(e||"").trim();if(!t)return{ok:!1,executed:!1,error:"id required"};try{let r=await At("POST","/ack",{id:t});return{ok:!0,executed:r.executed===!0,...nc(r)}}catch(r){return{ok:!1,executed:!1,error:String(r?.message||r)}}}async function zm(e){let t=String(e||"").trim();if(!t)return{ok:!1,denied:!1,error:"id required"};try{let r=await At("POST","/deny",{id:t});return{ok:!0,denied:r.denied===!0,...nc(r)}}catch(r){return{ok:!1,denied:!1,error:String(r?.message||r)}}}async function wv(e,t={}){if(e==="vault_status")return{ok:!0,...Dm()};if(e==="signer_status")return Um();if(e==="signer_pending")return Mm();if(e==="signer_queue")return jm(t?.artifact);if(e==="signer_ack")return Hm(t?.id||t?.digest);if(e==="signer_deny")return zm(t?.id||t?.digest);if(e==="signer_execute"){if(!t?.artifact||!t?.confirmationNonce)throw new Error("signer_execute requires artifact and confirmationNonce from a local human confirm");return{ok:!0,...await At("POST","/execute",{artifact:t.artifact,confirmationNonce:t.confirmationNonce})}}if(e==="signer_disarm")return{ok:!0,...await At("POST","/disarm")};if(e==="receipt_report")return{ok:!0,...Ra(t?.receipt||t)};if(e==="watch_create")return{ok:!0,watch:qa(t)};if(e==="watch_list")return{ok:!0,watches:Ba()};if(e==="portfolio_snapshot")return{ok:!0,note:"use oracle_cli data call portfolio snapshot \u2014 knownUsd is incomplete if a provider is missing",hint:["data","call","portfolio","snapshot"]};throw new Error(`unknown crypto desk tool: ${e}`)}var mv,yv,zt=S(()=>{Pa();Ko();qm();ti();mv=new Set(["127.0.0.1","::1","localhost"]);yv=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function Av(e){return!(Ev.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Vm(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
|
|
8
|
+
`),n=[...new Set((r.match(bv)||[]).map(i=>i.toLowerCase()))].filter(i=>!Sv.has(i)),o=[...new Set(r.match(xv)||[])].filter(Av);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function Wm(e){let t=String(e||"").trim();if(!t)return[];let r=[],n=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let u of c)u?.expanded_url&&a.push(u.expanded_url),u?.url&&a.push(u.url);(i||s)&&r.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(n):n(o)}catch{for(let o of t.split(`
|
|
9
|
+
`)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var bv,xv,Sv,Ev,Gm=S(()=>{bv=/\b0x[a-fA-F0-9]{40}\b/g,xv=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,Sv=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),Ev=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});function Lv(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function $v(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function ri(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||kv))return r;let n=t.fileRead?$v:Lv;r=r.replace(Tv,"[REDACTED_PRIVATE_KEY]"),r=r.replace(_v,"[REDACTED_EVM_KEY]"),r=r.replace(Ov,o=>n(o));for(let o of Iv)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(Cv,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(Nv,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(Rv,(o,i,s,a)=>`${i}${n(s)}${a}`),r}var vv,kv,Iv,_v,Tv,Ov,Cv,Nv,Rv,Pv,o6,Jm=S(()=>{vv=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),kv=["1","true","yes","on"].includes(vv),Iv=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],_v=/\b0x[a-fA-F0-9]{64}\b/g,Tv=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Ov=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Cv=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,Nv=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,Rv=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Pv=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),o6=new Set([...Pv].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import{spawnSync as Bv}from"node:child_process";import Km from"node:fs";import oc from"node:path";function Uv(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Qm(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Mv(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return oc.isAbsolute(t)?Km.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(oc.delimiter)){if(!n)continue;let o=oc.join(n,"xurl");try{if(Km.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function jv(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function Hv(e){for(let t of e){let r=String(t);if(Xm.includes(r))return r;if(Xm.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function zv(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(l=>String(l)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=Hv(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!Qm(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(l=>l==="-X"||l==="--request"),u=String(r[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!Fv.includes(o))if(Dv.includes(o)){if(!Qm(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...r],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function Zm(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!Uv(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=zv(t,n);if(!o.ok)return o;let i=Mv(n);if(!i.ok)return i;let a=(r.spawnFn||Bv)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Ym,maxBuffer:1024*1024,env:jv(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Ym}ms`:String(a.error.message||a.error);return{ok:!1,error:ri(d,{force:!0})}}let c=ri(String(a.stdout||"").slice(0,qv),{force:!0}),u=ri(String(a.stderr||"").slice(0,2e3),{force:!0}),l=typeof a.status=="number"?a.status:1;return{ok:l===0,status:l,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:c,stderr:u||void 0}}var Ym,qv,Fv,Dv,Xm,l6,eh=S(()=>{Jm();Ym=45e3,qv=4e4,Fv=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),Dv=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Xm=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);l6=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function Jv(e){return!e||e==="0x"||e===Gv}async function th(e={},t={}){let r=t.rpcCall||X,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await r(o,"eth_getCode",[n,"latest"],t)}catch(m){return{address:n,chainId:o,status:"unavailable",error:m?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:n,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[m,w]of Object.entries(Vv))c.includes(m)&&a.push({selector:`0x${m}`,...w});let u=!1,l=null,d=null;for(let{label:m,slot:w}of Wv)try{let g=await r(o,"eth_getStorageAt",[n,w,"latest"],t);if(!Jv(g)){u=!0,l=m,d=`0x${String(g).slice(-40)}`;break}}catch{s.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}u&&(a.push({selector:l,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${l}), not the implementation ${d} it delegates to`));let f=a.filter(m=>m.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:f,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var Vv,Wv,Gv,rh=S(()=>{at();Vv=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),Wv=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),Gv=`0x${"0".repeat(64)}`});function ni(e,t){let r=String(e||"").trim();if(!Kv.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function ic(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function mn(e,t){return e==null||e===""?null:ic(e,t)}function Xv({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let l=a?.tx;if(!l||typeof l!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=ni(l.to,"prepared destination"),p=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=ic(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=mn(l.gasLimit??c.gasLimit,"gasLimit"),w=mn(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!w)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let g=Number(u.nowMs??Date.now()),y=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),b=Ss({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:y,secret:u.routeAttestationSecret}),T=ve(b,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:w,slippageBps:T.selectedBps,expiresAtMs:g+y},_=mn(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return _&&(x.maxPriorityFeePerGas=_),c.nonce!==void 0&&(x.nonce=Number(c.nonce)),(c.txType!==void 0||_)&&(x.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(x.l1FeeWei=mn(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=mn(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:T.selectedBps,expiresAtMs:g+y,fee:{oracleFeeBps:5},autoSlippage:T,artifact:{chainId:e,owner:o,transactions:[x]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function Qv(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}Ao();let r=Ds(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function Zv({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==B.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==$.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==$.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==B.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function nh(e={},t={}){let r=Number(e.chainId??Yv);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=ni(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ni(e.tokenIn,"tokenIn"):null,i=e.recipient?ni(e.recipient,"recipient"):null,s=e.amountIn==null?null:ic(e.amountIn,"amountIn"),a=Qv(r,t.scanner),c=t.scanContractRisk||th,[u,l,d]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let w={...e,tokenIn:o,amountIn:s,recipient:i},g=Zv({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:w,scanner:a}),y=null,b=null,T=null;if(e.prepare===!0&&g.length===0){y=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{b=Xv({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:y,args:e,opts:t})}catch(x){T=String(x?.message||x).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!b,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:g,prepared:!!y,unsignedTx:y,localSignerEnvelope:b,localSignerBlockedReason:T,signed:b?"pending-local-signer":!1,broadcast:b?"pending-local-signer":!1}}var Kv,Yv,oh=S(()=>{vo();wt();ke();rh();Kv=/^0x[0-9a-fA-F]{40}$/,Yv=4663});var uh={};M(uh,{evaluateContracts:()=>ch,fetchAccountTweets:()=>ah,snipeExecuteEnabled:()=>ih,tickTwitterCaWatch:()=>ik,twitterSnipeEmitsCard:()=>sk});function ih(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function sh(e){return String(e||"").trim().replace(/^@/,"")}async function ah({handle:e,limit:t=5,xurlFn:r=Zm}={},n={}){let o=sh(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:Wm(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function nk(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await nh({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function ok(e,t){let r=await gd(e,{chainSlug:"solana",stables:[tk,rk]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function ch(e,t={},r={}){let n=Number(t.chainId??ek),o=[];for(let i of e.evm||[])o.push(await nk(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await ok(i,r));return o}async function ik(e={},t={}){let r=sh(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await ah({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Vm(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||ch)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:ih(t.env||process.env),hits:i,seen:[...n]}}function sk(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var ek,tk,rk,lh=S(()=>{Gm();eh();oh();Gr();Kt();ek=4663,tk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",rk="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import He from"node:fs";import vt from"node:path";function hn(e){try{let t=He.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function ck(){return He.constants.O_NOFOLLOW||0}function ac(e){try{let t=He.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function dh(e){if(!ac(e))return null;let t=He.openSync(e,He.constants.O_RDONLY|ck());try{return He.readFileSync(t,"utf8")}finally{He.closeSync(t)}}function uk(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==sc&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${sc})`):t.push("$schema is required \u2014 must be "+sc)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):ak.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let n=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))n.has(o)||r.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function lk(e){let t=vt.join(e,"skills"),r=[];if(!hn(t))return r;function n(o,i=""){for(let s of He.readdirSync(o,{withFileTypes:!0})){let a=vt.join(o,s.name);if(s.isDirectory()){if(!hn(a))continue;n(a,i?`${i}/${s.name}`:s.name)}else if(s.name.endsWith(".md")){if(!ac(a))continue;let c=i?`${i}/${s.name.replace(/\.md$/,"")}`:s.name.replace(/\.md$/,"");r.push({name:c,path:a,relativePath:vt.relative(t,a)})}}}return n(t),r}function dk(e){let t=vt.join(e,"mcp"),r=[];if(!hn(t))return r;for(let n of He.readdirSync(t,{withFileTypes:!0})){if(!n.isFile()||!n.name.endsWith(".json"))continue;let o=vt.join(t,n.name);if(ac(o))try{let i=dh(o);if(i===null)continue;let s=JSON.parse(i);r.push({name:n.name.replace(/\.json$/,""),path:o,config:s})}catch(i){r.push({name:n.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return r}function pk(e){let t=vt.resolve(e);if(!hn(t))return{ok:!1,error:`plugin directory not found: ${t}`};let r=vt.join(t,"plugin.json");if(!He.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let n;try{let a=dh(r);if(a===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};n=JSON.parse(a)}catch(a){return{ok:!1,error:`invalid plugin.json: ${a.message}`}}let o=uk(n);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=lk(t),s=dk(t);return{ok:!0,plugin:{name:n.name,version:n.version||"0.0.0",description:n.description||"",author:n.author||{},license:n.license||"UNLICENSED",root:t,manifest:n,skills:i,mcpServers:s,warnings:[...o.warnings]}}}function ph(e){let t=[];if(!hn(e))return t;for(let r of He.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let n=vt.join(e,r.name),o=pk(n);o.ok&&t.push(o.plugin)}return t}var sc,ak,fh=S(()=>{sc="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",ak=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/});import Sr from"node:fs";import mh from"node:path";import{homedir as fk}from"node:os";function bk(e=process.env){return e&&e.ORACLE_CONFIG_DIR||mh.join(fk(),".config","oracle")}function xk(e=process.env){return mh.join(bk(e),"plugins")}function Sk(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),n=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,64);return mk.test(o)?o:null}function Ek(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24),n=String(t||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,16);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,40);return hk.test(o)?o:null}function Ak(e,t){let r=String(t||"").match(/^description:\s*(.+)$/m);return r?r[1].trim().slice(0,200):(String(t||"").split(`
|
|
10
|
+
`)[0].replace(/^#+\s*/,"").trim()||e).slice(0,200)}function vk(e){try{let t=Sr.lstatSync(e);if(t.isSymbolicLink()||!t.isFile()||t.size>yk)return null;let r=Sr.openSync(e,Sr.constants.O_RDONLY|(Sr.constants.O_NOFOLLOW||0));try{return Sr.readFileSync(r,"utf8")}finally{Sr.closeSync(r)}}catch{return null}}function kk(e,t,r){if(!r||typeof r!="object"||Array.isArray(r)||r.error)return null;let n=Ek(e,t);if(!n)return null;let o=typeof r.command=="string"?r.command.trim():"";if(!o)return null;let i=Array.isArray(r.args)?r.args.filter(a=>typeof a=="string"):[],s=r.env&&typeof r.env=="object"&&!Array.isArray(r.env)?Object.fromEntries(Object.entries(r.env).filter(([a,c])=>typeof a=="string"&&typeof c=="string")):{};return{name:n,command:o,args:i,env:s,enabled:r.enabled!==!1,source:`plugin:${e}`}}function hh(e={}){let t=e.env||process.env,r=e.pluginsDir||xk(t),n=e.scan||ph,o=[];try{o=n(r)||[]}catch{return{pluginsDir:r,plugins:[],skills:[],mcpServers:[]}}let i=[],s=[],a=new Set,c=new Set,u=[];for(let l of o){if(!l||typeof l!="object")continue;let d=typeof l.name=="string"?l.name:"";if(!d)continue;u.push({name:d,version:l.version||"0.0.0",root:l.root,skillCount:0,mcpCount:0});let p=u[u.length-1];for(let f of l.skills||[]){if(i.length>=gk)break;let m=Sk(d,f?.name||f?.relativePath);if(!m||a.has(m))continue;let w=typeof f.content=="string"?f.content:vk(f?.path);w!=null&&(a.add(m),p.skillCount+=1,i.push({name:m,description:Ak(m,w),path:f.path,size:w.length,content:w,source:`plugin:${d}`,plugin:d}))}for(let f of l.mcpServers||[]){if(s.length>=wk)break;if(f?.error)continue;let m=kk(d,f?.name,f?.config||f);!m||c.has(m.name)||(c.add(m.name),p.mcpCount+=1,s.push(m))}}return{pluginsDir:r,plugins:u,skills:i,mcpServers:s}}var mk,hk,gk,wk,yk,gh=S(()=>{fh();mk=/^[a-z0-9][a-z0-9_-]{0,63}$/,hk=/^[a-z0-9][a-z0-9-]*$/,gk=128,wk=16,yk=64*1024});var uc={};M(uc,{SKILL_TOOLS:()=>Bk,createSkill:()=>$k,getSkillsBlock:()=>Lk,listSkills:()=>Sh,loadSkill:()=>Pk});import J from"node:fs";import Ne from"node:path";import{homedir as Ik}from"node:os";function _k(){return process.env.ORACLE_CONFIG_DIR||Ne.join(Ik(),".config","oracle")}function kt(){return Ne.join(_k(),"skills")}function cc(e){J.existsSync(e)||J.mkdirSync(e,{recursive:!0,mode:448});let t=J.lstatSync(e);if(t.isSymbolicLink()||!t.isDirectory())throw new Error("skills directory must be a real directory")}function wh(){return J.constants.O_NOFOLLOW||0}function It(e){let t=J.lstatSync(e);if(t.isSymbolicLink()||!t.isFile())return null;let r=J.openSync(e,J.constants.O_RDONLY|wh());try{return J.readFileSync(r,"utf8")}finally{J.closeSync(r)}}function Tk(e,t){if(J.existsSync(e)){let n=J.lstatSync(e);if(n.isSymbolicLink()||!n.isFile())throw new Error("skill path must be a regular file")}let r=J.openSync(e,J.constants.O_WRONLY|J.constants.O_CREAT|J.constants.O_TRUNC|wh(),384);try{J.writeFileSync(r,t)}finally{J.closeSync(r)}try{J.chmodSync(e,384)}catch{}}function yh(e){let t=String(e??"").trim();if(!Vt.test(t))throw new Error("invalid skill name");return Ne.join(kt(),`${t}.md`)}function oi(e,t){let r=t.match(/^description:\s*(.+)$/m);return r?r[1].trim():t.split(`
|
|
11
|
+
`)[0].replace(/^#+\s*/,"").trim()||e}function Ok(){let e=[];for(let t of J.readdirSync(gn,{withFileTypes:!0})){let r,n;if(t.isFile()&&t.name.endsWith(".md"))r=t.name.replace(/\.md$/,""),n=Ne.join(gn,t.name);else if(t.isDirectory()&&Vt.test(t.name))r=t.name,n=Ne.join(gn,t.name,"SKILL.md");else continue;if(!Vt.test(r)||!J.existsSync(n))continue;let o=It(n);o!==null&&e.push({name:r,description:oi(r,o),path:n,size:o.length})}return e}function Ck(e=process.env){let t=String(e.ORACLE_ADMIN||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Nk(e=process.env){return String(e.ORACLE_ADMIN_SKILLS_DIR||"").trim()||null}function Rk(e){let t=[];if(!e||!J.existsSync(e))return t;let r=J.lstatSync(e);if(r.isSymbolicLink()||!r.isDirectory())return t;let n=[e];for(;n.length;){let o=n.pop(),i=[];try{i=J.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let s of i){if(s.name.startsWith("."))continue;let a=Ne.join(o,s.name);if(s.isDirectory()){n.push(a);continue}if(!s.isFile())continue;let c;if(s.name==="SKILL.md")c=Ne.basename(o);else if(s.name.endsWith(".md"))c=s.name.replace(/\.md$/,"");else continue;if(!Vt.test(c))continue;let u=It(a);u!==null&&t.push({name:c,description:oi(c,u),path:a,size:u.length,source:"admin"})}}return t}function bh(){return Ck()?Rk(Nk()):[]}function xh(){try{return(hh().skills||[]).map(t=>({name:t.name,description:t.description,path:t.path,size:t.size,source:t.source,content:t.content}))}catch{return[]}}function Sh(){try{cc(kt());let e=new Map(Ok().map(t=>[t.name,t]));for(let t of xh())e.has(t.name)||e.set(t.name,t);for(let t of bh())e.set(t.name,t);for(let t of J.readdirSync(kt(),{withFileTypes:!0})){if(t.isFile()&&t.name.endsWith(".md")){let r=Ne.join(kt(),t.name),n=It(r);if(n===null)continue;let o=t.name.replace(/\.md$/,"");if(!Vt.test(o))continue;e.set(o,{name:o,description:oi(o,n),path:r,size:n.length});continue}if(t.isDirectory()&&Vt.test(t.name)){let r=Ne.join(kt(),t.name,"SKILL.md");if(!J.existsSync(r))continue;let n=It(r);if(n===null)continue;e.set(t.name,{name:t.name,description:oi(t.name,n),path:r,size:n.length})}}return[...e.values()].sort((t,r)=>t.name.localeCompare(r.name))}catch{return[]}}function Pk(e){try{cc(kt());let t=yh(e);if(J.existsSync(t))return It(t);let r=Ne.join(kt(),e,"SKILL.md");if(Vt.test(e)&&J.existsSync(r))return It(r);for(let n of bh())if(n.name===e)return It(n.path);for(let n of xh())if(n.name===e&&typeof n.content=="string")return n.content;for(let n of[Ne.join(gn,e,"SKILL.md"),Ne.join(gn,`${e}.md`)]){if(!J.existsSync(n))continue;let o=It(n);if(o!==null)return o}return null}catch{return null}}function Lk(e){let t=Sh();if(t.length===0)return`## Skills
|
|
12
|
+
No skills installed. Use skill_create to save a successful workflow.
|
|
13
|
+
`;let r=t;if(e){let o=e.toLowerCase();r=[...t].sort((i,s)=>{let a=(i.name.toLowerCase().includes(o)?2:0)+(i.description.toLowerCase().includes(o)?1:0);return(s.name.toLowerCase().includes(o)?2:0)+(s.description.toLowerCase().includes(o)?1:0)-a})}return["## Skills","Available (use skill_load <name>):",...r.map(o=>`- **${o.name}**: ${o.description}`)].join(`
|
|
14
|
+
`)}function $k(e,t){cc(kt());let r=yh(e);if(J.existsSync(r)&&!J.lstatSync(r).isFile())throw new Error("skill path must be a regular file");Tk(r,t)}var gn,Vt,Bk,lc=S(()=>{da();gh();gn=Oo("skills",import.meta.url),Vt=/^[a-z0-9][a-z0-9_-]{0,63}$/;Bk=[{type:"function",function:{name:"skill_load",description:"Load full content of a skill by name.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Skill name using lowercase letters, digits, hyphens, or underscores"}},required:["name"],additionalProperties:!1}}},{type:"function",function:{name:"skill_create",description:"Save a new skill from a verified workflow. Refused without a verifier pass this turn.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Lowercase letters, digits, hyphens, or underscores"},content:{type:"string",description:"Full SKILL.md content"}},required:["name","content"],additionalProperties:!1}}},{type:"function",function:{name:"skill_list",description:"List all installed skills.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]});import{wordlists as qk}from"ethers";function Mk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Uk.has(t.length)&&t.every(r=>qk.en.getWordIndex(r)>=0)}function Vk(e){let t=Eh(e);return zk.has(t)||Hk.test(t)}function Eh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Wk(e){let t=Eh(e);return[...Fk].some(r=>t.includes(r))}function Gk(e,t,r){if(typeof t=="string"){if(Dk.some(n=>n.test(t))||Mk(t))throw new wn(r);if(jk.test(t)&&!Vk(e))throw new wn(r)}}function dc(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Gk(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>dc(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(Wk(o))throw new wn(i);e[o]!==void 0&&(n[o]=dc(e[o],i,o))}return n}function Er(e){return dc(e)}var Fk,Dk,Uk,jk,Hk,zk,wn,pc=S(()=>{Fk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Dk=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Uk=new Set([12,15,18,21,24]);jk=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Hk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,zk=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);wn=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as Jk,chmod as ii,readFile as Kk,rename as Yk,writeFile as Xk}from"node:fs/promises";import{homedir as Qk}from"node:os";import{dirname as Ah,join as fc}from"node:path";import Zk from"sql.js";function ci(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ci).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ci(e[t])}`).join(",")}}`}function vh(e){if(!e1.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function si(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ai(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function kh(e={}){let t=e.path||n1;await Jk(Ah(t),{recursive:!0,mode:448}),await ii(Ah(t),448);let r;try{r=await Kk(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Zk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
|
|
15
|
+
PRAGMA foreign_keys=ON;
|
|
16
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
17
|
+
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS artifact_edges (
|
|
20
|
+
parent_id TEXT NOT NULL REFERENCES artifacts(id), child_id TEXT NOT NULL REFERENCES artifacts(id),
|
|
21
|
+
PRIMARY KEY(parent_id, child_id)
|
|
22
|
+
);
|
|
23
|
+
CREATE TABLE IF NOT EXISTS action_receipts (
|
|
24
|
+
artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
`);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await Xk(l,Buffer.from(o.export()),{mode:384}),await ii(l,384),await Yk(l,t),await ii(t,384)};return s=s.then(u,u),s}r?await ii(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let l=vh(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Er(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,f,ci(p)]),await a(),{id:d,type:l,createdAt:f,data:p}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?ai(l.getAsObject()):null;return l.free(),d},listArtifacts(u){c();let l=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(vh(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),si(l).map(ai)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let p=si(d),f=p.find(w=>w.id===String(u)),m=p.find(w=>w.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!t1.has(`${f.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${f.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[f.id,m.id]),await a(),{parentId:f.id,childId:m.id}},children(u){c();let l=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return l.bind([String(u)]),si(l).map(ai)},parents(u){c();let l=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return l.bind([String(u)]),si(l).map(ai)},async putReceipt(u,l){c();let d=this.getArtifact(u);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=Er(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),ci(p)]),await a(),p},getReceipt(u){c();let l=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");l.bind([String(u)]);let d=l.step()?JSON.parse(l.getAsObject().receipt_json):null;return l.free(),d},async close(){i||(await a(),o.close(),i=!0)}}}var mc,e1,t1,r1,n1,Ih=S(()=>{pc();mc=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),e1=new Set(mc),t1=new Set(mc.slice(0,-1).map((e,t)=>`${e}:${mc[t+1]}`)),r1=fc(process.env.ORACLE_CONFIG_DIR||fc(Qk(),".config","oracle"),"workspace"),n1=fc(r1,"artifacts.sqlite")});import{createHash as _h}from"node:crypto";function i1(e){return o1.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function hc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(hc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${hc(e[t])}`).join(",")}}`}function s1(e){return _h("sha256").update(String(e)).digest("hex")}function Th(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let r of t.searchParams.keys())if(i1(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Oh(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function a1(e={}){let t=Th(e.url??e.sourceUrl),r=Oh(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(Er({url:t,fetchedAt:r,contentHash:n}))}function Ch(e={}){let t=Th(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Oh(e.fetchedAt),s=s1(r);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(a1),c=Er({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${_h("sha256").update(hc(c)).digest("hex")}`,...c})}var o1,Nh=S(()=>{pc();o1=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Rh(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function yn(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function wc(e,t){return t>0?yn(e/t*100):null}function yc(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function l1(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Wt(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Rh(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||u1.has(n.toUpperCase())})}function d1(e){let t=[],r=yc(e);for(let n of e.assets||e.holdings||[])Wt(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Wt(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Wt(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Wt(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Wt(t,a,{...i,venue:"Hyperliquid spot"});let s=Rh(n.perps?.accountValueUsd);s!=null&&Wt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Wt(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function p1(e,t){let r=yc(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function gc(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:yn(i),percentOfKnown:wc(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Ph(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=l1(t.labels??t.addressBook??e.labels??e.addressBook),o={...c1,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((v,R)=>{if(!v||typeof v!="object")return;let I=p1(v,R);s.has(I)?a+=1:(s.add(I),i.push(v))});let c=i.flatMap(d1),u=c.filter(v=>v.usdValue!=null),l=c.filter(v=>v.usdValue==null),d=i.reduce((v,R)=>v+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=yn(u.reduce((v,R)=>v+R.usdValue,0)),f=l.length+d,m=gc(u,"chain",p),w=gc(u,"venue",p),g=gc(u,"symbol",p);for(let v of m)v.chain=v.name;for(let v of w)v.venue=v.name;for(let v of g)v.asset=v.name,v.symbol=v.name;let y=yn(u.filter(v=>v.stablecoin).reduce((v,R)=>v+R.usdValue,0)),b=c.filter(v=>v.kind==="nft"),T=i.reduce((v,R)=>v+Number(R.valuation?.nftUnvaluedItems||0),0),x=b.filter(v=>v.usdValue==null).length+T,_=b.filter(v=>v.usdValue!=null).length,k=g[0]||null,h=k?k.percentOfKnown>=o.assetHighPct?"high":k.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",E=[];f&&E.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&E.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&E.push(`${a} duplicate address/chain snapshot(s) were ignored.`),k&&h!=="low"&&E.push(`Asset concentration is ${h}: ${k.name} is ${k.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&E.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),w[0]?.percentOfKnown>=o.venueHighPct&&E.push(`Venue concentration is high: ${w[0].name} is ${w[0].percentOfKnown}% of known value.`);let A=i.map(yc).filter(Boolean).map(v=>{let R=n.get(String(v).toLowerCase());return{address:v,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:f===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:w,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:h,topAsset:k?.name??null,topAssetPercent:k?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:y,percentOfKnown:wc(y,p),high:p>0&&wc(y,p)>=o.stablecoinHighPct},nftCoverage:{status:b.length||T?x?"partial":"valued":"not-observed",valuedItems:_,unvaluedItems:x,knownUsd:yn(b.filter(v=>v.usdValue!=null).reduce((v,R)=>v+R.usdValue,0))},addresses:A,warnings:[...new Set(E)]}}var c1,u1,Lh=S(()=>{c1=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),u1=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function $h(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function Fh(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function f1(e){return Number.isFinite(Number(Fh(e)))}function Bh(e){return pe(Fh(e),0)}function m1(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Ve(o))return;let s=Dh(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>f1(o))?r.sort((o,i)=>Bh(o.row)-Bh(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function Dh(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[li(e),ue(t),ue(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function ui(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Ve(o))continue;let i=t==="fill"?Dh(o):li(o);r.has(i)?(n+=1,t!=="fill"&&$h(o)>$h(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function h1(e){let t=new Map;for(let r of e){let n=[li(r),`${ue(r.chain??r.chainId)}|${ue(Ve(r))}`,`*|${ue(Ve(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function g1(e,t){return t.get(li(e))??t.get(`${ue(e.chain??e.chainId)}|${ue(Ve(e))}`)??t.get(`*|${ue(Ve(e))}`)??null}function w1(e){let t=new Map,r=0;for(let n of e){let o=[ue(n.chain??n.chainId),ue(qh(n)),ue(Ve(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ue(n.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:pe(n.costBasisUsd)/(s||1);r+=u*(a-l)-c,i.quantity-=u,i.cost-=u*l}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:ze(r),lots:t}}function Uh(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=ui(e.balances||[],"balance"),i=ui(e.positions||[],"position"),s=ui(e.fills||[],"fill"),a=ui(e.prices||[],"price"),c=h1(a.rows),u=[],l=0,d=0;for(let A of[...o.rows,...i.rows]){let v=g1(A,c),R=pe(A.quantity??A.amount??A.size),I=v?pe(v.priceUsd??v.price,NaN):pe(A.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let P=R*I,D=pe(v?.asOf??A.priceAsOf,0),V=r-D>n;V&&(l+=Math.abs(P)),u.push({...A,quantity:R,priceUsd:I,valueUsd:P,stale:V,kind:i.rows.includes(A)?"position":"balance"})}let p=u.filter(A=>A.kind==="balance").reduce((A,v)=>A+v.valueUsd,0),f=u.filter(A=>A.kind==="position"),m=f.reduce((A,v)=>A+v.valueUsd,0),w=f.reduce((A,v)=>A+Math.abs(v.valueUsd),0),g=p+m,y=pe(e.equityUsd,g),b=w1(m1(e.fills||[])).realizedPnlUsd,T=f.reduce((A,v)=>{let R=pe(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return A+v.quantity*(v.priceUsd-R)},0),x=new Map;for(let A of u)x.set(ue(Ve(A)),(x.get(ue(Ve(A)))||0)+Math.abs(A.valueUsd));let _=[...x.values()].reduce((A,v)=>A+v,0),k=[...x].map(([A,v])=>({asset:A,exposureUsd:ze(v),percent:_?ze(v/_*100):null})).sort((A,v)=>v.exposureUsd-A.exposureUsd||A.asset.localeCompare(v.asset)),h=u.reduce((A,v)=>A+Math.abs(v.valueUsd),0),E=Ph({snapshots:[{assets:u.map(A=>({symbol:Ve(A),usdValue:Math.abs(A.valueUsd),chain:A.chain,venue:A.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:b,unrealizedUsd:ze(T),totalUsd:ze(b+T)},exposure:{grossUsd:ze(w),netUsd:ze(g),leverage:y>0?ze(w/y):null,equityUsd:ze(y)},concentration:k,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(A=>A.stale).length,staleValueUsd:ze(l),stalePercent:h?ze(l/h*100):null,ttlMs:n},risk:E})}var pe,ze,ue,Ve,qh,li,Mh=S(()=>{Lh();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,ze=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ue=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Ve=e=>e.asset??e.symbol??e.coin,qh=e=>e.address??e.owner??e.account,li=e=>[ue(e.chain??e.chainId),ue(qh(e)),ue(Ve(e)),ue(e.source)].join("|")});var Q6,Z6,e5,jh=S(()=>{Q6=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Z6=Object.freeze(["read","simulate"]),e5=1440*60});function Hh(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return y1.test(t)||b1.includes(r)}function Gt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=S1.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of x1)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new bn(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Hh(o))throw new bn(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Gt(o,`${t}[key]`,r),Gt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Gt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Gt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Hh(o))throw new bn(`${t}.${o}`,"forbidden-key-name");Gt(i,`${t}.${o}`,r,o)}return e}var bn,y1,b1,x1,S1,zh=S(()=>{jh();bn=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},y1=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,b1=Object.freeze(["privkey","wif","xprv","seed"]);x1=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),S1=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as E1}from"node:crypto";function xc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(xc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xc(e[t])}`).join(",")}}`}function A1(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function di(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))di(t)}return e}function Sc(e,t="fact"){try{Gt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Gh(e){return E1("sha256").update(xc(e)).digest("hex")}function Jh({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:A1(r)};return di({...s,hash:Gh(s)})}function pi({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Sc(t,"intent");let n=Jh({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return di({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Kh(e,t,r,n={}){if(Ec(e),!(Vh[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);Sc(r,t);let i=n.external===!0||n.externallySupplied===!0;if(Wh.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=Jh({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return di({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ec(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(Gh(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Sc(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Vh[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(Wh.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var bc,Vh,Wh,Ac=S(()=>{zh();bc=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Vh=Object.freeze(Object.fromEntries(bc.map((e,t)=>[e,Object.freeze(t+1<bc.length?[bc[t+1]]:[])]))),Wh=new Set(["signed","broadcast"])});function Yh(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return v1[t]??t}function k1(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Yh(e)}:${t}`)}function Re(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:fi(r)})}function I1(e,t){let r=Ee(e.repeatBuys??e.repeat_buys??e.buyCount),n=Ee(e.walletWinRate??e.winRate);Re(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Re(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function _1(e,t){let r=Ee(e.ageHours??e.poolAgeHours),n=Ee(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Re(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Re(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Re(t,"liquidity_lock",o==null?null:o?.12:-.28)}function T1(e,t){let r=Ee(e.floorChange??e.floorChangePct),n=Ee(e.sales??e.saleCount);Re(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Re(t,"sales_depth",n===null?null:fe(n/50)*.18)}function O1(e,t){let r=Ee(e.flowImbalance??e.imbalance),n=Ee(e.fundingRate??e.funding);Re(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Re(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function C1(e,t){let r=Ee(e.marketProbability??e.marketPrice??e.probability),n=Ee(e.fairProbability??e.referenceProbability??e.fairValue);Re(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Ee(e.liquidityUsd??e.liquidity);Re(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function R1(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>Ee(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function mi(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Ee(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=Yh(o),a=k1(o,i),c=N1[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=fi(fe(u.length/l)),p=u.reduce((T,x)=>T+x.value,0),f=R1(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Re(u,"shadow_markout",m);let w=fi(fe(.5+p+m)),g=f===null?.8:fe(.85+f*.3,.35,1),y=fi(fe(d*g)),b=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||b.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&b.push("LOW_COVERAGE","NO_TRADE"),y<.5&&b.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Ee(o.ageHours??o.poolAgeHours)??1/0)<24&&b.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&b.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:w,confidence:y,coverage:d,contributions:u,flags:[...new Set(b)],noTrade:b.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var f5,v1,fe,Ee,fi,N1,vc=S(()=>{f5=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),v1=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),fe=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Ee=e=>Number.isFinite(Number(e))?Number(e):null,fi=e=>Math.round(e*1e4)/1e4;N1=Object.freeze({wallet:I1,pool:_1,nft_floor:T1,hl_flow:O1,prediction_market:C1})});function P1(e=[],t=[],r={}){let n=mi(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function L1(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=pi({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function Xh(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=P1(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(L1(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Qh=S(()=>{vc();Ac()});function hi(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function kc(e){e&&(e.prepareAttempted=!0)}function Ic(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function F1(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...Da(o)]:[];return new Set([...n,...i])}function D1(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function U1(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function M1(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function j1(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function H1(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of $1)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of B1)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,U1(e)){let o=M1(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=q1.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=F1(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(D1(e)){let o=j1(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):it;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>it||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>it?(r.push(`slippage ${o} exceeds cap ${Math.min(i,it)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function _c(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=H1(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var $1,B1,q1,Zh=S(()=>{Ua();ke();$1=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),B1=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),q1=/^0x[a-fA-F0-9]{40}$/});var tg={};M(tg,{DESK_TOOLS:()=>V1,runDeskTool:()=>G1});function W1(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>z1)throw new TypeError("tool arguments exceed size limit")}function rt(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function G1(e,t,r={}){if(W1(t),e==="research_artifact"){if(rt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>eg)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Ch)(t)}}if(e==="portfolio_analyze")return rt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Uh)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||pi,o=r.advanceTradeLifecycle||Kh,i=r.assertTradeLifecycle||Ec;if(t.action==="create")return rt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(rt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){kc(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=_c(t.lifecycle,s?.fact||{});if(!a.ok)return Ic(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};hi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else hi(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(rt(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){kc(r.loopVerifier);let a=_c(t.lifecycle,t.fact);if(!a.ok)return Ic(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&hi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(rt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||Xh)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||mi)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||kh,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return rt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return rt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return rt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return rt(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var z1,eg,gi,Jt,xn,V1,rg=S(()=>{Ih();Nh();Mh();Ac();vc();Qh();Zh();z1=128*1024,eg=5e4,gi={type:"string",minLength:1,maxLength:256},Jt={type:"object",additionalProperties:!0},xn=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),V1=Object.freeze([xn("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:gi,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Jt,parentId:gi,childId:gi},required:["action"],additionalProperties:!1}),xn("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:eg},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),xn("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Jt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),xn("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:gi,intent:Jt,lifecycle:Jt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Jt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),xn("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Jt},markouts:{type:"array",maxItems:100,items:Jt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var ng={};M(ng,{deployGloballyEnabled:()=>K1,executeGloballyEnabled:()=>J1,mevExecuteEnabled:()=>Y1});function J1(){return vn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function K1(){return vn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function Y1(){return vn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var og=S(()=>{Kt()});Kt();import ig from"node:fs";import Tc from"node:process";import{fileURLToPath as X1}from"node:url";Kt();import Ir from"node:fs";import _r from"node:path";var Dc=/^0x[0-9a-fA-F]{40}$/,wg=new Set(["privatekey","private_key","secret","seed","mnemonic","passphrase","signature","keystore"]),yg=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","signature","wif","xprv","xpriv","apikey","bearer","credential"],bg=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/,/\b(?:[a-z]{3,8}\s+){11,}[a-z]{3,8}\b/i],xg=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/;function Sg(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Eg(e,t){let r=Sg(e);if(wg.has(String(e).toLowerCase())||yg.some(n=>r.includes(n)))throw new Error(`address-book: ${t} is forbidden; the book stores labels, never key material`)}function Ag(e,t){if(typeof e=="string"&&(bg.some(r=>r.test(e))||xg.test(e)))throw new Error(`address-book: ${t} looks like key material; the book stores labels, never key material`)}function Uc(){let e=_t("ORACLE_ADDRESS_BOOK","MAD_ADDRESS_BOOK","");if(e)return _r.resolve(e);let t=_t("ORACLE_CONFIG_DIR","MAD_CONFIG_DIR",vi);return _r.join(t,"address-book.json")}function ki(e,t="field"){if(Array.isArray(e)){e.forEach((r,n)=>ki(r,`${t}[${n}]`));return}if(!e||typeof e!="object"){Ag(e,t);return}for(let[r,n]of Object.entries(e))Eg(r,r),ki(n,r)}function Ii(e){let t=String(e||"").trim();if(!Dc.test(t))throw new Error("address-book: address must be 0x + 40 hex characters");return t.toLowerCase()}function Yt(e,t){return e==null||e===""?null:String(e).slice(0,t)}function Fc(){return{version:1,updatedAt:null,entries:[]}}function Mc(e){return{address:String(e.address).toLowerCase(),label:Yt(e.label,80)||"unknown",who:Yt(e.who,120),role:Yt(e.role,40),chainIds:Array.isArray(e.chainIds)?e.chainIds.map(Number).filter(Number.isFinite):[],notes:Yt(e.notes,500),source:Yt(e.source,80),firstSeenAt:e.firstSeenAt||null,lastSeenAt:e.lastSeenAt||null}}function kn(){try{let e=JSON.parse(Ir.readFileSync(Uc(),"utf8"));if(!e||typeof e!="object")return Fc();let t=Array.isArray(e.entries)?e.entries:[];return{version:1,updatedAt:e.updatedAt||null,entries:t.filter(r=>r&&typeof r=="object"&&Dc.test(String(r.address||""))).map(Mc)}}catch{return Fc()}}function jc(e){let t=Uc();Ir.mkdirSync(_r.dirname(t),{recursive:!0,mode:448});let r={...e,version:1,updatedAt:new Date().toISOString()},n=_r.join(_r.dirname(t),`.address-book.${process.pid}.tmp`);Ir.writeFileSync(n,`${JSON.stringify(r,null,2)}
|
|
27
|
+
`,{mode:384}),Ir.renameSync(n,t);try{Ir.chmodSync(t,384)}catch{}return r}function Hc(e={}){let t=kn(),r=t.entries;if(e.role&&(r=r.filter(n=>n.role===String(e.role))),e.who){let n=String(e.who).toLowerCase();r=r.filter(o=>(o.who||"").toLowerCase().includes(n)||(o.label||"").toLowerCase().includes(n))}if(e.q){let n=String(e.q).toLowerCase();r=r.filter(o=>o.address.includes(n)||(o.label||"").toLowerCase().includes(n)||(o.who||"").toLowerCase().includes(n)||(o.notes||"").toLowerCase().includes(n))}return{updatedAt:t.updatedAt,count:r.length,entries:r}}function zc(e){let t=Ii(e),r=kn().entries.filter(n=>n.address===t);return{address:t,found:r.length>0,entries:r}}function Vc(e={}){ki(e);let t=Ii(e.address),r=Yt(e.label??e.role,80)||"wallet",n=new Date().toISOString(),o=kn(),i=o.entries.findIndex(u=>u.address===t&&u.label===r),s=Mc({address:t,label:r,who:e.who,role:e.role,chainIds:e.chainIds,notes:e.notes,source:e.source||"agent",firstSeenAt:i>=0&&o.entries[i].firstSeenAt||n,lastSeenAt:n});i>=0?o.entries[i]=s:o.entries.push(s);let a=u=>u==="agent"?0:u==="owner"?1:2;o.entries.sort((u,l)=>a(u.role)-a(l.role)||u.label.localeCompare(l.label)||u.address.localeCompare(l.address));let c=jc(o);return{ok:!0,entry:s,count:c.entries.length}}function Wc(e,t=null){let r=Ii(e),n=kn(),o=n.entries.length;return n.entries=n.entries.filter(i=>i.address!==r?!0:t==null?!1:i.label!==String(t)),jc(n),{ok:!0,removed:o-n.entries.length,count:n.entries.length}}import{createInterface as vg}from"node:readline";var Je=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),kg=/^[A-Za-z0-9_-]{1,64}$/;function In(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function me(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function Ig(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function _g(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=Je.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";!kg.test(o)||r.has(o)||(r.add(o),t.push(n))}return t}function Tg(e){let t=Number(e)||Je.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Je.maxCallTimeoutMs)}async function Og(e,t){let r;try{return await Promise.race([e,new Promise((n,o)=>{r=setTimeout(()=>{let i=new Error("tool call timed out");i.code="ORACLE_MCP_TIMEOUT",o(i)},t)})])}finally{clearTimeout(r)}}function _i(e,t={}){let r=_g(e?.tools),n=new Set(r.map(c=>c.name)),o=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",i=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",s=Tg(t.callTimeoutMs),a=!1;return async function(u){let l=u?.id??null;if(!Ig(u))return me(l,-32600,"invalid request");if(u.method==="initialize")return a=!0,In(l,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:o,version:i}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return In(l,{});if(!a)return me(l,-32002,"server not initialized");if(u.method==="tools/list")return In(l,{tools:r});if(u.method==="tools/call"){let d=u.params?.name,p=u.params?.arguments??{};if(typeof d!="string"||!n.has(d))return me(l,-32602,"unknown tool");if(!p||typeof p!="object"||Array.isArray(p))return me(l,-32602,"tool arguments must be an object");let f;try{f=JSON.stringify(p)}catch{return me(l,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(f)>Je.maxArgumentBytes)return me(l,-32602,"tool arguments exceeded the size limit");try{let m=await Og(Promise.resolve(e.call(d,p)),s);return In(l,m)}catch(m){if(m?.code==="ORACLE_MCP_TIMEOUT")return me(l,-32001,"tool call timed out");let w=typeof m?.message=="string"?m.message.replace(/\s+/g," ").trim():"",g=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(w),y=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return g&&!y&&w.length<=200?me(l,-32e3,`tool call failed: ${w}`):me(l,-32e3,"tool call failed")}}return me(l,-32601,"method not found")}}function Gc(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Je.maxRequestBytes,64),Je.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||Je.maxResponseBytes,256),Je.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||Je.maxConcurrentCalls,1),Je.maxConcurrentCalls),a=s*8,c=_i(e,t),u={closed:!1,inflight:0},l=vg({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function w(){if(u.closed||u.readerClosed)return;let x=u.inflight>=s||p.length>0||m;x&&!f?(f=!0,l.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),l.resume())}function g(x){if(!x||u.closed)return;let _=JSON.stringify(x);Buffer.byteLength(_)>i&&(_=JSON.stringify(me(x.id,-32003,"response exceeded the size limit"))),n.write(`${_}
|
|
28
|
+
`)===!1&&!m&&(m=!0,w(),n.once("drain",()=>{m=!1,b()}))}function y(x){u.inflight+=1,w(),Promise.resolve(c(x)).then(g).catch(()=>g(me(x?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,b()})}function b(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)y(p.shift());w()}function T(){u.closed||(g(me(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",x=>{if(u.closed)return;let _=String(x).split(`
|
|
29
|
+
`);for(let k=0;k<_.length;k+=1){if(d+=Buffer.byteLength(_[k]),d>o){T();return}k<_.length-1&&(d=0)}}),l.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){T();return}let _;try{_=JSON.parse(x)}catch{g(me(null,-32700,"parse error"));return}if(p.length>=a){g(me(_?.id,-32e3,"server busy"));return}p.push(_),b()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Jc=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),Cg=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function dt(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Ae(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function Tr(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Ae(o)}return`${r} raw`}return Ae(e)}var Ng=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Rg(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Ng[String(e||"").toUpperCase()]}function Kc(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let i=[],s=(c,u,l={})=>{u==null||u===""||i.push({label:c,value:String(u),...l})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Rg(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let l=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=Tr(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??Tr(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?Tr(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ae(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ae(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",Tr(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let y=Number(d),b=Number(m);Number.isFinite(y)&&Number.isFinite(b)&&y>0&&b>0&&b<=y&&s("SLIPPAGE",`${((1-b/y)*1e4).toFixed(0)} bps max`)}let w=c.meta?.fee??c.poolFee;w!=null&&s("POOL FEE",`${Number(w)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Ae(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let g=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(y=>y!==a).slice(0,3):[];for(let y of g){let b=y?.provider||y?.venue||y?.source,T=Tr(y?.netOut??y?.amountOut??y?.toAmount,u);b&&T&&s(`vs ${b}`,T,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",u!=null?`$${Ae(u)}`:null,{hero:!0});let l=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",l?l.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),l){let f=l.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,w)=>Number(w.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Ae(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ae(d)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((w,g)=>w+g,0)/f.length;s("AVG ENTRY",`$${Ae(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Ae(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ae(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(l=>Number(l?.priceEth??l?.price??l?.costEth)).filter(l=>Number.isFinite(l)&&l>0);u.length>0&&s("AVG BUY",`${Ae(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ae(o.owners??o.numOwners))}return i}function Pg(e,t,r){let n=Jc[e]||Jc.generic,o=Kc(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=dt(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${dt(u.label)}</span><b>${dt(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
|
|
10
30
|
:root{color-scheme:dark}
|
|
11
31
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
12
32
|
body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
@@ -42,9 +62,9 @@ summary::before{content:"\u25B8 "}details[open] summary::before{content:"\u25BE
|
|
|
42
62
|
pre{margin-top:8px;font-size:10px;color:#9FB8D2;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-all}
|
|
43
63
|
.card:active{transform:scale(.985);transition:transform .1s}
|
|
44
64
|
</style></head><body><div class="card">
|
|
45
|
-
<div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${
|
|
46
|
-
${
|
|
65
|
+
<div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${dt(n.title)}</span></div>
|
|
66
|
+
${i?`<div class="hero">${dt(i.value)}</div><div class="herolabel">${dt(i.label)}</div>`:""}
|
|
47
67
|
${c}
|
|
48
|
-
<details><summary>details \xB7 ${
|
|
49
|
-
<div class="foot"><span>${
|
|
50
|
-
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Ii(e,t){let r=Ep[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Ai(r,t).some(s=>s.hero))return null;let o=_p(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}var si=Qt("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787").replace(/\/$/,""),ep={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"}}},Wt={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:ep,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:ep,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Rw=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Use this to discover what public APIs are available before calling data_call. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_call",description:"Generic escape hatch: call any provider/op from the catalog. provider+op are required; args is a free-form object matching that op. Read-only. Use data_catalog first to see valid provider/op pairs.",inputSchema:{type:"object",required:["provider","op"],properties:{provider:{type:"string",description:"provider id, e.g. defillama, dexscreener, lifi, evm-rpc"},op:{type:"string",description:"op name for that provider, e.g. protocols, search, quote"},args:{type:"object",description:"op arguments (free-form)"}}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:Wt,conversionGasEvidence:Wt,gasPriceEvidence:Wt,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:Wt,conversionGasEvidence:Wt,gasPriceEvidence:Wt,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",required:["collectionIds"],properties:{collectionIds:{type:"string"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"address_book_remember",description:"Remember a wallet address with a label. Call this whenever someone states their address or an agent/counterparty wallet is discovered, so it survives the conversation. Stores labels only \u2014 never private keys, seeds, or passphrases.",inputSchema:{type:"object",required:["address","label"],properties:{address:{type:"string",description:"0x address"},label:{type:"string",description:"short name, e.g. research-agent"},who:{type:"string",description:"person or entity the wallet belongs to"},role:{type:"string",description:"agent | owner | person | counterparty | venue"},chainIds:{type:"array",items:{type:"number"}},notes:{type:"string"}}}},{name:"address_book_list",description:"List remembered wallets (owner, agent, people, counterparties). Read-only. Check this before sending or bridging to a person.",inputSchema:{type:"object",properties:{q:{type:"string",description:"search across label, who, address, notes"},role:{type:"string"},who:{type:"string"}}}},{name:"address_book_lookup",description:"Look up one 0x address in the durable address book. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"address_book_forget",description:"Remove a remembered address, optionally only one label for it.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},label:{type:"string"}}}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker","recipient"],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","amount","taker"],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}}],tp=String(oi.env.ORACLE_DEFAULT_ADDRESS||oi.env.MAD_OPERATOR_ADDRESS||"").trim(),Pw={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||tp||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||tp;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 ii(e,{method:t="GET",body:r}={}){let n=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0}),o=await n.json().catch(()=>({}));if(!n.ok)throw new Error(o.error||`HTTP ${n.status}`);return o}async function rp(e,t,r={}){try{return await ii(`${si}/data/call`,{method:"POST",body:{provider:e,op:t,args:r}})}catch(n){let o=typeof n?.message=="string"?n.message:"";if(o&&!/^HTTP \d+$/.test(o))return{error:o,provider:e,op:t};throw n}}async function $w(e,t={}){let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:o}=await Promise.resolve().then(()=>(Ma(),Da));return o(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()})}if(e==="rfq_quote"){let{normalizeRfqIntent:o}=await Promise.resolve().then(()=>(es(),ec)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(uu(),cu)),i=o({...t,sources:t.sources??t.allowedSources});return s(i,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:o,bestBridgeRoute:s}=await Promise.resolve().then(()=>(Dt(),Bu));return e==="best_swap_route"?o(t):s(t)}if(e==="prepare_best_route"){let{prepareBestRoute:o}=await Promise.resolve().then(()=>(Fu(),Uu));return o(t)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:o}=await Promise.resolve().then(()=>(Du(),Lu));return o(t)}if(e==="twap_simulate"){let{simulateTwap:o}=await Promise.resolve().then(()=>(zu(),Hu));return o({...t,amount:t.amount??t.amountIn})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:o}=await Promise.resolve().then(()=>(Bl(),ql));return o(t)}if(e==="perps_markets"){let o=String(t.venue||"all").toLowerCase(),s={};if(o==="all"||o==="dydx"){let{dydxMarkets:i}=await Promise.resolve().then(()=>(Fl(),Ul));s.dydx=await i()}if(o==="all"||o==="drift"){let{driftMarkets:i}=await Promise.resolve().then(()=>(Ml(),Dl));s.drift=await i()}if(o==="all"||o==="vertex"){let{vertexMarkets:i}=await Promise.resolve().then(()=>(Hl(),jl));s.vertex=await i()}return s}if(e==="dex_quote"){let o=String(t.dex||"").toLowerCase();if(o==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(Vl(),zl));return s(t)}if(o==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(Gl(),Kl));return s(t)}if(o==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Yl(),Ql));return s(t)}return{error:`unknown dex: ${o} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:o}=await Promise.resolve().then(()=>(Xl(),Jl));return{aevo:await o()}}if(e==="lending_markets"){let{compoundMarkets:o}=await Promise.resolve().then(()=>(ed(),Zl));return{compound:await o()}}if(e==="yield_vaults"){let[{yearnVaults:o},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(rd(),td)),Promise.resolve().then(()=>(od(),nd))]);return{yearn:await o(),convex:await s()}}if(e==="equity_venues"){let{equityVenues:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o())}if(e==="equity_quote"){let{bestEquityRoute:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let o=await Promise.resolve().then(()=>(Qn(),Gn));return o.registerBuiltinScanners?.(),o.scannerCoverage()}if(e==="scan_token"){let o=await Promise.resolve().then(()=>(Qn(),Gn));o.registerBuiltinScanners?.();let s=o.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let i=await s.resolveToken(t.token),a=s.supports?.("resolvePools")?await s.resolvePools(t.token).catch(()=>null):null,c=s.supports?.("scoreRisk")?await s.scoreRisk({token:t.token}).catch(()=>null):null;return{chainId:Number(t.chainId),token:i,pools:a,risk:c}}if(e==="wallet_balances"){let o=await Promise.resolve().then(()=>(Qn(),Gn));o.registerBuiltinScanners?.();let s=o.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let i=await s.nativeBalance(t.address),a=t.token?await s.tokenBalance(t.address,t.token).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:i,token:a}}if(e==="address_book_remember")return Si({address:t.address,label:t.label,who:t.who,role:t.role,chainIds:t.chainIds,notes:t.notes,source:"oracle-data-mcp"});if(e==="address_book_list")return wi({q:t.q,role:t.role,who:t.who});if(e==="address_book_lookup")return xi(t.address);if(e==="address_book_forget")return ki(t.address,t.label||null);if(e==="data_catalog")return ii(`${si}/data/catalog`);if(e==="data_health")return ii(`${si}/data/health`);if(e==="data_call"){if(!t.provider||!t.op)throw new Error("provider and op are required");return rp(t.provider,t.op,t.args||{})}let n=Pw[e];if(n){let{provider:o,op:s,args:i}=n(t);return rp(o,s,i)}throw new Error(`Unknown tool: ${e}`)}function qw(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:n,...o}=e;return{content:[{type:"image",data:n,mimeType:e.mimeType},{type:"text",text:JSON.stringify(o,null,2)}]}}let r=[{type:"text",text:JSON.stringify(e,null,2)}];try{let n=Ii(t,e);n&&r.push(n)}catch{}return{content:r}}var np=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Rw,async call(e,t){return qw(await $w(e,t),e)}});function Bw(){return vi(np)}function Uw(){let e=oi.argv[1];if(!e)return!1;try{return Zd.realpathSync(e)===Zd.realpathSync(Nw(import.meta.url))}catch{return!1}}Uw()&&Bw();var h1=io(np);export{$w as callTool,h1 as handle,Bw as startStdioLoop,Rw as tools};
|
|
68
|
+
<details><summary>details \xB7 ${dt(t)}</summary><pre>${a}</pre></details>
|
|
69
|
+
<div class="foot"><span>${dt(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
|
|
70
|
+
</div><script>document.documentElement.classList.add("live")</script></body></html>`}function Yc(e,t){let r=Cg[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Kc(r,t).some(i=>i.hero))return null;let o=Pg(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}var Oc=_t("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787").replace(/\/$/,""),sg={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},Ar={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:sg,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:sg,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Q1=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Use this to discover what public APIs are available before calling data_call. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"data_call",description:"Generic escape hatch: call any provider/op from the catalog. provider+op are required; args is a free-form object matching that op. Read-only. Use data_catalog first to see valid provider/op pairs.",inputSchema:{type:"object",required:["provider","op"],properties:{provider:{type:"string",description:"provider id, e.g. defillama, dexscreener, lifi, evm-rpc"},op:{type:"string",description:"op name for that provider, e.g. protocols, search, quote"},args:{type:"object",description:"op arguments (free-form)"}}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:Ar,conversionGasEvidence:Ar,gasPriceEvidence:Ar,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:Ar,conversionGasEvidence:Ar,gasPriceEvidence:Ar,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",required:["collectionIds"],properties:{collectionIds:{type:"string"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"address_book_remember",description:"Remember a wallet address with a label. Call this whenever someone states their address or an agent/counterparty wallet is discovered, so it survives the conversation. Stores labels only \u2014 never private keys, seeds, or passphrases.",inputSchema:{type:"object",required:["address","label"],properties:{address:{type:"string",description:"0x address"},label:{type:"string",description:"short name, e.g. research-agent"},who:{type:"string",description:"person or entity the wallet belongs to"},role:{type:"string",description:"agent | owner | person | counterparty | venue"},chainIds:{type:"array",items:{type:"number"}},notes:{type:"string"}}}},{name:"address_book_list",description:"List remembered wallets (owner, agent, people, counterparties). Read-only. Check this before sending or bridging to a person.",inputSchema:{type:"object",properties:{q:{type:"string",description:"search across label, who, address, notes"},role:{type:"string"},who:{type:"string"}}}},{name:"address_book_lookup",description:"Look up one 0x address in the durable address book. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"address_book_forget",description:"Remove a remembered address, optionally only one label for it.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},label:{type:"string"}}}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker","recipient"],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","amount","taker"],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"vault_status",description:"Local vault/signer posture on this machine (exists, armed, disarmed). Never returns key material. Never signs.",inputSchema:{type:"object",properties:{}}},{name:"signer_status",description:"Ping the loopback local signer. Reports running/armed. Never signs or broadcasts.",inputSchema:{type:"object",properties:{}}},{name:"signer_pending",description:"List pending local-signer artifacts waiting for Allow/Deny. Read-only. Does not approve, deny, sign, or broadcast. Fill stays on Telegram Allow or oracle signer /ack.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback local signer. Does not sign or broadcast. Requires oracle signer running on 127.0.0.1.",inputSchema:{type:"object",required:["artifact"],properties:{artifact:{type:"object"}}}},{name:"signer_ack",description:"Fill one pending artifact through the armed loopback signer. Same path as Telegram Allow. Fails closed if the signer is not running or is disarmed. MCP never holds keys.",inputSchema:{type:"object",properties:{id:{type:"string",description:"pending id (8-hex) or digest prefix"},digest:{type:"string"}}}},{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",inputSchema:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}}}},{name:"skill_list",description:"List packaged + local Oracle skills (same roster the native harness uses).",inputSchema:{type:"object",properties:{}}},{name:"skill_load",description:"Load full SKILL.md content by name. Read-only.",inputSchema:{type:"object",required:["name"],properties:{name:{type:"string"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],ag=String(Tc.env.ORACLE_DEFAULT_ADDRESS||Tc.env.MAD_OPERATOR_ADDRESS||"").trim(),Z1={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||ag||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||ag;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Cc(e,{method:t="GET",body:r}={}){let n=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0}),o=await n.json().catch(()=>({}));if(!n.ok)throw new Error(o.error||`HTTP ${n.status}`);return o}async function cg(e,t,r={}){try{return await Cc(`${Oc}/data/call`,{method:"POST",body:{provider:e,op:t,args:r}})}catch(n){let o=typeof n?.message=="string"?n.message:"";if(o&&!/^HTTP \d+$/.test(o))return{error:o,provider:e,op:t};throw n}}async function eI(e,t={}){let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:o}=await Promise.resolve().then(()=>(dl(),ll));return o(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()})}if(e==="rfq_quote"){let{normalizeRfqIntent:o}=await Promise.resolve().then(()=>(ys(),vl)),{requestRfqQuotes:i}=await Promise.resolve().then(()=>(Nd(),Cd)),s=o({...t,sources:t.sources??t.allowedSources});return i(s,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:o,bestBridgeRoute:i}=await Promise.resolve().then(()=>(hr(),np));return e==="best_swap_route"?o(t):i(t)}if(e==="prepare_best_route"){let{prepareBestRoute:o}=await Promise.resolve().then(()=>(ip(),op));return o(t)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:o}=await Promise.resolve().then(()=>(ap(),sp));return o(t)}if(e==="twap_simulate"){let{simulateTwap:o}=await Promise.resolve().then(()=>(dp(),lp));return o({...t,amount:t.amount??t.amountIn})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:o}=await Promise.resolve().then(()=>(rf(),tf));return o(t)}if(e==="perps_markets"){let o=String(t.venue||"all").toLowerCase(),i={};if(o==="all"||o==="dydx"){let{dydxMarkets:s}=await Promise.resolve().then(()=>(of(),nf));i.dydx=await s()}if(o==="all"||o==="drift"){let{driftMarkets:s}=await Promise.resolve().then(()=>(cf(),af));i.drift=await s()}if(o==="all"||o==="vertex"){let{vertexMarkets:s}=await Promise.resolve().then(()=>(lf(),uf));i.vertex=await s()}return i}if(e==="dex_quote"){let o=String(t.dex||"").toLowerCase();if(o==="pancakeswap"){let{pancakeQuote:i}=await Promise.resolve().then(()=>(pf(),df));return i(t)}if(o==="sushiswap"){let{sushiQuote:i}=await Promise.resolve().then(()=>(hf(),mf));return i(t)}if(o==="raydium"){let{raydiumQuote:i}=await Promise.resolve().then(()=>(wf(),gf));return i(t)}return{error:`unknown dex: ${o} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:o}=await Promise.resolve().then(()=>(bf(),yf));return{aevo:await o()}}if(e==="lending_markets"){let{compoundMarkets:o}=await Promise.resolve().then(()=>(Sf(),xf));return{compound:await o()}}if(e==="yield_vaults"){let[{yearnVaults:o},{convexPools:i}]=await Promise.all([Promise.resolve().then(()=>(Af(),Ef)),Promise.resolve().then(()=>(kf(),vf))]);return{yearn:await o(),convex:await i()}}if(e==="equity_venues"){let{equityVenues:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o())}if(e==="equity_quote"){let{bestEquityRoute:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:o,toJsonSafe:i}=await Promise.resolve().then(()=>(Wo(),Vo));return i(o({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let o=await Promise.resolve().then(()=>(Jo(),Go));return o.registerBuiltinScanners?.(),o.scannerCoverage()}if(e==="scan_token"){let o=await Promise.resolve().then(()=>(Jo(),Go));o.registerBuiltinScanners?.();let i=o.getScanner(Number(t.chainId));if(!i)throw new Error(`no scanner registered for chainId ${t.chainId}`);let s=await i.resolveToken(t.token),a=i.supports?.("resolvePools")?await i.resolvePools(t.token).catch(()=>null):null,c=i.supports?.("scoreRisk")?await i.scoreRisk({token:t.token}).catch(()=>null):null;return{chainId:Number(t.chainId),token:s,pools:a,risk:c}}if(e==="wallet_balances"){let o=await Promise.resolve().then(()=>(Jo(),Go));o.registerBuiltinScanners?.();let i=o.getScanner(Number(t.chainId));if(!i)throw new Error(`no scanner registered for chainId ${t.chainId}`);let s=await i.nativeBalance(t.address),a=t.token?await i.tokenBalance(t.address,t.token).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:s,token:a}}if(e==="address_book_remember")return Vc({address:t.address,label:t.label,who:t.who,role:t.role,chainIds:t.chainIds,notes:t.notes,source:"oracle-data-mcp"});if(e==="address_book_list")return Hc({q:t.q,role:t.role,who:t.who});if(e==="address_book_lookup")return zc(t.address);if(e==="address_book_forget")return Wc(t.address,t.label||null);if(e==="vault_status"){let{vaultStatus:o}=await Promise.resolve().then(()=>(zt(),Ht));return{ok:!0,...o(),execution:!1}}if(e==="signer_status"){let{signerStatus:o}=await Promise.resolve().then(()=>(zt(),Ht));return{...await o(),execution:!1}}if(e==="signer_pending"){let{signerPending:o}=await Promise.resolve().then(()=>(zt(),Ht));return o()}if(e==="watch_list"){let{listWatches:o}=await Promise.resolve().then(()=>(Ko(),Fa));return{ok:!0,watches:o(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:o}=await Promise.resolve().then(()=>(Ko(),Fa));return{ok:!0,watch:o(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:o}=await Promise.resolve().then(()=>(Pa(),ym));return{ok:!0,...o(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:o}=await Promise.resolve().then(()=>(lh(),uh));return o({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0})}if(e==="signer_queue"){let{signerQueue:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.artifact)}if(e==="signer_ack"){let{signerAck:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.id||t.digest)}if(e==="signer_deny"){let{signerDeny:o}=await Promise.resolve().then(()=>(zt(),Ht));return o(t.id||t.digest)}if(e==="skill_list"){let{listSkills:o}=await Promise.resolve().then(()=>(lc(),uc));return{ok:!0,skills:o().map(i=>({name:i.name,description:i.description,size:i.size}))}}if(e==="skill_load"){let{loadSkill:o}=await Promise.resolve().then(()=>(lc(),uc)),i=o(t.name);return i?{ok:!0,name:t.name,content:i}:{ok:!1,error:`unknown skill: ${t.name}`}}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:o}=await Promise.resolve().then(()=>(rg(),tg));return o(e,t)}if(e==="mev_status"){let{executeGloballyEnabled:o,mevExecuteEnabled:i}=await Promise.resolve().then(()=>(og(),ng));return{ok:!0,observer:!0,executeGloballyEnabled:o()===!0,mevExecuteEnabled:i()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:o}=await Promise.resolve().then(()=>($s(),cd));return{ok:!0,chains:Object.entries(o).map(([i,s])=>({id:i,chainId:s.chainId,name:s.name,evm:s.evm===!0}))}}if(e==="data_catalog")return Cc(`${Oc}/data/catalog`);if(e==="data_health")return Cc(`${Oc}/data/health`);if(e==="data_call"){if(!t.provider||!t.op)throw new Error("provider and op are required");return cg(t.provider,t.op,t.args||{})}let n=Z1[e];if(n){let{provider:o,op:i,args:s}=n(t);return cg(o,i,s)}throw new Error(`Unknown tool: ${e}`)}function tI(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:n,...o}=e;return{content:[{type:"image",data:n,mimeType:e.mimeType},{type:"text",text:JSON.stringify(o,null,2)}]}}let r=[{type:"text",text:JSON.stringify(e,null,2)}];try{let n=Yc(t,e);n&&r.push(n)}catch{}return{content:r}}var ug=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Q1,async call(e,t){return tI(await eI(e,t),e)}});function rI(){return Gc(ug)}function nI(){let e=Tc.argv[1];if(!e)return!1;try{return ig.realpathSync(e)===ig.realpathSync(X1(import.meta.url))}catch{return!1}}nI()&&rI();var B5=_i(ug);export{eI as callTool,B5 as handle,rI as startStdioLoop,Q1 as tools};
|