@oracle-agent/oracle 0.35.24 → 0.35.25

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.
@@ -144,7 +144,7 @@ anchor-lang = "0.31.1"
144
144
  - Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
145
145
  `)];return{family:"bitcoin",network:n,projectName:t,protocolModel:gu["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:a.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:a.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&a>0n&&new Set([...r,i]).size===r.length+1,checks:["bounded threshold","unique keys","positive BIP68 delay","separate recovery key"]},compiler:{tool:"rust-miniscript or equivalent",requiredBeforeFunding:!0,run:!1},tests:{tool:"regtest/signet policy satisfaction",requiredBeforeFunding:!0,run:!1},simulation:{network:n==="mainnet"?"signet or regtest required first":n,requiredBeforeFunding:!0,run:!1},firmAudit:!1,disclaimer:Sh},psbtPrepared:!1,fundingPrepared:!1}}function cs(){return Object.values(gu).map(e=>({...e,disclaimer:Sh}))}async function ls(e={}){let t=String(e.templateId||"").trim(),n=gu[t];n||Bt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?I4(e):A4(e),o=E4(r.files);return R({provider:"protocol-templates",kind:"native-protocol-build",templateId:t,supportStatus:n.supportStatus,prepareOnly:!0,firmAudit:!1,artifactHash:o,...r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,note:"Deterministic native protocol source bundle only. Compile, test, simulate, and separately prepare deployment/funding before user signature."},{provider:"protocol-templates",kind:"native-protocol-build"})}var Sh,GI,gu,Ih=z(()=>{ee();Sh="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",GI="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",gu=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});var dO={};ut(dO,{CONTRACTS_EVAL_HERE:()=>mz,runContractsEval:()=>pz});import pd from"node:fs";import gr from"node:path";import{spawnSync as Z7}from"node:child_process";import{fileURLToPath as ez}from"node:url";function cz(){let e=process.env.HOME||"";for(let t of["forge",gr.join(e,".foundry/bin/forge")])if(Z7(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function uO(e,t=[]){if(!pd.existsSync(e))return t;for(let n of pd.readdirSync(e)){let r=gr.join(e,n);if(pd.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;uO(r,t)}else n.endsWith(".sol")&&!r.includes(`${gr.sep}lib${gr.sep}`)&&t.push(r)}return t}function lz(){let e=[];for(let t of Object.keys(Wr)){let n=gr.join(tz,t),r=uO(gr.join(n,"src")),o=[];for(let i of r){let a=pd.readFileSync(i,"utf8");for(let s of nz)s.test(a)&&o.push(`${gr.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function uz(){return cz()?Object.keys(Wr).map(e=>{try{let t=as(e,{allowSkipStatic:!0});return{language:"Solidity",templateId:e,ok:t.ok===!0&&t.forgeTests?.ok===!0,forge:t.forgeTests,firmAudit:t.firmAudit===!1}}catch(t){return{language:"Solidity",templateId:e,ok:!1,error:String(t?.message||t).slice(0,240)}}}):Object.keys(Wr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function dz(){let e=[],t=cs();e.push({language:"catalog",ok:t.some(o=>o.family==="solana")&&t.some(o=>o.family==="bitcoin"),templates:t.map(o=>o.id)});let n=await ls({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:rz,programId:oz,unlockDelaySlots:1200});e.push({language:"Rust / Anchor",templateId:"solana-safe-vault",ok:n.oraclePrepared===!0&&n.signingReady===!1&&n.broadcastReady===!1&&n.firmAudit===!1,artifactHash:n.artifactHash});let r=await ls({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[iz,az],recoveryPubkey:sz,recoveryDelayBlocks:144});return e.push({language:"Miniscript / Tapscript",templateId:"bitcoin-tapscript-vault",ok:r.oraclePrepared===!0&&r.psbtPrepared===!1&&r.broadcastReady===!1&&r.firmAudit===!1,artifactHash:r.artifactHash}),e}async function pz(){let e=lz(),t=uz(),n=await dz(),r=[...e,...t,...n],o=r.filter(a=>a.ok!==!0&&a.skipped!==!0).length,i=r.filter(a=>a.skipped===!0).length;return{ok:o===0,total:r.length,pass:r.length-o-i,fail:o,skipped:i,languages:["Solidity","Rust / Anchor","Miniscript / Tapscript"],firmAudit:!1,cases:r}}var tz,nz,rz,oz,iz,az,sz,mz,pO=z(()=>{uu();fu();Ih();cu();tz=su("protocols/templates",import.meta.url),nz=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],rz="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",oz="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",iz="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",az="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",sz="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";mz=gr.dirname(ez(import.meta.url))});import{createHash as Tz}from"node:crypto";function cn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function xi(e){return typeof e=="number"&&Number.isFinite(e)}function ly(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ly(t);return Object.freeze(e)}for(let t of Object.keys(e))ly(e[t]);return Object.freeze(e)}function oo(e){if(Array.isArray(e))return e.map(oo);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=oo(e[n]);return t}return e}function sy(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 OO(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Cz(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Oz(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function Rz(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function LO(e){if(!cn(e))throw new TypeError("evidence artifact must be a plain object");if(!Nz.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(!cn(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(!cn(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!cn(e.train)||!cn(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return oo({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>oo(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 $O(e){return Tz("sha256").update(JSON.stringify(LO(e)),"utf8").digest("hex")}function Xt(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function cy(e,t){if(!cn(e)||!cn(e.metrics))throw new Error(`${t} metrics required`);let n=Xt(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!xi(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function Lz(e,{maxDailyLossPct:t}={}){let n=e.split,r=Xt(n.trainStartIndex,"split.trainStartIndex"),o=Xt(n.trainEndIndex,"split.trainEndIndex"),i=Xt(n.trainBarCount,"split.trainBarCount",1),a=Xt(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Xt(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Xt(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||a!==o+1||s-a+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!xi(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");cy(e.train,"train");let l=cy(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(xi(t)&&l.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 u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!cn(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Xt(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=Xt(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),b=Xt(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),y=Xt(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(w!==0||x>=b||b>y||b<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=y,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let S=cy({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(S.tradeCount<1||S.netPnlUsd<=0||S.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(xi(t)&&S.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 f=p/d.length;if(!xi(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function BO(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 n=LO(e),r=oo({id:e.id,...n});if(JSON.stringify(oo(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=$O(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Lz(e,t),e}function uy({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let a=[];if(!cn(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!cn(n))throw new TypeError("backtestOptions must be a plain object");if(!xi(r)||r<=0||r>=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 s=ct(e),c=vi(s),l=qs(t),u=t.length,d=(L=[],D={})=>RO({status:"fail",strategy:s,sHash:c,barsHash:l,split:D.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:D.train||null,holdout:D.holdout||null,walkForward:D.walkForward||{windows:[],passRate:0},flags:[...a,...L]});if(u<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(u*r),m=p,f=u-m;if(p<5||f<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:f}]);let h=t.slice(0,p),g=t.slice(m),w,x;try{w=yr(s,h,n),x=yr(s,g,n)}catch(L){return d([{type:"backtest_error",message:String(L.message||L)}])}let b={metrics:sy(w),costs:OO(w),tradeCount:w.metrics.tradeCount},y={metrics:sy(x),costs:OO(x),tradeCount:x.metrics.tradeCount},S={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:m,holdoutEndIndex:u-1,holdoutBarCount:f,trainFraction:r},E=[],v=Math.floor(u/(o+1));if(v<3)a.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:v});else for(let L=0;L<o;L++){let D=v*(L+1),Q=D,Y=Math.min(u,Q+v);if(Y-Q<3||D<3){E.push({index:L,trainStartIndex:0,trainEndIndex:D-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Le=t.slice(Q,Y),bt;try{bt=yr(s,Le,n)}catch{E.push({index:L,trainStartIndex:0,trainEndIndex:D-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let H=sy(bt),j=Rz(H,s.risk,i);E.push({index:L,trainStartIndex:0,trainEndIndex:D-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:j,reason:j?"pass":"fail_metrics",metrics:H})}let k=E.filter(L=>L.passed).length,A=E.length===0?0:k/E.length,T={windows:E,passRate:A,windowsRun:E.length};y.metrics.tradeCount===0&&b.metrics.tradeCount===0&&a.push({type:"no_trades",message:"no trades in train or holdout"}),y.metrics.tradeCount===0&&a.push({type:"absent_oos_trades",message:"holdout produced no trades"}),y.metrics.netPnlUsd<0&&a.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),b.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<0&&b.metrics.netPnlUsd>Math.abs(y.metrics.netPnlUsd)*.25?a.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):b.metrics.netPnlUsd>0&&y.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<b.metrics.netPnlUsd*.1&&b.metrics.tradeCount>=i&&a.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let C=Cz(y.costs),_=Oz(x);_>0&&C>_&&a.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let $=a.some(L=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(L.type)),M=a.some(L=>L.type==="overfit"),O="fail";return y.metrics.tradeCount>=i&&y.metrics.netPnlUsd>0&&y.metrics.profitFactor>1&&y.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&A>=.6&&!(_>0&&C>_)&&!M&&!a.some(L=>L.type==="severe_oos_collapse"||L.type==="invalid_windowing")?O="pass_live_eligible":!$&&y.metrics.tradeCount>0&&b.metrics.tradeCount>0&&Number.isFinite(y.metrics.netPnlUsd)?(O="pass_paper_only",y.metrics.tradeCount<i&&a.push({type:"undersampled",message:"holdout trades below minTrades"})):M&&y.metrics.tradeCount>0&&b.metrics.netPnlUsd>0?O="fail":y.metrics.tradeCount>0&&b.metrics.tradeCount>0&&!$?O="pass_paper_only":O="fail",y.metrics.netPnlUsd<0&&(O=O==="pass_live_eligible"?"fail":O==="pass_paper_only"?"pass_paper_only":"fail",O="fail"),RO({status:O,strategy:s,sHash:c,barsHash:l,split:S,train:b,holdout:y,walkForward:T,flags:a})}function RO({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c}){let l={status:e,strategyHash:n,compilerHash:ao,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c};return l.id=$O(l),ly(oo(JSON.parse(JSON.stringify(l))))}var Nz,dy=z(()=>{so();io();yd();Nz=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Hs(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Bz(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function my(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>my(n,`${t}[${r}]`));return}if(Hs(e))for(let[n,r]of Object.entries(e)){let o=Bz(n);if($z.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);my(r,`${t}.${n}`)}}function py(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function MO({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(my({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Hs(e))throw new Error("handoff: strategy required");if(!Hs(t))throw new Error("handoff: evidence required");if(!Hs(n))throw new Error("handoff: shadow required");if(!Hs(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=ct(e,{nowMs:o}),s=lt(a);if(BO(t,{maxDailyLossPct:a.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.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 r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!py(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!py(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!py(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:js,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return R(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var $z,UO=z(()=>{so();dy();io();ee();$z=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function ki(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Si(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function zs(e){if(Array.isArray(e))for(let t of e)zs(t);else if(e&&typeof e=="object")for(let t of Object.values(e))zs(t);return Object.freeze(e)}function Uz(e){let t=Mz[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function Fz(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Si(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Si(Number(o.t),`candles[${r}].t`);if(Si(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:ki(o.o,`candles[${r}].o`),h:ki(o.h,`candles[${r}].h`),l:ki(o.l,`candles[${r}].l`),c:ki(o.c,`candles[${r}].c`),v:ki(o.v,`candles[${r}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${r}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${r}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,s)}return zs([...n.values()].sort((r,o)=>r.t-o.t))}function Dz(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Si(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:ki(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function qz({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),a=!1;for(let s=0;s<16&&i<=n;s++){let c=await el({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){a=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!a)throw new Error("strategy history exceeds the bounded funding history limit");return Dz(o,n)}function Hz(e,t,n){let r=0,o=null;return e.map(i=>{let a=i.t+n,s=0;for(;r<t.length&&t[r].time<a;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(s+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:s}:{...i,fundingRate:o,fundingPaymentRate:s}})}async function FO(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=Uz(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Si(e.endTime,"endTime"),a=e.count==null?1500:e.count;if(!Number.isInteger(a)||a<20||a>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,i-a*o):Si(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Ao({coin:n,interval:r,startTime:s,endTime:i},t),qz({coin:n,startTime:s,endTime:i},t)]),u=Fz(c,{endTime:i}),d=zs(Hz(u,l,o));return zs({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var Mz,DO=z(()=>{ft();Mz=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 Vz(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 n of Object.keys(e))zz.has(n)||t.push({path:`market.${n}`,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"||!jz.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 Wz(e={}){let t=await Zc(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var jz,zz,qO,HO=z(()=>{ft();UO();DO();jz=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),zz=new Set(["coin","interval"]);qO=Object.freeze({id:"hyperliquid",validateMarket:Vz,fetchBars:FO,listMarkets:Wz,prepareIntent(e){return MO(e)}})});function Kz(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 Gz.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 fy(e){return typeof e!="string"?null:Yz.get(e)??null}function hy(e){let t=fy(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Gz,jO,Yz,Rre,gy=z(()=>{HO();Gz=Object.freeze(["id","validateMarket","prepareIntent"]);jO=[qO].map(Kz),Yz=new Map(jO.map(e=>[e.id,e])),Rre=Object.freeze([...jO])});import{createHash as Jz}from"node:crypto";function Ut(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Oe(e){return typeof e=="number"&&Number.isFinite(e)}function XO(e){return Number.isInteger(e)&&e>0}function vy(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)vy(t);return Object.freeze(e)}for(let t of Object.keys(e))vy(e[t]);return Object.freeze(e)}function ky(e){if(Array.isArray(e))return e.map(ky);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=ky(e[n]);return t}return e}function B(e,t,n){e.push({path:t,message:n})}function br(e,t,n,r){for(let o of Object.keys(e))t.has(o)||B(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function tR(e,t,n,r){if(!Oe(e)||!Oe(t)||!Oe(n)||!Oe(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function xy(e,t,n,r){if(Ut(e)){if(br(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return B(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return B(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!Ut(o)||![o.value,o.min,o.max,o.step].every(XO)?(B(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return XO(e)?e:(B(r,t,"must be a positive integer or {param}"),null)}function QO(e,t,n,r){return Ut(e)?(br(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(B(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(B(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Oe(e)?e:(B(r,t,"must be a finite number or {param}"),null)}function bd(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 iV(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let a of bd(i))if(e.has(a)&&n(a))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function aV(e,t){if(!Ut(e))return B(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>KO)return B(t,"parameters",`too many parameters (max ${KO})`),null;let r={};for(let o of n){if(!ZO.test(o)){B(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!Ut(i)){B(t,a,"must be a plain object");continue}br(i,VO,a,t);for(let d of VO)d in i||B(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Oe(c)||B(t,`${a}.min`,"must be a finite number"),Oe(l)||B(t,`${a}.max`,"must be a finite number"),(!Oe(u)||u<=0)&&B(t,`${a}.step`,"must be a positive finite number"),Oe(s)||B(t,`${a}.value`,"must be a finite number"),Oe(c)&&Oe(l)&&c>l&&B(t,`${a}.min`,"min must be <= max"),Oe(s)&&Oe(c)&&Oe(l)&&Oe(u)&&u>0&&(tR(s,c,l,u)||B(t,`${a}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:s,min:c,max:l,step:u}}return r}function sV(e,t,n,r){let o=`nodes.${t}`;if(!Ut(e))return B(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!GO[e.type])return B(r,`${o}.type`,"unknown or missing node type"),br(e,oV,o,r),null;switch(br(e,GO[e.type],o,r),(typeof e.id!="string"||!eR.test(e.id))&&B(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Xz.has(e.field))&&B(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=QO(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Qz.has(e.indicator))&&B(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,a={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=xy(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string"):a.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))B(r,`${o}.period`,"required field is missing");else{let s=xy(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}if(i==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))B(r,`${o}.${s}`,"required field is missing");else{let c=xy(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?nV.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be line|signal|histogram"):B(r,`${o}.output`,"required field is missing"),"period"in e&&B(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&B(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))B(r,`${o}.stdDev`,"required field is missing");else{let s=QO(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?B(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?rV.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be upper|middle|lower"):B(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&B(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&B(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!Zz.has(e.op))&&B(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${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"||!eV.has(e.op))&&B(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return B(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let a=0;a<e.inputs.length;a++){let s=e.inputs[a];typeof s!="string"||!s?B(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&B(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&B(r,`${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"||!tV.has(e.direction))&&B(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${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 cV(e,t,n){if(!Ut(e))return B(t,"risk","must be a plain object"),null;br(e,WO,"risk",t);for(let p of WO)(!(p in e)||e[p]==null)&&B(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Oe(o)||o<=0||o>50?B(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Oe(i)||i<=0?B(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Oe(a)||a<=0||a>100?B(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Oe(s)||s<=0||s>100?B(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Oe(c)||c<=0||c>1e3?B(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?B(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Oe(u)||u<=0||u>100?B(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?B(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&B(t,"risk.expiresAt","must be strictly greater than nowMs"):B(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function Sy(e,t={}){let n=[];if(!Ut(e))return B(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};br(e,zO,"",n);for(let d of zO)(!(d in e)||e[d]==null)&&B(n,d,"required field is missing");e.version!==yy&&B(n,"version",`must be ${yy}`),(typeof e.id!="string"||!ZO.test(e.id))&&B(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>JO)&&B(n,"name",`must be a non-empty string max ${JO}`);let r=fy(e.venue);r||B(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)Ut(e.market)||B(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))B(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)B(n,p.path,p.message)}let i=aV(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))B(n,"nodes","must be an array");else if(e.nodes.length>YO)B(n,"nodes",`too many nodes (max ${YO})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=sV(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&eR.test(p.id)&&(s.has(p.id)?B(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):s.set(p.id,p)),a.push(p))}for(let d=0;d<a.length;d++){let p=a[d],m=`nodes.${d}`;for(let f of bd(p))s.has(f)||B(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of bd(p)){let h=s.get(f);h&&by.has(h.type)&&B(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of bd(p)){let h=s.get(f);h&&!by.has(h.type)&&B(n,m,`node ref "${f}" must be boolean`)}}iV(s)&&B(n,"nodes","graph contains a cycle")}let c=null;if(!Ut(e.rules))B(n,"rules","must be a plain object");else{br(e.rules,wy,"rules",n);for(let d of wy)d in e.rules||B(n,`rules.${d}`,"required field is missing");c={};for(let d of wy){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){B(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){B(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);by.has(m.type)||B(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=cV(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=vy({version:yy,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:a,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function ct(e,t={}){let n=Sy(e,t);if(!n.ok)throw new Ei(n.errors);return n.strategy}function lV(e){let t=ct(e);return JSON.stringify(ky(t))}function vi(e){let t=lV(e);return Jz("sha256").update(t,"utf8").digest("hex")}function Vs(e,t){if(!Ut(e))throw new Ei([{path:"",message:"strategy must be a plain object"}]);if(!Ut(t))throw new Ei([{path:"overrides",message:"must be a plain object"}]);let n=ct(e),r={};for(let[i,a]of Object.entries(n.parameters))r[i]={value:a.value,min:a.min,max:a.max,step:a.step};let o=[];for(let[i,a]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){B(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Oe(a)){B(o,i,"override must be a finite number");continue}if(!tR(a,s.min,s.max,s.step)){B(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new Ei(o);return ct({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let a={...i};return Array.isArray(i.inputs)&&(a.inputs=[...i.inputs]),a}),rules:{...n.rules},risk:{...n.risk}})}var yy,ZO,eR,Xz,Qz,Zz,eV,tV,nV,rV,by,zO,VO,wy,WO,oV,GO,KO,YO,JO,Ei,io=z(()=>{gy();yy=1,ZO=/^[a-z0-9][a-z0-9._-]{0,63}$/,eR=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Xz=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),Qz=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Zz=new Set(["gt","gte","lt","lte","eq"]),eV=new Set(["and","or","not"]),tV=new Set(["above","below"]),nV=new Set(["line","signal","histogram"]),rV=new Set(["upper","middle","lower"]),by=new Set(["compare","logic","cross"]),zO=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),VO=new Set(["value","min","max","step"]),wy=new Set(["entryLong","entryShort","exitLong","exitShort"]),WO=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),oV=new Set(["id","type"]),GO={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"])},KO=16,YO=128,JO=100,Ei=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function Ws(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function wr(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function uV(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function rR(e,t){Ws(e),wr(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function wd(e,t){Ws(e),wr(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let a=0;a<t;a++)r+=e[a];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let a=t;a<e.length;a++)o=i*e[a]+(1-i)*o,n[a]=o;return n}function oR(e,t){Ws(e),wr(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let s=1;s<=t;s++){let c=e[s]-e[s-1];c>=0?r+=c:o-=c}let i=r/t,a=o/t;n[t]=nR(i,a);for(let s=t+1;s<e.length;s++){let c=e[s]-e[s-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,a=(a*(t-1)+u)/t,n[s]=nR(i,a)}return n}function nR(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function iR(e,t={}){Ws(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(wr(n),wr(r),wr(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=wd(e,n),a=wd(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function aR(e,t={}){Ws(e);let n=t.period,r=t.stdDev;if(wr(n),typeof r!="number"||!Number.isFinite(r)||r<=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),a=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:a};let s=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(s+=u,c+=u*u,l>=n){let d=e[l-n];s-=d,c-=d*d}if(l>=n-1){let d=s/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,a[l]=d-r*m}}return{upper:i,middle:o,lower:a}}function sR(e,t){uV(e),wr(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let a=0;a<e.length;a++){let s=e[a];if(a===0)r[a]=s.h-s.l;else{let c=e[a-1].c;r[a]=Math.max(s.h-s.l,Math.abs(s.h-c),Math.abs(s.l-c))}}let o=0;for(let a=0;a<t;a++)o+=r[a];let i=o/t;n[t-1]=i;for(let a=t;a<e.length;a++)i=(i*(t-1)+r[a])/t,n[a]=i;return n}var cR=z(()=>{});import{createHash as dV}from"node:crypto";var Ey,pV,mV,fV,lR,uR=z(()=>{Ey=3,pV="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",mV="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",fV="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",lR=dV("sha256").update(JSON.stringify({version:Ey,compilerSourceHash:pV,indicatorsSourceHash:mV,schemaSourceHash:fV})).digest("hex")});function Tt(e){return typeof e=="number"&&Number.isFinite(e)}function yV(e){let t=new Map(e.map(s=>[s.id,s])),n=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},r=new Map,o=new Map;for(let s of e)r.set(s.id,0),o.set(s.id,[]);for(let s of e)for(let c of n(s))t.has(c)&&(o.get(c).push(s.id),r.set(s.id,r.get(s.id)+1));let i=[];for(let[s,c]of r)c===0&&i.push(s);let a=[];for(;i.length;){let s=i.shift();a.push(s);for(let c of o.get(s))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(a.length!==e.length)throw new Error("strategy graph is cyclic");return a}function Ii(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function bV(e,t,n){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 r=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:a,o:s,h:c,l,c:u,v:d}=i;if(!Tt(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Tt(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>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(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==gV[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Tt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Tt(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}for(let p of["premium","oiDelta"])if(p in i&&i[p]!=null&&!Tt(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!Tt(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function co(e,t,n,r,o,i){if(i.has(e))return i.get(e);let a=t.get(e),s;switch(a.type){case"input":{let c=hV[a.field];s=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];s[l]=u===void 0?null:u}break}case"constant":{let c=Ii(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?Ii(a.period,n):void 0;if(a.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}s=sR(d,c);break}let u=co(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Tt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=rR(u,c);else if(a.indicator==="ema")s=wd(u,c);else if(a.indicator==="rsi")s=oR(u,c);else if(a.indicator==="macd")s=iR(u,{fastPeriod:Ii(a.fastPeriod,n),slowPeriod:Ii(a.slowPeriod,n),signalPeriod:Ii(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=aR(u,{period:c,stdDev:Ii(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=co(a.left,t,n,r,o,i),l=co(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Tt(d)||!Tt(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>co(l,t,n,r,o,i));s=new Array(o+1);for(let l=0;l<=o;l++)if(a.op==="not"){let u=c[0][l];s[l]=u===!0?!1:u===!1}else if(a.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}s[l]=u}else if(a.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}s[l]=u}else s[l]=!1;break}case"cross":{let c=co(a.left,t,n,r,o,i),l=co(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Tt(d)||!Tt(p)||!Tt(m)||!Tt(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function lt(e,t={}){let n=ct(e);t&&Object.keys(t).length&&(n=Vs(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(yV(n.nodes)),i=n.parameters,a=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])a.add(m);let s=Object.freeze([...a].sort()),c=vi(n);function l(m,f){let h={};for(let w of o){let x=m.get(w);h[w]=x[f]}let g=w=>w!=null&&h[w]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){bV(m,f,n.market.interval);let h=new Map;for(let g of o)co(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,w)=>Object.freeze(l(h,w))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:js,compilerHash:ao,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}var js,ao,hV,gV,so=z(()=>{io();cR();uR();js=Ey,ao=lR,hV=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),gV=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 wV}from"node:crypto";function vV(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ln(e){return typeof e=="number"&&Number.isFinite(e)}function Iy(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Iy(t);return Object.freeze(e)}for(let t of Object.keys(e))Iy(e[t]);return Object.freeze(e)}function xd(e){if(Array.isArray(e))return e.map(xd);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=xd(e[n]);return t}return e}function Ay(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((n,r)=>Ay(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))Ay(r,`${t}.${n}`)}}function pR(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:a,l:s,c,v:l}=r;if(!ln(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c],["v",l]])if(!ln(d))throw new TypeError(`bars[${n}].${u} must be a finite number`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${u} price must be positive`);if(l<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(a<Math.max(i,c,s))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(s>Math.min(i,c,a))throw new TypeError(`bars[${n}] 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 r&&r.fundingRate!=null&&!ln(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!ln(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!ln(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function qs(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&pR(e),wV("sha256").update(JSON.stringify(xd(e)),"utf8").digest("hex")}function kV(e){if(e==null&&(e={}),!vV(e))throw new TypeError("options must be a plain object");let t={...xV},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!ln(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!ln(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!ln(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}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 vd(e){return e/1e4}function SV(e,t,n){let r=vd(n);return t==="long"?e*(1+r):e*(1-r)}function EV(e,t,n){let r=vd(n);return t==="long"?e*(1-r):e*(1+r)}function dR(e,t,n){let r=Math.abs(e)*vd(t),o=Math.abs(e)*vd(n);return{taker:r,builder:o,total:r+o}}function IV(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function AV(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function _V(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function PV(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function TV(e,t,n){return t==="long"?e.l<=n:e.h>=n}function NV(e,t,n){return t==="long"?e.h>=n:e.l<=n}function CV(e,t,n){return t==="long"?e.l<=n:e.h>=n}function Gs(e,t){for(let n of e.requiredSeries)if(OV.includes(n)&&!t.every(r=>ln(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function RV(e){if(e.length<3)return 0;let t=[];for(let a=1;a<e.length;a++){let s=e[a-1].equity,c=e[a].equity;s>0&&t.push((c-s)/s)}if(t.length<2)return 0;let n=0;for(let a of t)n+=a;let r=n/t.length,o=0;for(let a of t)o+=(a-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function LV(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function yr(e,t,n={}){let r=kV(n);pR(t);let o=qs(t);r.nowMs!==void 0&&ct(e,{nowMs:r.nowMs});let i=lt(e);if(Gs(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let a=i.strategy.risk,s=i.evaluateAll(t),c=r.latencyBars,l=r.slippageBps,u=r.takerFeeBps,d=r.builderFeeBps,p=r.initialEquityUsd,m=0,f=0,h=0,g=0,w=0,x=[],b=[],y=[],S=[],E=[],v=null,k=0,A=null,T=p,C=!1,_=0,$=0,M=[],O=new Array(t.length).fill(0);function F(U){M.push(U)}function L(U){let ae=t[U].v*(r.maxVolumeParticipationPct/100);return Math.max(0,ae-O[U])}function D(U){if(!v)return p;let ae=v.side==="long"?(U-v.entryPrice)*v.qty:(v.entryPrice-U)*v.qty;return p+ae}function Q(U,ae,G){let Ae=G.o,de=IV(p,a);if(!(de>0)||!(Ae>0))return;let _e=SV(Ae,ae,l),xe=de/_e,$e=L(U),Pi=_e*$e;if(xe>$e){y.push({kind:"entry",barIndex:U,time:G.t,side:ae,requestedNotionalUsd:de,maxFillNotionalUsd:Pi,reason:"volume_participation"});return}O[U]+=xe;let Qt=Math.abs(_e-Ae)*xe,pn=dR(de,u,d);p-=pn.total,m+=pn.taker,f+=pn.builder,g+=Qt,w+=de,v={lifecycleEpoch:++$,side:ae,entryBarIndex:U,entryReferencePrice:Ae,entryPrice:_e,qty:xe,notionalUsd:de,stop:AV(_e,ae,a.stopLossPct),take:_V(_e,ae,a.takeProfitPct),liq:PV(_e,ae,a.maxLeverage,u+d),entryFees:pn.taker,entryBuilderFees:pn.builder,entrySlippageUsd:Qt,fundingAccrued:0}}function Y(U,ae,G,Ae){if(!v)return!1;let de=v.side,_e=ae,xe=_e;G!=="liquidation"&&Ae&&(xe=EV(_e,de,l));let $e=v.qty,Pi=$e*xe;if(G!=="liquidation"){let jy=L(U),qR=xe*jy;if($e>jy)return y.push({kind:"exit",barIndex:U,time:t[U].t,side:de,requestedNotionalUsd:Pi,maxFillNotionalUsd:qR,reason:"volume_participation",triggerReason:G}),!1;O[U]+=$e}let Qt=dR(Pi,u,d),pn=G==="liquidation"?0:Math.abs(xe-_e)*$e,Ti,Pd;de==="long"?(Ti=(_e-v.entryReferencePrice)*$e,Pd=(xe-v.entryPrice)*$e):(Ti=(v.entryReferencePrice-_e)*$e,Pd=(v.entryPrice-xe)*$e),p+=Pd,p-=Qt.total,m+=Qt.taker,f+=Qt.builder,g+=pn,w+=Pi;let DR={side:de,entryBarIndex:v.entryBarIndex,entryTime:t[v.entryBarIndex].t,entryPrice:v.entryPrice,exitBarIndex:U,exitTime:t[U].t,exitPrice:xe,exitReason:G,qty:$e,notionalUsd:v.notionalUsd,grossPnlUsd:Ti,feesUsd:v.entryFees+Qt.taker,builderFeesUsd:v.entryBuilderFees+Qt.builder,fundingUsd:v.fundingAccrued,slippageUsd:v.entrySlippageUsd+pn,netPnlUsd:Ti-(v.entryFees+Qt.taker+v.entryBuilderFees+Qt.builder)-v.fundingAccrued-(v.entrySlippageUsd+pn)};return x.push(DR),G==="liquidation"&&b.push({barIndex:U,time:t[U].t,side:de,price:xe,tradeIndex:x.length-1}),v=null,$+=1,_=U+1+(a.cooldownBars||0),!0}function Le(U,ae,G,Ae){let de=U+1;if(de>=t.length)return;M.some(xe=>xe.kind==="exit"&&xe.side===ae&&xe.fillBar===de&&xe.epoch===Ae)||F({kind:"exit",side:ae,signalBar:U,fillBar:de,reason:G,epoch:Ae})}function bt(U){let ae=M.filter(G=>G.fillBar===U);for(let G=M.length-1;G>=0;G--)M[G].fillBar===U&&M.splice(G,1);ae.sort((G,Ae)=>{let de=_e=>_e.kind==="exit"?0:1;return de(G)-de(Ae)});for(let G of ae)if(G.kind==="exit"){if(!v||v.side!==G.side||v.lifecycleEpoch!==G.epoch)continue;let Ae=G.reason||"rule";Y(U,t[U].o,Ae,!0)||Le(U,G.side,Ae,G.epoch)}else if(G.kind==="entry"){if(v||G.epoch!==$||U<_)continue;Q(U,G.side,t[U])}}function H(U){if(!v)return;let ae=t[U],G=ae.fundingPaymentRate;if(G==null||!ln(G)||G===0)return;let Ae=Math.abs(v.qty*ae.c),de=G*Ae;v.side==="long"?(p-=de,v.fundingAccrued+=de,h+=de):(p+=de,v.fundingAccrued-=de,h-=de)}function j(U){if(!v)return;let ae=t[U].o;(v.side==="long"?ae<=v.liq:ae>=v.liq)&&Y(U,ae,"liquidation",!1)}function ne(U){if(!v)return;let ae=t[U],G=v.side,Ae=CV(ae,G,v.liq),de=TV(ae,G,v.stop),_e=NV(ae,G,v.take),xe=$e=>G==="long"?Math.min($e,ae.o):Math.max($e,ae.o);if(Ae){Y(U,xe(v.liq),"liquidation",!1);return}if(de&&_e){Y(U,xe(v.stop),"stop_loss",!0)||Le(U,G,"stop_loss",v.lifecycleEpoch);return}if(de){Y(U,xe(v.stop),"stop_loss",!0)||Le(U,G,"stop_loss",v.lifecycleEpoch);return}_e&&(Y(U,v.take,"take_profit",!0)||Le(U,G,"take_profit",v.lifecycleEpoch))}for(let U=0;U<t.length;U++){let ae=Math.floor(t[U].t/864e5);ae!==A&&(A=ae,T=D(t[U].o),C=!1),j(U),bt(U),ne(U),H(U),!C&&D(t[U].c)<=T*(1-a.maxDailyLossPct/100)&&(C=!0,S.push({type:"daily_loss_limit",barIndex:U,time:t[U].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let G=s[U].signals,Ae=U+c;if(v)(v.side==="long"&&G.exitLong===!0||v.side==="short"&&G.exitShort===!0)&&Ae<t.length&&(M.some($e=>$e.kind==="exit"&&$e.side===v.side&&$e.fillBar===Ae&&$e.epoch===v.lifecycleEpoch)||F({kind:"exit",side:v.side,signalBar:U,fillBar:Ae,reason:"rule",epoch:v.lifecycleEpoch}));else{let _e=G.entryLong===!0,xe=G.entryShort===!0;_e&&xe?S.push({type:"conflicting_entry_signals",barIndex:U,time:t[U].t,message:"conflicting entry signals; no position opened"}):!C&&(_e||xe)&&Ae<t.length&&U>=_&&F({kind:"entry",side:_e?"long":"short",signalBar:U,fillBar:Ae,epoch:$})}let de=p;v&&(k+=1,de=D(t[U].c)),E.push({barIndex:U,time:t[U].t,equity:de,positionSide:v?v.side:null})}let be=null;if(v){let U=t.length-1;if(Y(U,t[U].c,"end_of_data",!0))E[U]={barIndex:U,time:t[U].t,equity:p,positionSide:null};else{let G=D(t[U].c);be={side:v.side,entryBarIndex:v.entryBarIndex,entryTime:t[v.entryBarIndex].t,entryPrice:v.entryPrice,qty:v.qty,notionalUsd:v.notionalUsd,markPrice:t[U].c,markedEquityUsd:G},S.push({type:"open_position_at_end",barIndex:U,time:t[U].t,message:"end-of-data exit missed; position remains open and marked"})}}let Xe=(v?D(t[t.length-1].c):p)-r.initialEquityUsd,Z=Xe/r.initialEquityUsd*100,Ie=0,Ft=0,lo=0;for(let U of x)U.netPnlUsd>0?(Ie+=1,Ft+=U.netPnlUsd):U.netPnlUsd<0&&(lo+=-U.netPnlUsd);let dn=x.length,vr=dn===0?0:Ie/dn,_d=0;lo>0?_d=Ft/lo:Ft>0&&(_d=1e12);let UR={netPnlUsd:Xe,netPnlPct:Z,maxDrawdownPct:LV(E),winRate:vr,profitFactor:_d,tradeCount:dn,sharpe:RV(E),turnoverUsd:w,exposurePct:k/t.length*100},FR={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},Hy={barsHash:o,strategyHash:i.strategyHash,compilerHash:ao,compilerVersion:js,config:FR,trades:x,equityCurve:E,metrics:UR,costs:{feesUsd:m,builderFeesUsd:f,fundingUsd:h,slippageUsd:g},liquidations:b,missedFills:y,openPositionAtEnd:be,flags:S};return Ay(Hy),Iy(xd(Hy))}var xV,OV,yd=z(()=>{so();io();xV=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});OV=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as $V}from"node:crypto";function jV(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function _y(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)_y(t);return Object.freeze(e)}for(let t of Object.keys(e))_y(e[t]);return Object.freeze(e)}function zV(e){return String(e).trim().replace(/\s+/g," ")}function VV(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function WV(e){for(let n of MV)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function GV(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 n=t[1].toLowerCase();return BV.has(n)?n:null}function KV(e){let t={...FV},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[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 a=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return a&&(t.maxNotionalUsd=Number(a[1])),t}function YV(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(n=>(e.match(n)??[]).length>1)}function JV(e){let t=$V("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function XV(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 n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function QV(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function ZV(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function eW(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:n}}function tW(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?(t[3]==="%"&&(n=n/100),{kind:"premium",op:t[1].toLowerCase(),threshold:n}):null}function nW(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:n}:null}function rW(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<-1||n>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:n}}function oW(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?n=n.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?n=n.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?n=n.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?n=n.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\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"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function mR(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 iW({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){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:s.direction,left:"emaLeft",right:"emaRight"}],l={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?l.entryLong="cross":l.entryShort="cross",s.reverse){let u=s.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?l.exitLong="crossRev":l.exitShort="crossRev"}return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:mR(s.fast),ema_right_period:mR(s.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function aW({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:s.period},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function sW({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function cW({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function uW({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let l=[{id:"sig_input",type:"input",field:lW[s.kind]},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function fR(e,t={}){if(typeof e!="string")throw new Je("prompt must be a string");if(e.length>1e3)throw new Je("prompt length must be <= 1000");if(!jV(t))throw new Je("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Je("options.nowMs is required integer epoch ms");let n=t.nowMs,r=HV;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Je("expiresInMs must be an integer");if(r=t.expiresInMs,r<DV||r>qV)throw new Je("expiresInMs must be between 1h and 30d")}if(UV.test(e))throw new Je(`prompt appears to contain secrets and is rejected. ${Ai}`);let o=zV(e);if(!o)throw new Je(`empty prompt. ${Ai}`);if(YV(o))throw new Je(`duplicate interval or risk clause. ${Ai}`);let i=VV(o),a=WV(o),s=GV(o);if(!i||!a||!s)throw new Je(`could not parse side/coin/interval. ${Ai}`);let c=KV(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new Je("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new Je("position size out of range");let l=n+r,u=JV(o),d=`Draft ${a} ${i}`.slice(0,100),p=XV(o),m=QV(o),f=ZV(o),h=eW(o),g=tW(o),w=nW(o),x=rW(o),b=[p,m,f,h,g,w,x].filter(Boolean);if(b.length!==1)throw new Je(`unsupported or ambiguous prompt. ${Ai}`);if(!oW(o,b[0]))throw new Je(`unsupported or ambiguous prompt. ${Ai}`);let y,S=b[0],E={side:i,coin:a,interval:s,risk:c,expiresAt:l,id:u,name:d,spec:S};S.kind==="ema_cross"?y=iW(E):S.kind==="rsi"?y=aW(E):S.kind==="open_interest"?y=cW(E):S.kind==="funding"?y=sW(E):y=uW(E);let v=Sy(y,{nowMs:n});if(!v.ok)throw new Je(`draft failed validation: ${v.errors.map(k=>k.message).join("; ")}`);return _y(ct(y,{nowMs:n}))}var Je,BV,MV,UV,Ai,FV,DV,qV,HV,lW,hR=z(()=>{io();Je=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},BV=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),MV=new Set(["BTC","ETH","SOL","HYPE"]),UV=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Ai="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",FV=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),DV=36e5,qV=30*864e5,HV=864e5;lW=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as dW}from"node:crypto";function bR(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 wR(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ty(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ty(t);return Object.freeze(e)}for(let t of Object.keys(e))Ty(e[t]);return Object.freeze(e)}function Ks(e){if(Array.isArray(e))return e.map(Ks);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Ks(e[n]);return t}return e}function kd(e){return JSON.stringify(Ks(e))}function pW(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let s=0;s<=i;s++){let c=t+s*r;if(c>n+1e-9)break;let l=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));l<t-1e-9||l>n+1e-9||o.push(l)}if(o.length===0)return[];let a=o[o.length-1];if(Math.abs(a-n)>1e-9){let s=(n-t)/r;Math.abs(s-Math.round(s))<=1e-9&&o.push(n)}return o}function mW(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let a of n)for(let s of o)i.push({...a,[r]:s});n=i}return n.sort((r,o)=>{let i=kd(r),a=kd(o);return i<a?-1:i>a?1:0}),n}function Py(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let a=kd(n),s=kd(o);return a<s}function xR(e,t,n={}){if(!wR(n))throw new TypeError("options must be a plain object");for(let y of Object.keys(n))if(bR(y))throw new TypeError(`options must not include holdout/test/oos key "${y}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let y of Object.keys(n))if(!r.has(y))throw new TypeError(`unknown option "${y}"`);let o=64;if("maxTrials"in n){let y=n.maxTrials;if(!Number.isInteger(y)||y<1||y>gR)throw new TypeError(`maxTrials must be an integer 1..${gR}`);o=y}let i=n.objective??"netPnlUsd";if(!yR.has(i))throw new TypeError(`objective must be one of ${[...yR].join("|")}`);let a=n.backtestOptions??{};if(!wR(a))throw new TypeError("backtestOptions must be a plain object");for(let y of Object.keys(a))if(bR(y))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${y}"`);let s=ct(e),c=Object.keys(s.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let l={},u=1;for(let y of c){let S=pW(s.parameters[y]);if(S.length===0)throw new Error(`parameter "${y}" produces an empty grid`);l[y]=S,u*=S.length}let d=mW(c,l);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),m=[],f=null,h=null;for(let y of p){let S=Vs(s,y),E=yr(S,t,a);h==null&&(h=E.config);let v={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},k={parameters:{...y},metrics:v};m.push(k),(!f||Py(i,v,y,f.metrics,f.parameters))&&(f=k)}m.sort((y,S)=>Py(i,y.metrics,y.parameters,S.metrics,S.parameters)?-1:Py(i,S.metrics,S.parameters,y.metrics,y.parameters)?1:0);let g={...f.parameters},w=Vs(s,g),x={strategyHash:vi(s),compilerHash:ao,trainBarsHash:qs(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:m.length,candidates:m,bestParameters:g,bestStrategy:w},b={id:dW("sha256").update(JSON.stringify(Ks(x)),"utf8").digest("hex"),...x};return Ty(Ks(JSON.parse(JSON.stringify(b))))}var gR,yR,vR=z(()=>{so();io();yd();gR=256,yR=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Rn from"node:fs";import Sd from"node:path";function Ed(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function un(e){return e==null?e:JSON.parse(JSON.stringify(e))}function hW(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function _i(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>_i(n,`${t}[${r}]`));return}if(Ed(e))for(let[n,r]of Object.entries(e)){let o=hW(n);if(fW.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);_i(r,`${t}.${n}`)}}function gW(e){if(typeof e!="string"||!e||!Sd.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function kR(e){let t;try{t=Rn.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}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 yW(){return{version:Cy,runners:[]}}function SR(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Ed(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==Cy)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return _i(n,Sd.basename(t)),{version:Cy,runners:n.runners.map(r=>un(r))}}function ER(e,t){_i(t,"store");let n=Sd.dirname(e);Rn.mkdirSync(n,{recursive:!0,mode:448});let r=Sd.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
146
146
  `;try{Rn.writeFileSync(r,o,{mode:384,flag:"wx"}),Rn.renameSync(r,e);try{Rn.chmodSync(e,384)}catch{}}catch(i){try{Rn.unlinkSync(r)}catch{}throw i}}function IR(e={}){let t=e.path;if(gW(t),kR(t),Rn.existsSync(t)?SR(Rn.readFileSync(t,"utf8"),t):ER(t,yW()),Ny.has(t))return Ny.get(t);let n=!1,r=[];function o(){if(n)return;let f=r.shift();if(f){n=!0;try{let h=f.fn();n=!1,f.resolve(h),o()}catch(h){n=!1,f.reject(h),o()}}}function i(f){if(!n&&r.length===0){n=!0;try{return f()}finally{n=!1,queueMicrotask(o)}}return new Promise((h,g)=>{r.push({fn:f,resolve:h,reject:g}),queueMicrotask(o)})}function a(){return kR(t),SR(Rn.readFileSync(t,"utf8"),t)}function s(f){ER(t,f)}function c(f){if(!Ed(f)||typeof f.id!="string"||!f.id)throw new Error("shadow-store: create requires record with string id");_i(f,"record");let h=a();if(h.runners.some(w=>w.id===f.id))throw new Error(`shadow-store: runner id already exists: ${f.id}`);let g=un(f);return h.runners.push(g),s(h),un(g)}function l(f){let h=a().runners.find(g=>g.id===f);return h?un(h):null}function u(){return a().runners.map(f=>un(f))}function d(f,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let g=a(),w=g.runners.findIndex(y=>y.id===f);if(w<0)throw new Error(`shadow-store: runner not found: ${f}`);let x=un(g.runners[w]),b=h(x);if(!Ed(b)||b.id!==f)throw new Error("shadow-store: updater must return record with same id");return _i(b,"record"),g.runners[w]=un(b),s(g),un(g.runners[w])}function p(f){let h=a(),g=h.runners.findIndex(x=>x.id===f);if(g<0)throw new Error(`shadow-store: runner not found: ${f}`);let w=un(h.runners[g]);return w.status!=="stopped"&&(w.status="stopped",h.runners[g]=w,s(h)),un(h.runners[g])}let m={create(f){return i(()=>c(f))},get(f){return l(f)},list(){return u()},update(f,h){return i(()=>d(f,h))},stop(f){return i(()=>p(f))}};return Ny.set(t,m),m}var Cy,fW,Ny,AR=z(()=>{Cy=1,fW=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Ny=new Map});import{createHash as Ly}from"node:crypto";function Oy(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ry(e){return Array.isArray(e)?e.map(Ry):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Ry(e[t])])):e}function PR(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Ly("sha256").update(JSON.stringify(Ry(e))).digest("hex")}function bW(e,t,n,r,o){return Ly("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function wW(e,t,n,r){return Ly("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function xW(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function _R(e){return e==="entryLong"||e==="entryShort"}function $y({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=IR({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=lt(c),d=l==null?null:String(l),p=n.list().filter(w=>w.status==="running"&&w.strategyHash===u.strategyHash&&w.compilerHash===u.compilerHash&&w.evidenceId===d).sort((w,x)=>w.createdAt-x.createdAt||w.id.localeCompare(x.id))[0];if(p)return Oy(p);let m=t(),f=wW(m,u.strategyHash,u.compilerHash,d),h=n.get(f);if(h)return Oy(h);let g={id:f,strategy:Oy(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:m,updatedAt:m,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(g)}function o(c){return n.get(c)}function i(){return n.list()}function a(c){return n.stop(c)}function s(c,l,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(l))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(l.length===0)return d;let m=lt(d.strategy).evaluateAll(l),f=new Map;for(let _=0;_<l.length;_++)f.set(l[_].t,_);let h=d.cursor,g=[];for(let _=0;_<l.length;_++){let $=l[_].t;(h==null||$>h)&&g.push(_)}if(g.length===0)return d;let w=new Map(d.intendedOrders.map(_=>[_.id,_])),x=new Set(d.fills.map(_=>_.orderId)),b=new Map(d.missedFills.map(_=>[_.orderId,_])),y=(_,$)=>`${_}|${$}`,S=new Map(d.markouts.map(_=>[y(_.orderId,_.horizon),_])),E=d.position?{...d.position}:null,v=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,k=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function A({action:_,signalBarT:$,signalIndex:M}){let O=xW(_),F=bW(d.id,d.strategyHash,$,O,_);if(w.has(F))return w.get(F);let L=M+1,D=L<l.length,Q={id:F,action:_,type:_,side:O,signalBarT:$,fillBarT:D?l[L].t:null,status:D?"open":"missed"};return w.set(F,Q),d.intendedOrders.push(Q),Q}function T(_,$,M){if(x.has(_.id))return;let O={orderId:_.id,action:_R(_.action)?"entry":"exit",side:_.side,price:$.o,barT:$.t,signalBarT:_.signalBarT,barIndex:M};if(d.fills.push(O),x.add(_.id),_.status="filled",_.fillBarT=$.t,b.has(_.id)&&(b.delete(_.id),d.missedFills=d.missedFills.filter(F=>F.orderId!==_.id)),_R(_.action)){E={side:_.action==="entryLong"?"long":"short",entryOrderId:_.id,entryBarT:$.t,entryPrice:$.o,entryBarIndex:M};for(let F of u){let L=y(_.id,F);if(S.has(L))continue;let D={orderId:_.id,horizon:F,entryBarT:$.t,entryPrice:$.o,side:E.side,status:"pending",close:null,barT:null};S.set(L,D),d.markouts.push(D)}}else E=null,v=Number(d.strategy?.risk?.cooldownBars)||0,k=$.t}function C(_){if(x.has(_.id)||b.has(_.id))return;let $={orderId:_.id,action:_.action,side:_.side,signalBarT:_.signalBarT,status:"missed"};b.set(_.id,$),d.missedFills.push($),_.status="missed"}for(let _ of d.intendedOrders){if(_.status==="filled"||x.has(_.id))continue;let $=f.get(_.signalBarT);if($==null)continue;let M=$+1;M<l.length&&(h==null||l[M].t>h)&&T(_,l[M],M)}for(let _ of g){let $=l[_],M=m[_].signals,O=E,F=D=>{if(E||v>0&&(k==null||$.t>=k))return;let Y=A({action:D,signalBarT:$.t,signalIndex:_}),Le=_+1;Le<l.length?T(Y,l[Le],Le):C(Y)},L=D=>{if(!E||E.side==="long"&&D!=="exitLong"||E.side==="short"&&D!=="exitShort")return;let Q=A({action:D,signalBarT:$.t,signalIndex:_}),Y=_+1;Y<l.length?T(Q,l[Y],Y):C(Q)};O?(M.exitLong&&L("exitLong"),M.exitShort&&L("exitShort")):M.entryLong&&M.entryShort||(M.entryLong&&F("entryLong"),M.entryShort&&F("entryShort")),v>0&&k!=null&&$.t>=k&&(v-=1,v===0&&(k=null)),d.cursor=$.t,d.lastProcessedBarIndex=_}for(let _ of d.markouts){if(_.status!=="pending")continue;let $=d.fills.find(F=>F.orderId===_.orderId&&F.action==="entry");if(!$)continue;let M=f.get($.barT);if(M==null)continue;let O=M+_.horizon;if(O<l.length){_.close=l[O].c,_.barT=l[O].t,_.status="filled";let F=_.entryPrice;_.markout=_.side==="long"?(_.close-F)/F:(F-_.close)/F}}return d.position=E,d.cooldownBarsRemaining=v,d.cooldownStartT=k,d.updatedAt=t(),d})}return{start:r,step:s,list:i,get:o,stop:a}}var TR=z(()=>{so();AR()});var OR={};ut(OR,{runStrategyOperation:()=>PW});import vW from"node:os";import kW from"node:path";function Ys(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function EW(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function My(e){if(Array.isArray(e)){for(let t of e)My(t);return}if(Ys(e))for(let[t,n]of Object.entries(e)){if(SW.some(r=>EW(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);My(n)}}function IW(e){if(!Ys(e))throw new TypeError("strategy input must be a plain object");return My(e),e}function AW(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 n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function By(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=hy(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let a=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let s=Array.isArray(a)?a:a?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function Uy(e,t){let n=e.backtestOptions??{};if(!Ys(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function NR(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!Ys(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:Uy(e,r)}}function CR(){return kW.join(vW.homedir(),".oracle","strategy-shadow.json")}function _W(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 PW(e,t={},n={}){n.signal?.throwIfAborted?.();let r=IW(t),o=AW(r,n);if(e==="draft")return{strategy:fR(r.prompt,{nowMs:o})};if(e==="validate"){let i=lt(r.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=lt(r.strategy),a=await By(i.strategy,r,n,o);Gs(i,a);let s=uy(NR(r,i.strategy,a,o));return e==="evidence"?s:{backtest:yr(i.strategy,a,Uy(r,o)),evidence:s}}if(e==="optimize"){let i=lt(r.strategy),a=await By(i.strategy,r,n,o);Gs(i,a);let s=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(s!=null&&c!=null&&s!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let l=s??c??.7;if(typeof l!="number"||l<=0||l>=1)throw new TypeError("trainFraction must be in (0,1)");let u=a.slice(0,Math.floor(a.length*l)),d=r.options??{};if(!Ys(d))throw new TypeError("options must be a plain object");let p=xR(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:Uy(r,o)}),m=p.bestStrategy;return{strategy:m,optimization:p,evidence:uy(NR(r,m,a,o,{trainFraction:l}))}}if(e==="shadow"){let i=$y({storePath:n.storePath??CR(),clock:()=>o}),a=r.action;if(a==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(a==="list")return await i.list();if(a==="get")return await i.get(r.id);if(a==="stop")return await i.stop(r.id);if(a==="step"){let s=await i.get(r.id);if(!s)throw new Error(`shadow runner not found: ${r.id}`);let c=await By(s.strategy,r,n,o);return Gs(lt(s.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${a}`)}if(e==="prepare"){let i=lt(r.strategy),a=hy(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await $y({storePath:n.storePath??CR(),clock:()=>o}).get(r.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!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let l=r.caps??_W(i.strategy,o);return a.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:PR(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:l,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var SW,RR=z(()=>{yd();so();dy();hR();vR();TR();gy();SW=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import{createServer as TW}from"node:http";import{randomBytes as NW}from"node:crypto";import{verifyMessage as CW}from"ethers";Er();fo();ve();import{Interface as Bw,getAddress as jn,id as w$,isAddress as x$}from"ethers";ve();var W2="08c379a0",G2="4e487b71",K2=Object.freeze({1:"assertion failed",17:"arithmetic overflow or underflow",18:"division or modulo by zero",33:"invalid enum value",34:"invalid storage byte array encoding",49:"pop() on an empty array",50:"array index out of bounds",65:"out of memory",81:"call to an uninitialized function pointer"});function Y2(e){if(!e||e==="0x")return{kind:"empty",reason:"reverted without a reason (often a require with no message, or out of gas)"};let t=String(e).slice(2),n=t.slice(0,8);if(n===W2)try{let r=parseInt(t.slice(72,136),16),o=t.slice(136,136+r*2);return{kind:"revert",reason:Buffer.from(o,"hex").toString("utf8"),selector:`0x${n}`}}catch{return{kind:"revert",reason:"Error(string) payload could not be decoded",selector:`0x${n}`}}if(n===G2){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:K2[r]||`panic code 0x${r.toString(16)}`,selector:`0x${n}`}}return{kind:"custom",reason:`custom error ${`0x${n}`} (decoding needs the contract ABI)`,selector:`0x${n}`}}function J2(e){let t=[e?.data,e?.error?.data,e?.data?.data,e?.cause?.data,e?.body?.error?.data];for(let o of t){if(typeof o=="string"&&o.startsWith("0x")&&o.length>2)return o;if(typeof o?.data=="string"&&o.data.startsWith("0x")&&o.data.length>2)return o.data}let r=String(e?.message||"").match(/0x[0-9a-fA-F]{72,}/);return r?r[0]:null}function X2(e,t){if(t)return!0;let n=String(e?.message||"").toLowerCase();return!!/execution reverted|revert|invalid opcode|out of gas|stack underflow|insufficient funds for/.test(n)}function Q2(e={}){let t={};return e.from&&(t.from=String(e.from).toLowerCase()),e.to&&(t.to=String(e.to).toLowerCase()),e.data&&e.data!=="0x"&&(t.data=e.data),e.value!=null&&String(e.value)!=="0"&&(t.value=`0x${BigInt(e.value).toString(16)}`),t}async function Ir(e={},t={}){let n=t.rpcCall||W,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=Q2(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=J2(f);if(!X2(f,!!h))return{status:"unavailable",willRevert:null,chainId:r,error:f?.message||"simulation unavailable",notes:["could not reach the node; this is NOT evidence the transaction would fail"]};c=!0,l=Y2(h),h||(l.reason="execution reverted (node did not return a reason payload)",l.kind="revert-no-data")}if(c)return{status:"ok",willRevert:!0,chainId:r,revert:l,summary:`would REVERT: ${l.reason}`,notes:["simulated against current chain state; signing this now would burn gas and fail"]};let u=null,d=null;if(e.estimateGas!==!1)try{let f=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(f);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,a.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){a.push(`gas estimation failed: ${f?.message||"unknown"}`)}a.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,m=s===p;return m&&a.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:m,chainId:r,returnData:s,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:m?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:a}}async function Fb(e={}){let t=Date.now();try{let n=await Ir({chainId:1,tx:{to:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",data:`0x70a08231${"0".repeat(64)}`},estimateGas:!1},e),r=n.status==="ok";return{provider:"evm-simulate",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"eth_call reachable":n.error||"probe failed"}}catch(n){return{provider:"evm-simulate",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}om();ee();var Hn=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),h$=100,im={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:a}=await Promise.resolve().then(()=>(Er(),ip)),s=await a({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Hn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.amountOut??null,minOut:s.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(fo(),yp)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u);return{artifactKind:Hn.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:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:a}=await Promise.resolve().then(()=>(Vi(),Cp)),s=await a({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Hn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.estimate?.toAmount??null,minOut:s.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:a},s)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Wi(),$p)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:a,userAddress:o,side:"SELL"},s);return{artifactKind:Hn.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval??null,amountOut:l.quote?.priceRoute?.destAmount??null,minOut:l.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:a}=await Promise.resolve().then(()=>(Gi(),Up)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Hn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.buyAmount??null,minOut:s.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:a}=await Promise.resolve().then(()=>(Xi(),Xp)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Hn.TYPED_DATA_ORDER,typedData:s.typedData,requiresApproval:{token:t,spender:s.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:s.settlement,amountOut:s.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};var g$=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),y$=/^0x[0-9a-fA-F]{40}$/,b$=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);async function Fc(e,t={}){if(b$.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:n}=e;if(!n)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(!y$.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(g$.has(n.toLowerCase()))throw new Error(`taker "${n}" 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 r=await rm(e,t);if(!r.best){let g=r.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let a=im[o];if(!a){let g=r.routes.find(w=>im[w.source]&&w.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:r,winner:o}}let s;try{s=await a(e,t)}catch(g){let w=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",x=[String(g?.message||g),w].filter(Boolean).join(" :: "),b=/allowance/i.test(x),y=!b&&/not enough|insufficient|balance/i.test(x),S,E;b?(E="approval-required-first",S=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${x}`):y?(E="taker-not-funded",S=`${o} refused to build the transaction: ${x}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(E="provider-error",S=`${o} prepare failed: ${x}`);let v=r.routes.find(k=>im[k.source]&&k.source!==o);return{ok:!1,reason:S,failureKind:E,...v?{alternative:v.source}:{},comparison:r}}let c=e.driftToleranceBps??h$,l=null,u=null;if(s.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),w=BigInt(s.amountOut);g>0n&&(l=Number((w-g)*10000n/g),l<-c&&(u=`route moved ${(l/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=r.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),m=r.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,w)=>Math.max(g,w.liquidityUsd??0),0)||null,f=i.liquidityUsd??null,h=f!=null&&m>0?Math.round(f/m*100):null;return R({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:f,maxUsd:m,sharePct:h},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...s,unsigned:!0,signedBy:"user-wallet",destination:s.artifactKind===Hn.TRANSACTION?s.transaction?.to??null:s.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...s.artifactKind===Hn.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:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.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"})}ee();var xo=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),bn=new Bw(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),v$=new Bw(["function withdraw(uint256 wad)"]),Rw=(1n<<128n)-1n,k$=/^0x[0-9a-fA-F]{64}$/,S$=w$("Transfer(address,address,uint256)").toLowerCase();function vo(e){let t=Number(e),n=xo[t];if(!n)throw new Error(`lp-exit: unsupported chain ${e}; supported: ${Object.keys(xo).join(", ")}`);return{chainId:t,...n}}function Pr(e,t){if(!x$(String(e||"")))throw new Error(`lp-exit: ${t} must be a valid address`);return jn(String(e))}function Mw(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`lp-exit: ${t} must be an unsigned integer`)}if(n<=0n)throw new Error(`lp-exit: ${t} must be positive`);return n}function E$(e){let t=Number(e??50);if(!Number.isInteger(t)||t<1||t>100)throw new Error("lp-exit: slippageBps must be an integer from 1 to 100");return t}function I$(e,t){let n=Number(e.deadlineSeconds??300);if(!Number.isInteger(n)||n<30||n>600)throw new Error("lp-exit: deadlineSeconds must be an integer from 30 to 600");let r=Number(t.nowSeconds??Math.floor(Date.now()/1e3));if(!Number.isInteger(r)||r<=0)throw new Error("lp-exit: invalid current time");return r+n}function Lw(e,t){if(e===0n)return 0n;let n=e*BigInt(1e4-t)/10000n;return n>0n?n:1n}function Uw(e,t){if(!k$.test(String(e||"")))throw new Error(`lp-exit: valid ${t} transaction hash required`);return String(e).toLowerCase()}async function am(e,t,n,r){return(r.rpcCall||W)(e,t,n,r)}function _r(e,t){return String(e||"").toLowerCase()===String(t||"").toLowerCase()}async function Fw(e,t,n,r,o){let[i,a]=await Promise.all([am(e,"eth_getTransactionReceipt",[t],r),am(e,"eth_getTransactionByHash",[t],r)]),s=i?.status===1||i?.status==="1"||i?.status==="0x1";if(!i||!a||!s||!_r(i.transactionHash,t)||!_r(a.hash,t))throw new Error(`lp-exit: live confirmed successful ${o} receipt and transaction required`);if(!_r(a.from,n.from)||!_r(a.to,n.to)||!_r(a.input??a.data,n.data))throw new Error(`lp-exit: ${o} transaction does not match prepared from/to/input`);return{receipt:i,txHash:t}}function Dw(e,t,n){let r=new Set(t.map(a=>a.toLowerCase())),o=`0x${n.slice(2).toLowerCase().padStart(64,"0")}`,i=new Map(t.map(a=>[a.toLowerCase(),0n]));for(let a of e.logs||[]){let s=String(a.address||"").toLowerCase();if(!r.has(s)||!_r(a.topics?.[0],S$)||!_r(a.topics?.[2],o))continue;let c;try{c=BigInt(a.data)}catch{throw new Error("lp-exit: malformed ERC20 Transfer amount in receipt")}c>0n&&i.set(s,i.get(s)+c)}return i}function qw(e,t,n){if(Qd(e,{providers:["lp-exit"],label:"lp-exit continuation",nowMs:n.nowMs??(n.nowSeconds==null?Date.now():Number(n.nowSeconds)*1e3)}),e.phase!==t)throw new Error(`lp-exit: ${t} prepared artifact required`)}async function $w(e,t,n,r){return(r.rpcCall||W)(e,"eth_call",[{to:t,data:n},"latest"],r)}async function sm(e,t,n,r){let i=await(n.simulateTransaction||Ir)({chainId:e,tx:t},n);if(i?.status==="unavailable"||i?.willRevert==null)throw new Error(`lp-exit: ${r} simulation unavailable; refusing unsigned transaction`);if(i?.status!=="ok"||i?.willRevert){let a=i?.revert?.reason||i?.error||"would revert";throw new Error(`lp-exit: ${r} simulation failed: ${a}`)}return i}async function cm(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=vo(e.chainId),r=Pr(e.owner,"owner"),o=Mw(e.tokenId,"tokenId"),i=jn(n.positionManager),[a,s]=await Promise.all([$w(n.chainId,i,bn.encodeFunctionData("ownerOf",[o]),t),$w(n.chainId,i,bn.encodeFunctionData("positions",[o]),t)]),c=jn(bn.decodeFunctionResult("ownerOf",a)[0]);if(c!==r)throw new Error(`lp-exit: owner mismatch; position ${o} belongs to ${c}`);let l=bn.decodeFunctionResult("positions",s);return Object.freeze({chainId:n.chainId,chain:n.name,venue:n.venue,positionManager:i,registrySource:n.source,tokenId:o.toString(),owner:r,operator:jn(l[1]),token0:jn(l[2]),token1:jn(l[3]),fee:Number(l[4]),tickLower:Number(l[5]),tickUpper:Number(l[6]),liquidity:l[7].toString(),tokensOwed0:l[10].toString(),tokensOwed1:l[11].toString()})}async function Hw(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=await cm(e,t),r=vo(n.chainId),o=BigInt(n.liquidity);if(o<=0n)throw new Error("lp-exit: position has no active liquidity; collect-only exits are not yet supported");let i=e.liquidity==null?o:Mw(e.liquidity,"liquidity");if(i>o)throw new Error("lp-exit: requested liquidity exceeds live position liquidity");let a=E$(e.slippageBps),s=I$(e,t),c=bn.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:0n,amount1Min:0n,deadline:s}]),l={chainId:n.chainId,from:n.owner,to:n.positionManager,data:c,value:"0"},u=await sm(n.chainId,l,t,"amount probe");if(!u.returnData||u.returnData==="0x")throw new Error("lp-exit: amount probe simulation returned no amounts");let d,p;try{[d,p]=bn.decodeFunctionResult("decreaseLiquidity",u.returnData)}catch{throw new Error("lp-exit: amount probe simulation returned malformed amounts")}if(d===0n&&p===0n)throw new Error("lp-exit: live removal currently returns zero assets");let m=Lw(d,a),f=Lw(p,a),h=bn.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:m,amount1Min:f,deadline:s}]),g=bn.encodeFunctionData("collect",[{tokenId:BigInt(n.tokenId),recipient:n.owner,amount0Max:Rw,amount1Max:Rw}]),w=bn.encodeFunctionData("multicall",[[h,g]]),x={chainId:n.chainId,from:n.owner,to:n.positionManager,data:w,value:"0"},b=await sm(n.chainId,x,t,"guarded remove-and-collect");return R({provider:"lp-exit",phase:"remove-and-collect",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:s,position:n,liquidity:i.toString(),slippageBps:a,expected:{amount0:d.toString(),amount1:p.toString()},minimums:{amount0Min:m.toString(),amount1Min:f.toString()},transaction:x,simulation:b,continuation:{operation:"prepareLpSettlementToWrappedNative",requiresConfirmedReceipt:!0,requiresTransferProofFor:[n.token0,n.token1],note:"Re-read the mined transaction and receipt; only token Transfer logs to the bound owner are settlement evidence."}},{provider:"lp-exit",kind:"univ3-remove-and-collect",nowMs:t.nowMs??Number(t.nowSeconds??Math.floor(Date.now()/1e3))*1e3,expiresAtMs:s*1e3})}async function jw(e={},t={}){let n=e.removalPrepared;qw(n,"remove-and-collect",t);let r=vo(n.chainId),o=Pr(n.position?.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared removal");if(e.owner!=null&&Pr(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared removal");let i=Uw(e.removalTxHash,"removal"),{receipt:a}=await Fw(r.chainId,i,n.transaction,t,"removal"),s=jn(r.wrappedNative),c=[Pr(n.position.token0,"prepared token0"),Pr(n.position.token1,"prepared token1")],l=Dw(a,c,o),u=c.map(f=>({token:f,amount:l.get(f.toLowerCase()).toString()})).filter(f=>BigInt(f.amount)>0n);if(u.length===0)throw new Error("lp-exit: removal receipt proves no token transfers to prepared owner");let d=0n,p=[],m=t.prepareBestRoute||Fc;for(let f of u){if(f.token===s){d+=BigInt(f.amount);continue}let h=await m({chainId:r.chainId,tokenIn:f.token,tokenOut:s,amountIn:f.amount,taker:o,maxSlippageBps:e.maxSlippageBps??100},t);if(!h?.ok||!h?.transaction)throw new Error(`lp-exit: no preparable net route for ${f.token}: ${h?.reason||"unknown failure"}`);p.push(Object.freeze({tokenIn:f.token,amountIn:f.amount,...h}))}return R({provider:"lp-exit",phase:"settle-to-wrapped-native",chainId:r.chainId,owner:o,removalTxHash:i,removalPrepareHash:n.prepareHash,position:n.position,wrappedNative:s,alreadyWrappedNative:d.toString(),routes:Object.freeze(p),warnings:Object.freeze(p.filter(f=>f.comparison?.rankedOn==="gross").map(f=>`${f.tokenIn} route ranked on gross output; gas was not accounted for`)),continuation:Object.freeze({operation:"prepareLpUnwrapNative",requiresConfirmedSwapReceipts:p.length>0,requiresWrappedNativeTransferProof:p.length>0,note:"Match every mined swap to its prepared route and derive wrapped-native received from Transfer logs before unwrapping."})},{provider:"lp-exit",kind:"univ3-settlement-routes",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function zw(e={},t={}){let n=e.settlementPrepared;qw(n,"settle-to-wrapped-native",t);let r=vo(n.chainId),o=Pr(n.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared settlement");if(e.owner!=null&&Pr(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared settlement");let i=e.swapTxHashes??[];if(!Array.isArray(i)||i.length!==n.routes.length)throw new Error("lp-exit: one live swap transaction hash required for every prepared route");let a=jn(r.wrappedNative),s=BigInt(n.alreadyWrappedNative),c=[];for(let p=0;p<n.routes.length;p+=1){let m=Uw(i[p],"swap"),{receipt:f}=await Fw(r.chainId,m,n.routes[p].transaction,t,`swap ${p+1}`),h=Dw(f,[a],o).get(a.toLowerCase());if(h<=0n)throw new Error(`lp-exit: swap ${p+1} receipt proves no wrapped-native transfer to owner`);s+=h,c.push(m)}if(s<=0n)throw new Error("lp-exit: no receipt-proven wrapped-native amount to unwrap");let l=v$.encodeFunctionData("withdraw",[s]),u={chainId:r.chainId,from:o,to:a,data:l,value:"0"},d=await sm(r.chainId,u,t,"wrapped-native unwrap");return R({provider:"lp-exit",phase:"unwrap-native",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r.chainId,owner:o,swapTxHashes:c,settlementPrepareHash:n.prepareHash,nativeAmount:s.toString(),transaction:u,simulation:d,note:"UNSIGNED. The user's wallet must sign; Oracle does not broadcast or custody the native asset."},{provider:"lp-exit",kind:"wrapped-native-withdraw",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function Vw(){return Object.entries(xo).map(([e,t])=>({chainId:Number(e),...t}))}async function Ww(e={},t={}){let n=e.chainId==null?Object.keys(xo).map(o=>vo(o)):[vo(e.chainId)],r=await Promise.all(n.map(async o=>{try{let i=await am(o.chainId,"eth_getCode",[o.positionManager,"latest"],t),a=typeof i=="string"&&/^0x[0-9a-fA-F]+$/.test(i)&&i!=="0x";return{chainId:o.chainId,positionManager:o.positionManager,ok:a}}catch(i){return{chainId:o.chainId,positionManager:o.positionManager,ok:!1,error:String(i?.message||i)}}}));return{ok:r.every(o=>o.ok),chains:r}}q();qt();ee();import{readFileSync as N$,existsSync as C$}from"node:fs";import{getAddress as O$,Interface as qc,TypedDataEncoder as pm,parseUnits as R$}from"ethers";var _$=/^(0|[1-9][0-9]*)$/,lm=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Tr(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!_$.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function P$(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function T$(e={}){return e.maxFeePerGas!=null?Tr(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Tr(e.gasPrice,"gasPrice"):null}function um(e={}){try{let t=P$(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Tr(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=Tr(n.gasLimit??n.gas,"gasLimit"),s=T$(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=Tr(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Tr(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Tr(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=a*s;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&s>c?{ok:!1,status:"BLOCK",reason:`unit fee ${s} exceeds cap ${c}`,chainId:t,unitFeeWei:s.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:s.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function Gw(e={}){let t=um(e);if(!t.ok)throw new lm(t);return t}var L$="https://api.opensea.io/api/v2",$$="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",B$=new qc([`function ${$$}`]),Dc=new qc(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","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"]),M$=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),U$=new Set(M$),Zw=new Set(["solana","flow"]),Zi="0x0000000000000000000000000000000000000000";function F$(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!C$(e))return"";try{for(let t of N$(e,"utf8").split(`
147
- `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function wn(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||F$()}function ex(e={}){return Fe({provider:"opensea",defaultUrl:L$,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Nr(e={}){return ex(e).baseUrl}function Cr(e={}){return Me({accept:"application/json"},{"x-api-key":wn(e)},ex(e).trusted)}function tx(e){let t=String(e||"ethereum").trim().toLowerCase();if(!U$.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ie(e,t="address"){try{return O$(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function nx(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Zw.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ie(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function D$(e,t){let n=String(e??"").trim();if(!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(n)||Number(n)<=0)throw new Error(`opensea: ${t} must be a positive plain decimal`);return n}function q$(e,t){let n=Number(e);if(!Number.isSafeInteger(n)||n<=0)throw new Error(`opensea: ${t} must be a positive integer`);return n}function Kw(e,t){let n=String(e||"").trim(),r=Date.parse(n);if(!n||!Number.isFinite(r))throw new Error(`opensea: ${t} must be an ISO 8601 timestamp`);return{text:new Date(r).toISOString(),ms:r}}function H$(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function rx(e={}){if(!wn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await ta("boredapeyachtclub",e);return{ok:!0,configured:!0,name:t.name||t.collection}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function ta(e,t={}){if(!e)throw new Error("collection slug required");if(!wn(t))throw new Error("OPENSEA_API_KEY required");return I(`${Nr(t)}/collections/${encodeURIComponent(e)}`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ox(e,t={}){let n=await ta(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function na(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=tx(e.chain),r=nx(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${Nr(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await I(l.toString(),{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(H$(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Hc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=nx(e.address||e.owner),r=await I(`${Nr(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var jc=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function ra(e){let t=String(e||"").trim().toLowerCase(),n=jc[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function pt(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function j$(e,t="transaction value"){let n;try{let r=String(e??"0").trim();if(!/^(?:0x[0-9a-fA-F]+|\d+)$/.test(r))throw new Error("invalid");n=BigInt(r)}catch{throw new Error(`opensea: ${t} must be a non-negative integer quantity`)}if(n<0n)throw new Error(`opensea: ${t} must be non-negative`);return{amount:n,hex:`0x${n.toString(16)}`}}function ea(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function ix(e,t=10){let n=Number(e??1);if(!Number.isSafeInteger(n)||n<1||n>t)throw new Error(`opensea: quantity must be an integer from 1 through ${t}`);return n}function ax(e,t,n="listing expiry"){let r=e==null?"":String(e).trim(),o;if(/^\d+$/.test(r)){let i=Number(r);o=r.length<=10?i*1e3:i}else o=Date.parse(r);if(!r||!Number.isFinite(o))throw new Error(`opensea: ${n} missing or invalid`);if(o<=t)throw new Error(`opensea: ${n} is expired or stale`);return new Date(o).toISOString()}function z$(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function V$(e,t){let n=Number(e?.itemType);if(![0,1].includes(n))throw new Error(`opensea: ${t} is not a native or ERC20 payment item`);let r=ie(e?.token,t);if(n===0&&r!==Zi)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Zi)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function W$(e,t){let n=pt(e?.startAmount,`${t} startAmount`),r=pt(e?.endAmount??e?.startAmount,`${t} endAmount`);if(n!==r)throw new Error(`opensea: ${t} must be a fixed amount, not a decaying range`);return n}function dm(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(z$);if(!r.length){if(n)throw new Error(`opensea: ${t} contains no native or ERC20 payment item`);return{paymentToken:null,totalWei:0n,count:0}}let o=null,i=0n;for(let a of r){let s=V$(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=W$(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var G$=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});function vt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Yw(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(n))throw new Error(`opensea: ${t} must be a 32-byte hex value`);return n}function sx(e,t){return{itemType:Number(vt(e?.itemType,`${t} itemType`)),token:ie(e?.token,`${t} token`),identifierOrCriteria:vt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:vt(e?.startAmount,`${t} startAmount`),endAmount:vt(e?.endAmount,`${t} endAmount`)}}function K$(e,t){return{...sx(e,t),recipient:ie(e?.recipient,`${t} recipient`)}}function Y$(e,t){if(!e||typeof e!="object")throw new Error(`opensea: ${t} has no canonical Seaport protocol parameters`);let n=Array.isArray(e.offer)?e.offer:null,r=Array.isArray(e.consideration)?e.consideration:null;if(!n||!n.length)throw new Error(`opensea: ${t} canonical offer array is missing`);if(!r||!r.length)throw new Error(`opensea: ${t} canonical consideration array is missing`);return{offerer:ie(e.offerer,`${t} offerer`),zone:ie(e.zone,`${t} zone`),offer:n.map((o,i)=>sx(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>K$(o,`${t} consideration[${i}]`)),orderType:Number(vt(e.orderType,`${t} orderType`)),startTime:vt(e.startTime,`${t} startTime`),endTime:vt(e.endTime,`${t} endTime`),zoneHash:Yw(e.zoneHash,`${t} zoneHash`),salt:vt(e.salt,`${t} salt`),conduitKey:Yw(e.conduitKey,`${t} conduitKey`),counter:vt(e.counter,`${t} counter`)}}function cx(e,t,n){let r=String(e?.order_hash??e?.orderHash??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new Error(`opensea: invalid ${n} order hash`);let o=Y$(t,n);if(pm.hashStruct("OrderComponents",G$,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function lx(e,t){let n=Number(e?.itemType);if([4,5].includes(n))throw new Error(`opensea: ${t} is a criteria item, not a fixed token`);if(![2,3].includes(n))throw new Error(`opensea: ${t} must be an ERC-721 or ERC-1155 item`);let r=ie(e?.token,`${t} contract`),o=ea(e?.identifierOrCriteria),i=pt(e?.startAmount,`${t} startAmount`,{positive:!0}),a=pt(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function J$(e,t){let n=Array.isArray(e?.offer)?e.offer:[];if(n.some(o=>[4,5].includes(Number(o?.itemType))))throw new Error(`opensea: ${t} uses a criteria offer item, not a fixed token`);let r=n.filter(o=>[2,3].includes(Number(o?.itemType)));if(r.length!==1||n.length!==1)throw new Error(`opensea: ${t} must offer exactly one fixed ERC-721 or ERC-1155 item`);return lx(r[0],`${t} offer NFT`)}function X$(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=lx(o[0],`${n} consideration NFT`);if(i.tokenId!==t)throw new Error(`opensea: ${n} consideration token does not match the requested token`);return i}function Q$(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ie(e.contract,`${r} display contract`)!==t)throw new Error(`opensea: ${r} display asset contract disagrees with the canonical Seaport offer`);if(e.identifier!=null&&String(e.identifier).trim()!==""&&String(e.identifier).trim()!==n)throw new Error(`opensea: ${r} display asset token disagrees with the canonical Seaport offer`)}}function Z$(e){let t=String(e??"").trim();return/^\d+$/.test(t)?t.length<=10?Number(t):Math.floor(Number(t)/1e3):Math.floor(Date.parse(t)/1e3)}function ux(e,t,n,r){let o=vt(t?.startTime,`${r} startTime`),i=vt(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=ax(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&Z$(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function eB(e,t,n){if(!e||typeof e!="object")throw new Error("opensea: invalid best listing");let r=String(e.chain||"").trim().toLowerCase();if(r!==t.chain)throw new Error("opensea: OpenSea returned a listing for the wrong chain");if(jc[r]!==t.chainId)throw new Error("opensea: OpenSea listing chain id mismatch");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active listing");let i=e.protocol_data?.parameters,a=J$(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;Q$(e.asset,s,c,"listing");let l=pt(e.price?.current?.value,"listing price",{positive:!0}),u=cx(e,i,"listing"),d=dm(i?.consideration,"listing consideration");if(d.totalWei!==l)throw new Error("opensea: listing consideration total does not equal the quoted listing price");return{orderHash:u,chain:t.chain,chainId:t.chainId,protocolAddress:ie(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:ux(e,i,n,"listing"),counter:vt(i?.counter,"listing counter")}}async function mm(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=ra(e.chain);n.contract=e.contract?ie(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Number(e.limit??12);if(!Number.isSafeInteger(o)||o<1||o>50)throw new Error("opensea: listing limit must be 1 through 50");let i=new URL(`${Nr(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await I(i.toString(),{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.length)throw new Error("opensea: no active best listings returned");let c=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return{provider:"opensea-nft",source:"opensea-best-listings",chain:n.chain,chainId:n.chainId,slug:r,contract:n.contract,listings:s.map(l=>eB(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function zc(e={},t={}){let n=ea(e.tokenId),r=Math.min(Math.max(Number(e.maxPages??20)||20,1),25),o=e.next?String(e.next):null,i=new Set;for(let a=1;a<=r;a+=1){let s=await mm({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function tB(e,t,n,r){if(!e||typeof e!="object")throw new Error("opensea: invalid best offer");if(String(e.chain||"").trim().toLowerCase()!==t.chain)throw new Error("opensea: OpenSea returned an offer for the wrong chain");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active offer");let i=e.protocol_data?.parameters||{},s=X$(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=pt(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=dm(i.offer,"offer payment"),u=l.paymentToken;if(l.totalWei!==c)throw new Error("opensea: offer payment total does not equal the quoted gross offer");let d=dm(i.consideration,"offer fee",{required:!1});if(d.count&&d.paymentToken!==u)throw new Error("opensea: offer fee consideration uses a different token than the offer payment");if(d.totalWei>c)throw new Error("opensea: offer fee consideration exceeds the gross offer");let p=d.totalWei.toString(),m=(c-d.totalWei).toString();return{provider:"opensea-nft",source:"opensea-best-exact-offer",orderHash:cx(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ie(e.protocol_address,"offer protocol address"),contract:s,tokenId:n,grossOfferWei:c.toString(),sellerNetWei:m,feeWei:p,paymentToken:u,currency:String(e.price?.current?.currency||e.price?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??e.price?.decimals??18),expiry:ux(e,i,r,"offer"),counter:vt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Vc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=ra(e.chain);n.contract=e.contract?ie(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=ea(e.tokenId),i=await I(`${Nr(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return tB(a,n,o,s)}function nB(e){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after buyer, chain, contract, token, quantity, price cap, total cap, and expiry review")}function dx(e){if(!e||typeof e!="object")return!1;let t=String(e.action??e.type??e.method??"");return/approv|setapprovalforall|permit/i.test(t)?!0:Object.values(e).some(n=>n&&typeof n=="object"&&dx(n))}function px(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function mx(e){return!e||typeof e!="object"?!1:px(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&mx(t))}function fx(e,t=[],n=new Set){if(!e||typeof e!="object"||n.has(e))return t;n.add(e),e.transaction&&typeof e.transaction=="object"?t.push(e.transaction):e.tx&&typeof e.tx=="object"&&t.push(e.tx);for(let[r,o]of Object.entries(e))(r==="transaction"||r==="tx")&&o&&typeof o=="object"||o&&typeof o=="object"&&fx(o,t,n);return t}function Jw(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function hx(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(px(e))throw new Error("opensea: signed transaction material refused");if((e.from?ie(Jw(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ie(Jw(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=B$.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(c))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");c.endsWith(l.slice(2))||(c+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let d=j$(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Wc(e){return{from:e.from,to:e.to,data:e.data,value:e.value,chainId:e.chainId,...e.gasLimit==null?{}:{gasLimit:e.gasLimit},...e.maxFeePerGas==null?{}:{maxFeePerGas:e.maxFeePerGas},...e.maxPriorityFeePerGas==null?{}:{maxPriorityFeePerGas:e.maxPriorityFeePerGas},...e.worstCaseFeeWei==null?{}:{worstCaseFeeWei:e.worstCaseFeeWei}}}async function fm(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Ce(e,4,async c=>{let{chainId:l,...u}=Wc(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(ve(),tc)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(ve(),tc)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function rB(e,t){if(dx(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(mx(e))throw new Error("opensea: signed transaction material refused");let n=fx(e);if(!n.length&&e&&typeof e=="object"&&(e.to||e.target)&&n.push(e),!n.length)throw new Error("opensea: OpenSea returned no transaction action");return n.map(r=>hx(r,t))}function oB(e,t,n={}){return R({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function gx(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function yx(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function iB(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=ie(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Gc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");nB(e);let{chain:n,chainId:r}=ra(e.chain),o=ie(e.buyer||e.minter||e.address,"buyer"),i=ie(e.contract,"NFT contract"),a=ix(e.quantity),s=pt(e.priceWei,"priceWei"),c=pt(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=ax(e.expiry,l,"mint expiry");if(e.tokenId!=null)throw new Error("opensea: SeaDrop mint tokenId is unknown until the mined receipt and must not be caller supplied");let d=String(e.slug||"").trim();if(!d)throw new Error("opensea: collection slug required");let p=await ta(d,t),m=iB(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await I(`${Nr(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:Cr(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(g)?g:g?[g]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map(O=>ie(O,"SeaDrop mint target"))),b=rB(h,{buyer:o,chainId:r,targets:x});if(b.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,S,E=null,v;try{y=Dc.decodeFunctionData("mintPublic",b[0].data),S="public",v=Dc.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Dc.decodeFunctionData("mintAllowList",b[0].data),S="allowlist";let O=y[4],F=[...y[5]].map(String);if(F.length<1||F.length>64||F.some(Y=>!/^0x[0-9a-fA-F]{64}$/.test(Y)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let L=BigInt(O.startTime),D=BigInt(O.endTime),Q=BigInt(Math.floor(l/1e3));if(L>Q||D<=Q)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(O.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(O.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");v=Dc.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,F]),E={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:L.toString(),endTime:D.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:F}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let k=ie(y[0],"mint NFT contract"),A=ie(y[1],"mint fee recipient"),T=ie(y[2],"mint recipient");if(k!==m)throw new Error("opensea: mint calldata collection mismatch");if(T!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(v.toLowerCase()!==b[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=b.reduce((O,F)=>O+F.valueWei,0n);if(C!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let _=await fm(b,r,{...t,provider:e.provider||t.provider});if(_.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let $=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},M=Gw({chainId:r,tx:b[0],policy:$});return oB({action:"mint",mintType:S,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:b[0].to,feeRecipient:A,expiry:u,transactions:b.map(Wc),gasWar:M,..._},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+po,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function aB(e={}){let t=tx(e.chain);if(Zw.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Kw(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Kw(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:ie(e.contract,"NFT contract"),token_id:o,quantity:q$(e.quantity??1,"quantity"),price:{amount:D$(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ie(e.price?.currency??e.currency??Zi,"price currency")},start_time:n.text,end_time:r.text}}var ko={OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]},Xw=new qc(["function setApprovalForAll(address operator,bool approved)"]),sB=new qc(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);function Qw(e,t){return e?.[t]||(e?.action===t?e:null)}function cB(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(b=>Qw(b,"createListingsAction")).find(Boolean)||o.find(b=>/createListings/i.test(String(b?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=ie(c.verifyingContract,"listing protocol"),u=s.message;if(ie(u.offerer,"listing seller")!==t)throw new Error("opensea: listing seller mismatch");if(!Array.isArray(u.offer)||u.offer.length!==1)throw new Error("opensea: executable listing requires exactly one NFT offer");let d=u.offer[0];if(![2,3].includes(Number(d.itemType)))throw new Error("opensea: listing offer must be ERC721 or ERC1155");if(ie(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let b of u.consideration){if(Number(b.itemType)!==0||ie(b.token,"listing payment token")!==Zi)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(b.startAmount),S=BigInt(b.endAmount);if(y<=0n||y!==S)throw new Error("opensea: listing consideration must be fixed and positive");ie(b.recipient,"listing consideration recipient"),p+=y}let m=R$(n.price.amount,18);if(p!==m)throw new Error("opensea: listing price mismatch");let f=BigInt(Math.floor(Date.parse(n.start_time)/1e3)),h=BigInt(Math.floor(Date.parse(n.end_time)/1e3));if(BigInt(u.startTime)!==f||BigInt(u.endTime)!==h)throw new Error("opensea: listing time bounds mismatch");let g=pm.hashStruct("OrderComponents",ko,u),w=o.map(b=>Qw(b,"itemApprovalAction")).find(Boolean)||o.find(b=>/setApprovalForAll/i.test(String(b?.action||""))),x=null;if(w){let b=w.transaction||w.itemApprovalAction?.transaction,y=hx(b,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=Xw.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=ie(S[0],"listing approval operator");if(S[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Xw.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:ko,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Kc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=ie(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length!==1)throw new Error("opensea: executable listing preparation supports exactly one NFT per envelope");let o=r.map(aB);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=ie(e.taker,"taker"));let c=await I(`${Nr(t)}/listings/actions`,{method:"POST",headers:Cr(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=ra(o[0].chain),u=cB(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await fm(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return R({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,chainId:l,kind:"nft-list",action:"list",prepareReady:!0,executionReady:p.simulated===!0,signingReady:p.simulated===!0,broadcastReady:p.simulated===!0,requiresUserSignature:!0,requiresSeparateApproval:d.length>0,seller:n,contract:o[0].contract,tokenId:o[0].token_id,quantity:o[0].quantity,priceWei:u.priceWei.toString(),typedData:u.typedData,orderHash:u.orderHash,submission:{chain:o[0].chain,protocol:"seaport",protocolAddress:u.protocolAddress},transactions:d.map(Wc),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"Creator fees requested and bound into exact Seaport consideration recipients.":"Creator fees disabled by explicit request; every remaining consideration recipient is still bound.",...p})}async function bx(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=ra(e.chain),o=ie(e.seller||e.address||e.owner,"seller"),i=ie(e.protocolAddress,"reviewed Seaport protocol address"),a=ie(e.contract,"NFT contract"),s=ea(e.tokenId),c=ix(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[k,A]of Object.entries(ko)){let T=l.types?.[k];if(!Array.isArray(T)||T.length!==A.length||T.some((C,_)=>C?.name!==A[_].name||C?.type!==A[_].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(k=>k!=="EIP712Domain").sort().join(",")!==Object.keys(ko).sort().join(","))throw new Error("opensea: cancellation requires canonical Seaport types");let d=l.domain;if(d.name!=="Seaport"||d.version!=="1.6"||Number(d.chainId)!==r)throw new Error("opensea: cancellation domain mismatch");let p=ie(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ie(m.offerer,"listing seller")!==o)throw new Error("opensea: cancellation seller mismatch");if(!Array.isArray(m.offer)||m.offer.length!==1||!Array.isArray(m.consideration)||!m.consideration.length)throw new Error("opensea: cancellation requires one exact previously prepared listing order");if(Number(m.orderType)!==2)throw new Error("opensea: cancellation requires a FULL_RESTRICTED listing order");let f=m.offer[0];if(![2,3].includes(Number(f.itemType)))throw new Error("opensea: cancellation offer must be ERC721 or ERC1155");if(ie(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(ea(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=pt(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=pt(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let k of m.consideration){if(Number(k.itemType)!==0||ie(k.token,"cancellation payment token")!==Zi)throw new Error("opensea: cancellation requires native fixed-price consideration");let A=pt(k.startAmount,"cancellation consideration startAmount",{positive:!0}),T=pt(k.endAmount,"cancellation consideration endAmount",{positive:!0});if(A!==T)throw new Error("opensea: cancellation consideration must be fixed and positive");ie(k.recipient,"cancellation consideration recipient")}let w=pt(m.startTime,"cancellation startTime");if(pt(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let b=pm.hashStruct("OrderComponents",ko,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==b.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let S=sB.encodeFunctionData("cancel",[[m]]),E=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],v=await fm(E,r,{...t,provider:e.provider||t.provider});if(v.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return R({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:b,typedData:{domain:d,types:ko,primaryType:"OrderComponents",message:m},transactions:E.map(Wc),...v,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}Lr();var aa=new Map,yB=Object.keys(He).map(Number),bB=Object.keys(wt).map(Number),wB=Object.keys(xo).map(Number),Sm=Rr.map(e=>e.chainId),xB=[...new Set(Object.values(jc))],km=new Set,Px=!1;function Tx(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Tx(t);return Object.freeze(e)}function N(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Px&&km.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return aa.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),aa.get(t)}function Eo(e){return aa.get(e)||null}function Jc({venue:e,op:t}={}){let n=[...aa.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function vB(){km.clear();for(let[e,t]of aa)km.add(e),Tx(t);Px=!0}N({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});N({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});N({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});N({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});N({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});N({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});N({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});N({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});N({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});N({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});N({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});N({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});N({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});N({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])N({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});N({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});N({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Sm,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Rr.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});N({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});N({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});N({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});N({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});N({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});N({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + local-signer Solana swap handoff"});N({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});N({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});N({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});N({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});N({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});N({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});N({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});N({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});N({id:"uniswap-v3",venue:"dex",chainIds:yB,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});N({id:"lp-exit",venue:"dex",chainIds:wB,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});N({id:"lp-liquidity-ranker",venue:"dex",chainIds:Sm,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});N({id:"lp-destination-discovery",venue:"dex",chainIds:Sm,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});N({id:"uniswap-v4",venue:"dex",chainIds:bB,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});N({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});N({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});N({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});N({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});N({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});N({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});N({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});N({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});N({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});N({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});N({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});N({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});N({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});N({id:"opensea-nft",venue:"nft",chainIds:xB,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});N({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});N({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});N({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});N({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});N({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});N({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});N({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});N({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});N({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});N({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});N({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});N({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});N({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});N({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});N({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});N({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});N({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});N({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});N({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});N({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});N({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});N({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});N({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});N({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});N({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});N({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, and coin balances (0x1::coin::balance view with a CoinStore resource fallback). Read-only; the transaction submit door is never called."});N({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});N({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});N({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});N({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});N({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});N({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});N({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});N({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});N({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});N({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});N({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});N({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});N({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});N({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});N({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});N({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});N({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});N({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});N({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});N({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});N({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});N({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});N({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});N({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});N({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});N({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});N({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});N({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});N({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});N({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});N({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});N({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});N({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});N({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});N({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});N({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});N({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});N({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});N({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});N({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});N({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});N({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});N({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});N({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});N({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});N({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});N({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});vB();q();var NY=Object.freeze(["live","needs_key","deprecated","soft_fail","hard_down"]);function Xc(e={}){return e.execution==="unavailable"||!!e.deprecated}ft();ft();var AB=/^0x[0-9a-fA-F]{40}$/,ca="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Em(e,t){let n=String(e||"").trim();if(!AB.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Lx(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function $x(e={}){let t=Array.isArray(e.portfolio)?e.portfolio:[],n=t.find(([i])=>i==="day")?.[1]||null,r=Array.isArray(n?.accountValueHistory)?n.accountValueHistory:[],o=Array.isArray(n?.pnlHistory)?n.pnlHistory:[];return{name:e.name??null,vaultAddress:e.vaultAddress??e.address??null,leader:e.leader??null,description:e.description??null,tvl:e.tvl??r.at(-1)?.[1]??null,apr:e.apr??null,pnl:e.pnl??o.at(-1)?.[1]??null,isClosed:e.isClosed??null,allowDeposits:e.allowDeposits??null,maxDistributable:e.maxDistributable??null,followers:e.followers??null,portfolio:t}}function _B(e){return[...e].sort((t,n)=>(Lx(n.tvl)??-1)-(Lx(t.tvl)??-1))}function Im(e){return e.hlInfo||we}function Am(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function _m(e={},t={}){let n=await Im(t)({type:"vaultSummaries"},t),r=_B((Array.isArray(n)?n:[]).map($x));return Am({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function nl(e={},t={}){let r={type:"vaultDetails",vaultAddress:Em(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Em(e.user,"user"));let o=await Im(t)(r,t);return Am({provider:"hl-vaults",vault:$x(o||{}),raw:o})}async function Pm(e={},t={}){let n=Em(e.user||e.address,"user"),r=await Im(t)({type:"userVaultEquities",user:n},t),o=(Array.isArray(r)?r:[]).map(i=>({vaultAddress:i.vaultAddress??i.address??null,equity:i.equity??i.vaultEquity??null}));return Am({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Tm(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return nl({...e,vaultAddress:ca},t);if(n==="summaries")return _m(e,t);if(n==="details")return nl(e,t);if(n==="mine")return Pm(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Bx(e={}){try{let t=await Tm({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ca&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1,execution:"read-only",armed:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1,execution:"read-only",armed:!1}}}ve();import{AbiCoder as TB}from"ethers";var Nm=999;var Ge=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Cm=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),NB=TB.defaultAbiCoder();function la(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-precompiles: ${t} must be a 0x EVM address`);return n.toLowerCase()}function ua(e,t,n){let r=Number(e);if(!Number.isInteger(r)||r<0||r>=2**n)throw new Error(`hl-precompiles: ${t} must fit uint${n}`);return r}function $r(e,t){return e.length?NB.encode(e,t):"0x"}function xn(e,t=0){let r=String(e||"").replace(/^0x/i,"").slice(t*64,t*64+64);if(r.length!==64)throw new Error("hl-precompiles: malformed precompile result");return BigInt(`0x${r}`)}function CB(e,t=0){let n=xn(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function zn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Nm});let r=await W(Nm,"eth_call",[{to:e,data:t},"latest"],n);if(typeof r!="string"||!/^0x[0-9a-fA-F]*$/.test(r))throw new Error("hl-precompiles: eth_call did not return hex");return r}function Vn(e){return{provider:"hl-precompiles",chainId:Nm,...Cm,...e}}async function rl(e={}){let t=await zn(Ge.l1BlockNumber,"0x",e);return Vn({op:"l1BlockNumber",precompile:Ge.l1BlockNumber,l1BlockNumber:xn(t).toString(),raw:t})}async function Om(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.markPx,$r(["uint32"],[n]),t);return Vn({op:"markPx",precompile:Ge.markPx,index:n,markPx:xn(r).toString(),raw:r})}async function Rm(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.oraclePx,$r(["uint32"],[n]),t);return Vn({op:"oraclePx",precompile:Ge.oraclePx,index:n,oraclePx:xn(r).toString(),raw:r})}async function Lm(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.spotPx,$r(["uint32"],[n]),t);return Vn({op:"spotPx",precompile:Ge.spotPx,index:n,spotPx:xn(r).toString(),raw:r})}async function $m(e={},t={}){let n=la(e.user,"user"),r=ua(e.perp??e.assetId??0,"perp",16),o=await zn(Ge.position,$r(["address","uint16"],[n,r]),t);return Vn({op:"position",precompile:Ge.position,user:n,perp:r,szi:CB(o,0),raw:o})}async function Bm(e={},t={}){let n=la(e.user,"user"),r=ua(e.token??0,"token",64),o=await zn(Ge.spotBalance,$r(["address","uint64"],[n,r]),t);return Vn({op:"spotBalance",precompile:Ge.spotBalance,user:n,token:r,total:xn(o,0).toString(),hold:xn(o,1).toString(),raw:o})}async function Mm(e={},t={}){let n=la(e.user,"user"),r=la(e.vaultAddress??e.vault??ca,"vault"),o=await zn(Ge.vaultEquity,$r(["address","address"],[n,r]),t);return Vn({op:"vaultEquity",precompile:Ge.vaultEquity,user:n,vaultAddress:r,hlp:r===ca,equity:xn(o,0).toString(),raw:o})}async function Um(e={},t={}){let n=la(e.user,"user"),r=await zn(Ge.withdrawable,$r(["address"],[n]),t);return Vn({op:"withdrawable",precompile:Ge.withdrawable,user:n,withdrawable:xn(r).toString(),raw:r})}async function Mx(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return rl(t);if(n==="markPx")return Om(e,t);if(n==="oraclePx")return Rm(e,t);if(n==="spotPx")return Lm(e,t);if(n==="position")return $m(e,t);if(n==="spotBalance")return Bm(e,t);if(n==="vaultEquity"||n==="hlp")return Mm(e,t);if(n==="withdrawable")return Um(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Ux(e={}){try{let t=await rl(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Cm,l1BlockNumber:t.l1BlockNumber,precompiles:Ge}}catch(t){return{ok:!1,provider:"hl-precompiles",...Cm,error:String(t?.message||t).slice(0,160)}}}ft();ee();function Fx(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function il(e={},t,n){let r=String(t||""),o=Fx(e);if(o){let a=da(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=da(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function al(e={},t=[],n){let r=Fx(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(da(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&da(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(da(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Fm=Number.MAX_SAFE_INTEGER,ol=String(Fm);function da(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Fm?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>ol.length||t.length===ol.length&&t>ol||t===ol&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Fm?r:null}function tv(){return{ok:!0,provider:"hl-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated hl signer. Not automated."}}function kn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function nv(e){let t=kn(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function nM(e,t,n=4){let r=kn(e),o=kn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function rv(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},a=n[o]||{},s=String(i.name||"").trim(),c=kn(a.funding),l=kn(a.markPx??a.oraclePx),u=kn(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:kn(a.oraclePx),openInterest:u,fundingAprPct:nv(c)})}return r}function ov(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=kn(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=nv(n),o=n>0,i={coin:e.coin,notionalUsd:kn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?nM(t,e.markPx,e.szDecimals):"0",verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function ef(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await mt(t),i=rv(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function tf(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await mt(t),i=rv(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return ov(i,r)}async function nf(e={},t={}){av(e,t,"hl-delta-neutral");let n=sv(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await tf(e,t);if(r.verdict==="skip")return R({...r,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=il(e,r.coin,"hl-delta-neutral");if(!iv.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(r.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(ya(),Zm)),a=await i({coin:r.coin,side:r.perpSide,size:r.perpSize,type:e.orderType||"limit",price:e.price??r.markPx,owner:e.owner,maxNotionalUsd:n},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return R({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var iv=/^0x[0-9a-fA-F]{40}$/;function av(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function rM(e,t,n){av(e,t,n)}function oM(e={}){if(e.halted===!0)throw new Error("hl-delta-neutral: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("hl-delta-neutral: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("hl-delta-neutral: maxCoins must be an integer");if(o<1||o>8)throw new Error("hl-delta-neutral: maxCoins must be between 1 and 8");let i=sv(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&n.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&al(e,n,"hl-delta-neutral"),t==="live"&&!iv.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function sv(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function cv(e={},t={}){rM(e,t,"hl-delta-neutral");let n=oM(e),r=await ef({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=ov(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await nf({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}q();ee();Po();var aM=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ba=14,lv=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function No(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function rf(e){let t=String(e||"").replace(/\/$/,"");if(!aM.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function uv(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("lighter: structured artifact required");let r=lv(n.kind,"kind",48);if(r!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=rf(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(Br(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(Br(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");No(n.orderType,0,"orderType"),No(n.timeInForce,1,"timeInForce"),No(n.reduceOnly,0,"reduceOnly"),No(n.triggerPrice,0,"triggerPrice"),No(n.orderExpiry,-1,"orderExpiry");let c=lv(n.symbol||n.coin,"symbol",32),l=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(l.length&&!l.includes(c)&&!l.includes(String(i))&&!l.includes("*"))throw new Error("lighter: market not allowed");if(n.side!=="buy"&&n.side!=="sell")throw new Error("lighter: side must be buy or sell");let u=Ot(n.baseAmount,"lighter: baseAmount"),d=Ot(n.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(u),m=Number(d),f=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=f+h,w=u*d,x=De(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(w!==x)throw new Error("lighter: notionalUsd must match size and price");let b=De(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>b)throw new Error("lighter: notional exceeds cap");let y=je(n.notionalUsd,"lighter: notionalUsd");return No(n.txType,ba,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(y)})}function sM(e){let t=e.owner||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("lighter: owner address required for local-signer envelope");return String(t).toLowerCase()}function dv(e,t={},n={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=rf(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:sM(t),destination:"lighter",tradeId:String(t.tradeId||`lighter:${e.symbol}:${e.marketIndex}:${e.clientOrderIndex}`),expiresAtMs:r+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"lighter-delta-neutral",artifact:{kind:"lighter-order",symbol:e.symbol,marketIndex:e.marketIndex,side:e.side,baseAmount:e.baseAmount,price:e.price,notionalUsd:e.notionalUsd,sizeDecimals:e.sizeDecimals??0,priceDecimals:e.priceDecimals??0,clientOrderIndex:e.clientOrderIndex,txType:e.txType??ba,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return uv(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var mv="https://mainnet.zklighter.elliot.ai",fv="https://testnet.zklighter.elliot.ai";function cM(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?fv:mv}function hv(){return{ok:!0,provider:"lighter-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated lighter signer. Not automated."}}function Xn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function lM(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function gv(e){let t=Xn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function uM(e,t,n=4){let r=Xn(e),o=Xn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let a=10**i;return Math.floor(r/o*a+1e-12)}function pv(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function of(e,t){let n=Array.isArray(e?.funding_rates)?e.funding_rates:[],r=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let a of r){let s=pv(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=pv(a.market_id);if(s==null)continue;let c=o.get(s),l=Xn(c?.mark_price??c?.index_price),u=Xn(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:Xn(c?.open_interest)??0,sizeDecimals:Number(c?.supported_size_decimals??c?.size_decimals??4),priceDecimals:Number(c?.supported_price_decimals??c?.price_decimals??2),fundingAprPct:gv(u)})}return i}function yv(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Xn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=gv(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Xn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?uM(t,e.markPx,e.sizeDecimals):0,price:Math.round(Number(e.markPx)*10**Number(e.priceDecimals||0)),sizeDecimals:e.sizeDecimals,priceDecimals:e.priceDecimals,verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry on Lighter. Armed via official sendTx. Not automated."};if(!(i.notionalUsd>0))throw new Error("lighter: notionalUsd must be > 0");return i}async function af(e={}){let t=cM(e),n=e.fetchImpl,r=await I(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await I(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function bv(e={}){let{funding:t,books:n}=await af(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:of(t,n)}}async function sf(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await af(t),i=of(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function cf(e={},t={}){let n=String(e.coin||e.symbol||"").trim();if(!n)throw new Error("lighter: coin required");let r=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await af(t),a=of(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return yv(a,r)}async function lf(e={},t={}){xv(e,t,"lighter");let n=vv(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let r=e.accountIndex,o=await cf(e,t);if(o.verdict==="skip")return R({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=il(e,o.coin,"lighter");if(!wv.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=lM(BigInt(o.baseAmount)*BigInt(o.price),c);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let u={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:l,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:r,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:ba,submitTo:`${s?fv:mv}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=dv(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return R({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var wv=/^0x[0-9a-fA-F]{40}$/;function xv(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function dM(e,t,n){xv(e,t,n)}function pM(e={}){if(e.halted===!0)throw new Error("lighter: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("lighter: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("lighter: maxCoins must be an integer");if(o<1||o>8)throw new Error("lighter: maxCoins must be between 1 and 8");let i=vv(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&n.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&al(e,n,"lighter"),t==="live"&&!wv.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function vv(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function kv(e={},t={}){dM(e,t,"lighter");let n=pM(e),r=await sf({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=yv(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let l=await lf({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}q();var fM="https://clob.polymarket.com",hM="https://gamma-api.polymarket.com";function wa(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||fM).replace(/\/$/,"")}function Sv(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||hM).replace(/\/$/,"")}async function uf(e={}){return I(`${wa(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ev(e={}){let t=await uf(e);return{ok:t!=null&&t!=="",time:t}}async function Iv({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return I(`${Sv(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Av(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _v(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Pv(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Tv(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return I(`${wa(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Nv({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return I(`${Sv(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}ve();q();import{createHash as Cv}from"node:crypto";var Co="mainnet-beta",yM="https://api.mainnet-beta.solana.com",df="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function bM(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||yM).trim()}function Ee(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function wM(e,t){return t?[...e,{commitment:t}]:e}async function xa(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await I(bM(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function pf(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await xa("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Co,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Ov(e={}){try{let[t,n]=await Promise.all([xa("getHealth",[],e),pf({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Co,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Co,error:String(t?.message||t),exec:!1}}}async function dl(e={},t={}){let n=Ee(e.address||e.owner,"address"),r=await xa("getBalance",wM([n],e.commitment),t);return{provider:"solana-rpc",cluster:Co,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function xM(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function va(e={},t={}){let n=Ee(e.owner||e.address,"owner"),r=e.mint?{mint:Ee(e.mint,"mint")}:{programId:Ee(e.programId||df,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await xa("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(xM):[];return{provider:"solana-rpc",cluster:Co,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function vM(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("solana-rpc: transaction must be base64");return t}function kM(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function SM(e){let t=Buffer.from(e,"base64");try{let n=kM(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Cv("sha256").update(t.subarray(r)).digest("hex")}catch{return Cv("sha256").update(t).digest("hex")}}async function Rv(e={},t={}){let n=vM(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await xa("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Co,ok:i.err==null,transactionHash:SM(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}q();var IM="mainnet",AM="https://mempool.space/api",_M="https://mempool.space/testnet/api";function rn(e={}){return String(e.network||process.env.BTC_NETWORK||IM).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ff(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):rn(e)==="testnet"?_M:AM}function mf(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function jt(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function PM(e,t="txHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n)||n.length<20||n.length%2!==0)throw new Error(`bitcoin-esplora: ${t} must be even-length hex`);return n}async function hf(e,t={}){let n=`${ff(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`bitcoin-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function pl(e,t={}){let n=await hf(e,t);try{return JSON.parse(n)}catch{return n}}async function Lv(e={}){try{let t=await hf("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:rn(e),baseUrl:mf(ff(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:rn(e),baseUrl:mf(ff(e)),error:mf(t?.message||t),exec:!1}}}async function $v(e={}){let t=await hf("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:rn(e),tipHeight:Number(t)}}async function Bv(e={}){try{let t=await pl("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:rn(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:rn(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ml(e={},t={}){let n=jt(e.address||e.addr,"address"),r=await pl(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:rn(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Mv(e={},t={}){let n=jt(e.address||e.addr,"address"),r=await pl(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:rn(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Uv(e={},t={}){let n=String(e.txid||e.txId||"").trim().toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error("bitcoin-esplora: txid must be 64-char hex");let r=await pl(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:rn(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function Fv(e={},t={}){let n=PM(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:rn(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}qt();var gf="https://ordinals.com";function fl(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var NM=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Dv(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=fl(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=NM.includes(o)&&(i==="https:"||a)}}catch{n=!1}return Me({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Oo(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Dv(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function qv(e={}){let t=fl(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Dv(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function hl(e={},t={}){let n=jt(e.address||e.addr,"address"),r=fl(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let a of o)try{let s=await Oo(a,t),c=CM(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function CM(e){let t=e?.data?.detail||e?.data?.list||e?.data||e?.balances||e?.results||e?.runes||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({rune:r.rune||r.runeid||r.runeId||r.spacedRune||r.name||r.ticker||null,runeId:r.runeid||r.runeId||r.id||null,amount:String(r.amount??r.balance??r.total??r.qty??"0"),symbol:r.symbol||null,divisibility:r.divisibility??r.div??null,raw:r}))}async function Ro(e={},t={}){let n=jt(e.address||e.addr,"address"),r=fl(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],a=null;for(let s of i)try{let c=await Oo(s,t),l=OM(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function Hv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||gf,o=await Oo(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function jv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||gf,o=Number(e.page||0),i=await Oo(`${r}/r/children/${n}${o?`/${o}`:""}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,page:o,children:Array.isArray(i?.ids)?i.ids:[],more:!!i?.more}}async function zv(e={},t={}){let n=t.ordinalsBase||gf,r=e.height??await Oo(`${n}/r/blockheight`,t),o=await Oo(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function OM(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}qt();ee();var LM=["unsigned","notsigned","tosign","signable"],$M=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),BM=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function yf(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function MM(e){return LM.some(t=>e.startsWith(t))||$M.has(e)}function UM(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=yf(t);return MM(n)?!1:BM.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function FM(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function bf(e,t=0,n=new Set,r={nodes:0}){if(e==null||typeof e!="object")return[];if(t>16)return["<max-depth>"];if(n.has(e))return[];if(r.nodes+=1,r.nodes>2048)return["<max-nodes>"];if(n.add(e),Array.isArray(e))return e.flatMap(c=>bf(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(UM(c)){o.push(c);continue}o.push(...bf(l,t+1,n,r))}let a=Object.keys(e).map(yf).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(yf(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),FM(e)&&o.push("v/r/s"),o}function Sn(e,t){let n=bf(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var DM="https://api.satflow.com/v1";function Vv(e={}){return Fe({provider:"satflow",defaultUrl:DM,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function gl(e={}){return Vv(e).baseUrl}function xf(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function qM(e={}){return Me({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":xf(e)},Vv(e).trusted)}async function Qn(e,{method:t="GET",body:n,opts:r={}}={}){if(!xf(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${gl(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:qM(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function Wv(e={}){if(!!!xf(e))return{ok:!1,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!1,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",note:"Set SATFLOW_API_KEY. Magic Eden BTC ordinals marketplace is shut down \u2014 do not use ME."};try{return await Qn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",capabilities:{floors:!0,walletContents:!0,purchaseIntent:!0,listIntent:!0,bidIntent:!0}}}catch(n){return{ok:!1,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Gv(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await Qn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Kv(e={},t={}){let n=String(e.collectionId||e.id||e.slug||"").trim();if(!n)throw new Error("satflow: collectionId required");let r=new URLSearchParams({id:n});e.type&&r.set("type",e.type);let o=await Qn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Yv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!n)throw new Error("satflow: inscriptionId required");let r=new URLSearchParams({id:n});return{provider:"satflow",item:await Qn(`/item?${r}`,{opts:t})}}async function yl(e={},t={}){let n=jt(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await Qn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function Jv(e={},t={}){let n=e.collectionIds||e.ids||e.collectionId;if(!n)throw new Error("satflow: collectionIds required");let r=new URLSearchParams({ids:Array.isArray(n)?n.join(","):String(n)});return e.limit!=null&&r.set("limit",String(e.limit)),{provider:"satflow",listings:await Qn(`/orders/floor?${r}`,{opts:t})}}var HM=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Xv(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))HM.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var jM=new Set(["listing_id","listingId","inscription_id","inscriptionId","runes_output","runesOutput","buyer_address","buyerAddress","ord_address","receive_address","payment_address","pay_address","tap_key","public_key","publicKey","fee_rate","feeRate","price","quantity","slug","collection_slug"]),zM=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function wf(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}function VM(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=jt(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=jt(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function Qv(e={},t={}){let n=Xv(e,jM);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=wf(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Qn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=wf(a)??wf(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);Sn("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=VM(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return R({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,unsignedPsbt:c,localSignerEnvelope:l,localSignerBlockedReason:u,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function bl(e={},t={}){let n=Xv(e,zM);if(!n.inscription_id&&!n.runes_output&&!n.inscriptionId&&!n.runesOutput)throw new Error("satflow: list requires inscription_id or runes_output");let r=await Qn("/intent/sell",{method:"POST",body:n,opts:t});return Sn("satflow",r),R({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}q();ee();var xl="https://lite-api.jup.ag/swap/v1",vf="So11111111111111111111111111111111111111112",tk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GM=100,Zv=2e4;function nk(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||xl).replace(/\/$/,"")}function ka(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`jupiter: ${t} must be a positive integer string`)}}function rk(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("jupiter: slippageBps must be a non-negative integer");if(t>GM)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function wl(e,t){return e==null?t:!!e}function KM(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("jupiter: swapTransaction must be base64");return t}function YM(e,t=0){let n=0,r=0,o=t;for(;o<e.length&&o-t<3;){let i=e[o++];if(n|=(i&127)<<r,(i&128)===0)return{value:n,offset:o};r+=7}return null}function ok(e){let t=Buffer.from(e,"base64"),n=YM(t,0);if(!n||n.value!==1)throw new Error("jupiter: unsigned swapTransaction must declare exactly one signature slot");let r=n.offset+n.value*64;if(r>=t.length)throw new Error("jupiter: Solana transaction missing message bytes");if(t.subarray(n.offset,r).some(i=>i!==0))throw new Error("jupiter: swapTransaction already contains signature material");return t.subarray(r).toString("base64")}function Sa(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Zv}={}){let r=Ee(e.inputMint,"inputMint"),o=Ee(e.outputMint,"outputMint"),i=ka(e.inAmount,"inAmount"),a=ka(e.outAmount,"outAmount"),s=ka(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=rk(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==l)throw new Error("jupiter: otherAmountThreshold does not match serialized min-out");return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||Zv,1e3),3e4)}}function kf({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==vf)throw new Error("jupiter: local signer supports native SOL input only");if(BigInt(o?.prioritizationFeeLamports??0)!==0n)throw new Error("jupiter: local signer requires zero priority fee until exact fee accounting is supplied");let i=ok(n),a=ka(r.exactFeeLamports??o.exactFeeLamports??"5000","exactFeeLamports");return{version:1,surface:"sol",action:"swap",owner:e,destination:t.outputMint,tradeId:r.tradeId||`jupiter-${t.inputMint.slice(0,6)}-${t.outputMint.slice(0,6)}-${t.inAmount}`,slippageBps:t.slippageBps,expiresAtMs:t.expiresAtMs,fee:{oracleFeeBps:5},artifact:{cluster:r.cluster||"mainnet",provider:"jupiter",inputMint:t.inputMint,outputMint:t.outputMint,inAmount:t.inAmount,outAmount:t.outAmount,otherAmountThreshold:t.otherAmountThreshold,slippageBps:t.slippageBps,jupiterProgram:r.jupiterProgram||o.jupiterProgram||"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",messageBase64:i,exactFeeLamports:a}}}var JM=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),XM="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ek(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=XM.indexOf(o);if(i<0)return!1;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n="0"+n);let r=n.length/2;for(let o of e)if(o==="1")r++;else break;return r===32}async function ik(e={},t={}){let n=e.rpc||t.solanaRpc||process.env.SOLANA_RPC||"https://api.mainnet-beta.solana.com",r=t.fetchImpl||fetch,o=await r(`${xl}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),a=Object.entries(i),s=a.filter(([p])=>ek(p)),c=[],l=a.filter(([p])=>!ek(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${xl}/program-id-to-label`,verified:s.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<s.length;p+=90){let m=s.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[w,x]=m[g];h&&h.executable===!0&&JM.has(h.owner)?c.push({programId:w,label:x,owner:h.owner}):l.push({programId:w,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${xl}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function ak(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await vl({inputMint:vf,outputMint:tk,amount:"1000000",slippageBps:50},e)).quote.outAmount,exec:!1}}catch(t){return{ok:!1,provider:"jupiter",error:String(t?.message||t),exec:!1}}}async function vl(e={},t={}){let n=Ee(e.inputMint||e.fromMint||vf,"inputMint"),r=Ee(e.outputMint||e.toMint||tk,"outputMint"),o=ka(e.amount||e.inAmount,"amount"),i=rk(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${nk(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await I(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Sa({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function QM(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function sk(e={},t={}){let n=Ee(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Sa(e.quoteResponse,t)}:await vl(e,t),o=r.quote,i=r.solanaGuard||Sa(o,t);if(wl(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await I(`${nk(t)}/swap`,{method:"POST",body:QM({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:wl(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:wl(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:wl(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=KM(a?.swapTransaction);ok(s),Sn("jupiter",a);let c=a?.quoteResponse??a?.quote??null,l=["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"],u=!1;if(c&&typeof c=="object"){for(let m of l){let f=o?.[m],h=c?.[m];if(f==null||h==null)throw new Error(`jupiter: echoed quote is incomplete \u2014 missing ${m}`);if(String(f)!==String(h))throw new Error(`jupiter: swap response ${m} (${h}) does not match the quoted ${m} (${f}) \u2014 refusing to prepare`)}u=!0}let d=null,p=null;try{d=kf({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return R({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}Ar();Vi();$n();Er();fo();import{getAddress as eU}from"ethers";var Ef=Object.freeze(["uniswap-v2","uniswap-v3","uniswap-v4","aerodrome","curve","balancer","meteora-dlmm","pancakeswap","sushiswap"]),lk="0x0000000000000000000000000000000000000000",uk=/^0x[0-9a-fA-F]{40}$/,tU=25,kl=Object.freeze([["removalGasUsd","estimateRemovalGasUsd"],["swapCostUsd","estimateSwapCostUsd"],["bridgeCostUsd","estimateBridgeCostUsd"],["addLiquidityGasUsd","estimateAddLiquidityGasUsd"],["priceImpactUsd","estimatePriceImpactUsd"]]);function Ea(e,t){let n=String(e??"").trim();if(!n)throw new Error(`${t} is required`);if(uk.test(n))try{return eU(n)}catch{throw new Error(`${t} is not a valid EVM address`)}return n}function Sl(e,t){let n=e?.[t];if(typeof n!="function")throw new Error(`lp-liquidity-ranker: opts.${t} must be a function`);return n}function nU(e){if(!e||typeof e!="object")throw new Error("candidate must be an object");let t=Number(e.chainId);if(!Number.isInteger(t)||t<=0)throw new Error("chainId must be a positive integer");let n=String(e.venue??"").trim().toLowerCase();if(!n)throw new Error("venue is required");let r=Ea(e.poolAddress,"poolAddress"),o=e.token;if(!o||typeof o!="object")throw new Error("token is required");let i=String(o.symbol??"").trim();if(!i)throw new Error("token.symbol is required");let a=Ea(o.address,"token.address"),s=null;if(o.decimals!=null&&(s=Number(o.decimals),!Number.isInteger(s)||s<0||s>255))throw new Error("token.decimals must be a uint8 when provided");let c=Number(e.liquidityUsd);if(!Number.isFinite(c)||c<0)throw new Error("liquidityUsd must be a non-negative finite number");let l=n==="uniswap-v4"||e.isV4===!0,u=null;if(e.hook!=null){if(typeof e.hook!="object")throw new Error("hook must be an object when provided");u=Object.freeze({address:e.hook.address!=null?Ea(e.hook.address,"hook.address"):lk,dynamicFee:e.hook.dynamicFee===!0,reviewed:e.hook.reviewed===!0})}let d=e.id!=null?String(e.id):`${n}:${t}:${r}`;return Object.freeze({id:d,chainId:t,venue:n,poolAddress:r,token:Object.freeze({symbol:i,address:a,decimals:s}),liquidityUsd:c,isV4:l,hook:u})}function rU(e){if(!Ef.includes(e.venue))return`unsupported venue "${e.venue}"; supported: ${Ef.join(", ")}`;if(e.isV4){if(!e.hook)return"uniswap-v4 candidate is missing hook disclosure; failing closed";if(e.hook.dynamicFee)return"uniswap-v4 pool uses a dynamic fee; fee is not knowable in advance, failing closed";if(e.hook.address!==lk&&!e.hook.reviewed)return`uniswap-v4 pool has an unreviewed hook (${e.hook.address}); failing closed`}return null}async function oU(e,t,n){let r=Sl(n,"resolveTokenIdentity"),o;try{o=await r({chainId:e.chainId,address:e.token.address,symbol:e.token.symbol})}catch(l){return{ok:!1,reason:`identity resolution failed: ${l?.message??l}`}}if(!o||typeof o!="object")return{ok:!1,reason:"identity unresolved"};if(o.ambiguous)return{ok:!1,reason:o.reason??"ambiguous token identity"};if(!o.canonicalId)return{ok:!1,reason:"identity resolver returned no canonicalId"};if(o.canonicalId!==t.canonicalId)return{ok:!1,reason:`token resolves to canonical id "${o.canonicalId}", expected "${t.canonicalId}"`};let i=Number(o.homeChainId);if(!Number.isInteger(i)||i<=0)return{ok:!1,reason:"identity resolver returned no homeChainId"};let a;try{a=Ea(o.canonicalAddress,"identity resolver canonicalAddress")}catch(l){return{ok:!1,reason:l.message}}let s=e.token.address;return(uk.test(a)?a===s:a.toLowerCase()===String(s).toLowerCase())?{ok:!0,canonicalId:o.canonicalId,homeChainId:i,canonicalAddress:a,decimals:o.decimals??e.token.decimals??null}:{ok:!1,reason:`token address ${e.token.address} on chain ${e.chainId} does not match the canonical address ${a}; possible wrapped variant or spoof`}}async function iU(e,t,n){let r={},o=[];for(let[s,c]of kl){let l=Sl(n,c),u;try{u=await l(e,t)}catch(p){return{ok:!1,reason:`${c} failed for ${e.id}: ${p?.message??p}`}}if(u==null||!Number.isFinite(Number(u))){r[s]=null,o.push(s);continue}let d=Number(u);if(d<0)return{ok:!1,reason:`${c} returned a negative cost for ${e.id}`};r[s]=d}let i=kl.reduce((s,[c])=>s+(r[c]??0),0),a=o.length===0;return{ok:!0,costs:Object.freeze(r),missingLegs:Object.freeze(o),grossOnly:!a,measuredCostUsd:i,totalCostUsd:a?i:null,netUsd:a?t.amountUsd-i:null}}function Sf(e){return Object.freeze({id:e.id,chainId:e.chainId,venue:e.venue,poolAddress:e.poolAddress,token:e.token,liquidityUsd:e.liquidityUsd,canonicalId:e.identity.canonicalId,homeChainId:e.identity.homeChainId})}function ck(e,t){let n=null;for(let r of e){if(!n){n=r;continue}let o=t(r),i=t(n);(o>i||o===i&&r.id<n.id)&&(n=r)}return n}async function aU(e={},t={}){let n=String(e.canonicalId??"").trim();if(!n)throw new Error("lp-liquidity-ranker: canonicalId is required");let r=Number(e.amountUsd);if(!Number.isFinite(r)||r<=0)throw new Error("lp-liquidity-ranker: amountUsd must be a positive finite number");if(!Array.isArray(e.candidates)||e.candidates.length===0)throw new Error("lp-liquidity-ranker: candidates must be a non-empty array");let o=e.materialityThresholdBps??tU;if(!Number.isInteger(o)||o<0)throw new Error("lp-liquidity-ranker: materialityThresholdBps must be a non-negative integer");Sl(t,"resolveTokenIdentity");for(let[,h]of kl)Sl(t,h);let i=Object.freeze({canonicalId:n,amountUsd:r,materialityThresholdBps:o}),a=[],s=[],c=new Set,l=null;for(let h=0;h<e.candidates.length;h+=1){let g=e.candidates[h],w=g?.id!=null?String(g.id):`candidates[${h}]`,x;try{x=nU(g)}catch(E){a.push({id:w,reason:E.message});continue}if(c.has(x.id)){a.push({id:x.id,reason:"duplicate candidate id"});continue}c.add(x.id);let b=rU(x);if(b){a.push({id:x.id,reason:b});continue}let y=await oU(x,i,t);if(!y.ok){a.push({id:x.id,reason:y.reason});continue}if(l==null)l=y.homeChainId;else if(y.homeChainId!==l){a.push({id:x.id,reason:`ambiguous home chain for canonical token "${n}": got ${y.homeChainId}, expected ${l}`});continue}let S=await iU(x,i,t);if(!S.ok){a.push({id:x.id,reason:S.reason});continue}s.push({...x,identity:y,...S})}let u=[];if(s.length===0)return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:0,rejected:Object.freeze(a),deepestLiquidity:null,netBest:null,netRankingComplete:!1,preparationEligible:!1,runnersUp:Object.freeze([]),warnings:Object.freeze(["no candidate passed identity, venue, or cost validation"])});let d=ck(s,h=>h.liquidityUsd),p=s.filter(h=>!h.grossOnly&&h.netUsd!=null),m=ck(p,h=>h.netUsd);for(let h of s)h.grossOnly&&u.push(`${h.id}: gas/fees not fully accounted (missing: ${h.missingLegs.join(", ")}); missing costs were not treated as zero`);m?d.id!==m.id&&u.push(`${d.id} has the deepest liquidity ($${d.liquidityUsd}) but ${m.id} nets more after costs; these are intentionally different answers`):u.push("net-best migration is unavailable until every ranking cost leg is measured; missing gas is never treated as zero and deepest liquidity is not claimed as net-best"),p.length<s.length&&u.push("partial-cost candidates were excluded from net ranking; missing gas was not treated as zero");let f=s.filter(h=>h.id!==m?.id).sort((h,g)=>h.netUsd==null&&g.netUsd==null?h.id<g.id?-1:1:h.netUsd==null?1:g.netUsd==null?-1:g.netUsd-h.netUsd||(h.id<g.id?-1:1)).map(h=>{let g=m!=null&&h.netUsd!=null,w=g?m.netUsd-h.netUsd:null,x=g?Math.round(w/r*1e4):null;return Object.freeze({...Sf(h),netUsd:h.netUsd,totalCostUsd:h.totalCostUsd,grossOnly:h.grossOnly,missingLegs:h.missingLegs,marginUsd:w,marginBps:x,material:x!=null&&x>o})});return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:s.length,rejected:Object.freeze(a),deepestLiquidity:Sf(d),netBest:m?Object.freeze({...Sf(m),netUsd:m.netUsd,totalCostUsd:m.totalCostUsd,costs:m.costs,grossOnly:!1,missingLegs:m.missingLegs}):null,netRankingComplete:!!m&&p.length===s.length,preparationEligible:!1,runnersUp:Object.freeze(f),warnings:Object.freeze(u)})}async function dk(e={}){let t=String(e.canonicalId??"").trim(),n=Number(e.homeChainId);if(!t)throw new Error("lp-liquidity-ranker: canonicalId is required");if(!Number.isInteger(n)||n<=0)throw new Error("lp-liquidity-ranker: homeChainId must be a positive integer");if(!Array.isArray(e.canonicalAssets)||e.canonicalAssets.length===0)throw new Error("lp-liquidity-ranker: canonicalAssets must be a non-empty array");let r=new Map;for(let c of e.canonicalAssets){let l=Number(c?.chainId);if(!Number.isInteger(l)||l<=0)throw new Error("lp-liquidity-ranker: canonical asset chainId must be positive");if(r.has(l))throw new Error(`lp-liquidity-ranker: duplicate canonical asset for chain ${l}`);let u=Ea(c?.address,"canonical asset address"),d=c?.decimals==null?null:Number(c.decimals);if(d!=null&&(!Number.isInteger(d)||d<0||d>255))throw new Error("lp-liquidity-ranker: canonical asset decimals must be a uint8");r.set(l,Object.freeze({canonicalAddress:u,decimals:d}))}let o={resolveTokenIdentity:async({chainId:c})=>{let l=r.get(Number(c));return l?{canonicalId:t,homeChainId:n,...l}:{ambiguous:!0,reason:`no exact canonical asset mapping for chain ${c}`}}},i=(e.candidates??[]).map(c=>({...c,costs:c?.costs&&typeof c.costs=="object"?{...c.costs}:{}})),a=new Map(i.map(c=>[String(c?.id??`${String(c?.venue??"").toLowerCase()}:${Number(c?.chainId)}:${String(c?.poolAddress??"")}`),c.costs]));for(let[c,l]of kl)o[l]=async u=>a.get(u.id)?.[c]??null;let s=await aU({...e,canonicalId:t,candidates:i},o);return Object.freeze({...s,evidenceMode:"caller-supplied",warnings:Object.freeze(["canonical mappings, pool liquidity, and migration costs were caller-supplied and not independently live-verified",...s.warnings])})}async function pk(){return Object.freeze({ok:!0,execution:"analysis-only",supportedVenues:Ef,note:"Deepest liquidity and net-best migration are reported separately; no signing or broadcasting."})}$n();var cU=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),lU=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),uU=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function dU(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function pU(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=dU(n);if(lU.has(r)||uU.some(o=>r.includes(o)))return!0}return!1}function mk(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var mU=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function fU(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function hU(e){let t=e.match(mU)||[];for(let n of t){let r=fU(n),o=mk(r),i=o?mk(o):null;for(let a of[r,o,i])if(a&&pU(a))return!0}return!1}function fk(e){return typeof e!="string"||e.length===0?!1:cU.some(t=>t.test(e))?!0:hU(e)}var hk=/^0x[0-9a-fA-F]{40}$/,gU=new Set(["source","reviewedAt","evidenceHash","txHash"]),yU=1e4,En=e=>String(e??"").trim().toLowerCase();function bU(e,t){if(!e||typeof e!="object"||!String(e.source??"").trim())throw new Error(`lp-destination-discovery: ${t}.provenance.source is required`);if(Object.keys(e).filter(s=>!gU.has(s)).length)throw new Error(`lp-destination-discovery: ${t}.provenance contains unsupported fields`);let r=String(e.source).trim();if(r.length>512||fk(r))throw new Error(`lp-destination-discovery: ${t}.provenance.source is unsafe`);let o=e.evidenceHash==null?null:String(e.evidenceHash).trim();if(o!=null&&!/^[0-9a-f]{64}$/i.test(o))throw new Error(`lp-destination-discovery: ${t}.provenance.evidenceHash must be a sha256 digest`);let i=e.txHash==null?null:String(e.txHash).trim();if(i!=null&&!/^0x[0-9a-f]{64}$/i.test(i))throw new Error(`lp-destination-discovery: ${t}.provenance.txHash must be an EVM transaction hash`);let a=e.reviewedAt==null?null:String(e.reviewedAt).trim();if(a!=null&&!Number.isFinite(Date.parse(a)))throw new Error(`lp-destination-discovery: ${t}.provenance.reviewedAt must be ISO time`);return Object.freeze({source:r,reviewedAt:a,evidenceHash:o,txHash:i})}function gk(e,t){if(!e||typeof e!="object")throw new Error(`lp-destination-discovery: ${t} is required`);let n=Number(e.chainId),r=String(e.token0??"").trim(),o=String(e.token1??"").trim();if(!Number.isInteger(n)||n<=0)throw new Error(`lp-destination-discovery: ${t}.chainId must be positive`);if(!hk.test(r)||!hk.test(o)||En(r)===En(o))throw new Error(`lp-destination-discovery: ${t} requires distinct exact token0/token1 addresses`);return Object.freeze({...e,chainId:n,token0:r,token1:o,provenance:bU(e.provenance,t)})}function wU(e,t){if(!String(e.dexId??"").toLowerCase().includes("v4"))return{eligible:!0,reason:null};let n=t.v4;if(!n)return{eligible:!1,reason:"Uniswap V4 metadata is unreviewed"};if(n.dynamicFee===!0)return{eligible:!1,reason:"Uniswap V4 dynamic fee is not preparation-eligible"};let r=En(n.hook);return r&&r!=="0x0000000000000000000000000000000000000000"&&n.reviewed!==!0?{eligible:!1,reason:"Uniswap V4 hook is unreviewed"}:{eligible:!0,reason:null}}function xU(e){let t=e?.best;if(!t||t.quality!=="FULL")return null;let n=Number(t.gasUsd),r=Number(t.feeUsd);return t.gasUsd==null||t.feeUsd==null||!Number.isFinite(n)||!Number.isFinite(r)?null:n+r}async function yk({source:e,destination:t,amountIn:n,index:r},o,i){if(n==null)return{requested:!1,measured:!1,costUsd:null,quote:null};let a=e[`token${r}`],s=t[`token${r}`];if(e.chainId===t.chainId&&En(a)===En(s))return{requested:!0,measured:!0,costUsd:0,quote:null,kind:"none",amountIn:String(n)};let c=e.chainId===t.chainId?{chainId:e.chainId,tokenIn:a,tokenOut:s,amountIn:String(n)}:{fromChainId:e.chainId,toChainId:t.chainId,tokenIn:a,tokenOut:s,amountIn:String(n)},l=e.chainId===t.chainId?"swap":"bridge";try{let u=l==="swap"?await o.bestSwapRoute(c,i):await o.bestBridgeRoute(c,i),d=xU(u);return{requested:!0,measured:d!=null,costUsd:d,quote:u,kind:l,amountIn:String(n)}}catch(u){return{requested:!0,measured:!1,costUsd:null,quote:null,kind:l,amountIn:String(n),error:u?.message??String(u)}}}function vU(e){let t=e.minLiquidityBpsOfDeepest??yU;if(!Number.isInteger(t)||t<1||t>1e4)throw new Error("lp-destination-discovery: minLiquidityBpsOfDeepest must be an integer from 1 to 10000");if(e.minLiquidityUsd==null)return{bps:t,minLiquidityUsd:null};let n=Number(e.minLiquidityUsd);if(!Number.isFinite(n)||n<0)throw new Error("lp-destination-discovery: minLiquidityUsd must be a non-negative number");return{bps:t,minLiquidityUsd:n}}function kU(e,t,n){if(e.venueReviewEligible===!1)return{destinationEligible:!1,destinationIneligibleReason:e.ineligibleReason};if(e.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is unknown"};let r=Number(e.liquidityUsd);if(!Number.isFinite(r)||r<=0)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is not positive"};if(n.minLiquidityUsd!=null&&r<n.minLiquidityUsd)return{destinationEligible:!1,destinationIneligibleReason:`liquidity $${r} is below the $${n.minLiquidityUsd} floor`};if(!t||t.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"no eligible deepest pool"};let o=Number(t.liquidityUsd)*n.bps/1e4;return r<o?{destinationEligible:!1,destinationIneligibleReason:`shallower than the deepest eligible pool ($${r} < $${o} required)`}:{destinationEligible:!0,destinationIneligibleReason:null}}function bk(e,t,n="max"){return[...e].sort((r,o)=>(n==="max"?t(o)-t(r):t(r)-t(o))||String(r.poolAddress).localeCompare(String(o.poolAddress)))[0]??null}async function wk(e={},t={}){let n=gk(e.sourcePair,"sourcePair");if(!Array.isArray(e.destinationPairs))throw new Error("lp-destination-discovery: destinationPairs must be an array");let r=e.destinationPairs.map((k,A)=>gk(k,`destinationPairs[${A}]`)),o=new Map;for(let k of r){if(o.has(k.chainId))throw new Error(`lp-destination-discovery: duplicate destination mapping for chain ${k.chainId}`);o.set(k.chainId,k)}let i=vU(e),a=t.chainConfigs??(await Promise.resolve().then(()=>(Lr(),vm))).CHAIN_CONFIGS,s=e.amounts?.token0!=null||e.amounts?.token1!=null,c=s&&r.some(k=>k.chainId===n.chainId&&(En(k.token0)!==En(n.token0)||En(k.token1)!==En(n.token1))),l=s&&r.some(k=>k.chainId!==n.chainId),u=c&&!t.bestSwapRoute||l&&!t.bestBridgeRoute?await Promise.resolve().then(()=>(om(),Ow)):null,d={discoverExactPairPools:t.discoverExactPairPools??wb,bestSwapRoute:t.bestSwapRoute??u?.bestSwapRoute,bestBridgeRoute:t.bestBridgeRoute??u?.bestBridgeRoute},p=e.limit??10,m=await Promise.all(a.map(async k=>{let A=o.get(Number(k.chainId));if(!k.dexscreenerSlug)return{chainId:k.chainId,chain:k.name??k.key??null,status:"unavailable",reason:"DexScreener coverage slug is not configured",pools:[]};if(!A)return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"unavailable",reason:"no explicit provenanced destination token0/token1 mapping",pools:[]};try{let T=await d.discoverExactPairPools({chainSlug:k.dexscreenerSlug,token0:A.token0,token1:A.token1,limit:p,dexIds:A.dexIds},t);return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"available",mapping:A,pools:T}}catch(T){return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"unavailable",reason:T?.message??String(T),mapping:A,pools:[]}}})),f=m.flatMap(k=>k.pools.map(A=>({...A,chainId:Number(k.chainId),mapping:k.mapping}))),h=e.amounts??{},g=await Promise.all(f.map(async k=>{let[A,T]=await Promise.all([yk({source:n,destination:k.mapping,amountIn:h.token0,index:0},d,t),yk({source:n,destination:k.mapping,amountIn:h.token1,index:1},d,t)]),_=!(A.requested||T.requested)||[A,T].filter(O=>O.requested).every(O=>O.measured),$=_?[A,T].reduce((O,F)=>O+(F.costUsd??0),0):null,M=wU(k,k.mapping);return Object.freeze({...k,mappingProvenance:k.mapping.provenance,legs:Object.freeze([A,T]),fullyMeasured:_,costUsd:$,preparationEligible:!1,venueReviewEligible:M.eligible,ineligibleReason:M.reason})})),w=bk(g.filter(k=>k.liquidityUsd!=null),k=>Number(k.liquidityUsd)),x=g.map(k=>Object.freeze({...k,...kU(k,w,i)})),b=x.find(k=>k.destinationEligible&&w&&k.poolAddress===w.poolAddress&&k.chainId===w.chainId)??null,y=x.filter(k=>k.fullyMeasured&&k.destinationEligible),S=bk(y,k=>k.costUsd,"min"),E=x.filter(k=>k.destinationEligible===!1&&k.destinationIneligibleReason?.includes("shallower")),v=w&&x.some(k=>k.poolAddress===w.poolAddress&&k.chainId===w.chainId&&k.destinationEligible===!1);return Object.freeze({ok:!0,analysisOnly:!0,sourcePair:n,coverage:Object.freeze(m),routes:Object.freeze(x),deepestLiquidity:w,recommendedDestination:b,migrationCostBest:S,netBest:null,rankedOn:"liquidity",netRankingComplete:!1,preparationEligible:!1,liquidityFloor:Object.freeze(i),warnings:Object.freeze([...y.length<x.filter(k=>k.fullyMeasured).length?["partial-cost or thin-book routes were excluded from migration-cost comparison; missing gas was not treated as zero and thinner pools are not destinations"]:[],...E.length?[`${E.length} shallower pool(s) are not destination-eligible; a thinner V3 book is never recommended over a deeper V4 book`]:[],...v?["deepest book is not destination-eligible (unreviewed/dynamic-fee V4 or liquidity floor); thinner pools are still not recommended"]:[],"net-best migration is unavailable until destination token values and final add-liquidity gas/impact are measured; deepest liquidity is not claimed as net-best"])})}async function xk(){let{CHAIN_CONFIGS:e}=await Promise.resolve().then(()=>(Lr(),vm));return{ok:!0,execution:"analysis-only",configuredChains:e.length}}ve();tt();ee();import{Interface as Sk,getAddress as Ia,isAddress as EU}from"ethers";var Zn={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},IU=[1,50,100,200,2e3],vk=new Sk(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),AU=new Sk(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Ek="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ik="0x0000000000000000000000000000000000000000";function Ak(e){let t=Number(e),n=Zn[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Zn).join(", ")})`);return{chainId:t,...n}}function kk(e,t){let n=Zn[Number(t)];if(!e||e===Ek||e===Ik||/^eth$/i.test(String(e)))return Ia(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ia(n.weth);if(/^usdc$/i.test(r))return Ia(n.usdc);if(!EU(r))throw new Error(`invalid token address: ${e}`);return Ia(r)}async function El(e={},t={}){let{chainId:n,quoter:r,router:o}=Ak(e.chainId??8453),i=kk(e.tokenIn||"WETH",n),a=kk(e.tokenOut||Zn[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...IU],u=await Promise.all(c.map(async p=>{let m=vk.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await W(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=vk.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return pe({venue:"aerodrome",chainId:n,chain:Zn[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _k(e={},t={}){let n=Number(e.chainId??8453),r=Ak(n),o=Ia(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Ek||i===Ik||/^eth$/i.test(i),s=await El(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=AU.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return R({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:Pe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Pk(e={}){let t=Number(e.chainId??8453);try{let n=await El({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:Zn[t]?.router,quoter:Zn[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Tk(){return Object.entries(Zn).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}Gi();Bc();Xi();Hp();ee();var PU=96*1024,Nk=50;function TU(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>PU)throw new Error("x402: invalid PAYMENT-REQUIRED payload");if(t.startsWith("{"))try{return JSON.parse(t)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED JSON")}if(!/^[A-Za-z0-9+/_-]+={0,2}$/.test(t)||t.length%4===1)throw new Error("x402: invalid PAYMENT-REQUIRED Base64");let n=t.replace(/-/g,"+").replace(/_/g,"/"),r=n+"=".repeat((4-n.length%4)%4);try{let o=Buffer.from(r,"base64").toString("utf8");if(!o.trim().startsWith("{"))throw new Error("shape");return JSON.parse(o)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED Base64 JSON")}}function In(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function Ok(e,t){let n=In(e,t);if(!/^\d+$/.test(n))throw new Error(`x402: ${t} must be atomic units`);let r=BigInt(n);if(r<=0n)throw new Error(`x402: ${t} must be positive`);return r.toString()}function NU(e){if(!e||typeof e!="object"||Array.isArray(e))return Object.freeze({});let t={};for(let n of["name","version"])typeof e[n]=="string"&&e[n].trim()&&(t[n]=e[n].trim());return Object.freeze(t)}function CU(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=In(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:In(e.network,`accepts[${t}].network`),amount:Ok(e.amount,`accepts[${t}].amount`),asset:In(e.asset,`accepts[${t}].asset`),payTo:In(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:NU(e.extra)})}function If(e){let t=TU(e);if(t.x402Version!==2)throw new Error("x402: only x402Version 2 is supported");if(!Array.isArray(t.accepts)||t.accepts.length===0||t.accepts.length>Nk)throw new Error(`x402: accepts must contain 1-${Nk} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:In(t.resource.url,"resource.url"),description:String(t.resource.description||""),mimeType:String(t.resource.mimeType||"")}):null;if(!n)throw new Error("x402: resource required");let r=Object.freeze(t.accepts.map(CU));for(let o of r)if(!Number.isInteger(o.maxTimeoutSeconds)||o.maxTimeoutSeconds<=0)throw new Error("x402: maxTimeoutSeconds must be a positive integer");return Object.freeze({x402Version:2,resource:n,accepts:r})}function Ck(e,t){return String(e)===String(t)}function OU(e,t={}){let n=If(e),r=In(t.network,"network"),o=In(t.asset,"asset"),i=In(t.payTo,"payTo"),a=BigInt(Ok(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&Ck(l.asset,o)&&Ck(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function Rk(e={}){return e.paymentRequired??e.header??e.body}function Lk(e={}){return If(Rk(e))}function $k(e={},t={}){let n=If(Rk(e)),r=OU(n,e);return R({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function Bk(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}q();qt();var LU="https://api.bankr.bot";function Af(e={}){return Fe({provider:"bankr",defaultUrl:LU,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function Mk(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function $U(e={}){let t=Mk(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function Uk(e={},t=!1){let n=$U(e),r=Af(e);return Me({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function Fk(e,t={}){return I(`${Af(t).baseUrl}${e}`,{headers:Uk(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function _f(e={}){return Fk("/wallet/me",e)}async function Dk(e={}){return Fk("/wallet/portfolio",e)}function Aa(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function BU(e){let t=Aa(e,"amount");if(!/^\d+(?:\.\d+)?$/.test(t)||Number(t)<=0)throw new Error("bankr: amount must be a positive decimal string");return t}async function qk(e={},t={}){let n={fromChain:Aa(e.fromChain,"fromChain"),fromToken:Aa(e.fromToken,"fromToken"),toChain:Aa(e.toChain,"toChain"),toToken:Aa(e.toToken,"toToken"),amount:BU(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return I(`${Af(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:Uk(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function Hk(e={}){if(!Mk(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await _f(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var UU=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function _a(e,t={}){if(!e?.type)throw new Error("hlWsSnapshot requires subscription.type");let n=t.timeoutMs??8e3,r=t.maxMessages??1,o=t.WebSocket||globalThis.WebSocket;if(!o)throw new Error("WebSocket not available in this runtime");let i=t.url||UU,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function jk(e={}){try{let t=await _a({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function zk(e={}){let t=await _a({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Vk(e,t={}){if(!e)throw new Error("coin required");let n=await _a({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var DU=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Il(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let a=t.url||DU,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function Wk(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Il([t],{...e,maxMessages:1});return{ok:!0,ms:n.ms,got:!!n.last,partial:n.partial||!1}}catch(n){return{ok:!1,error:String(n.message||n).slice(0,160)}}}async function Gk(e,t={}){if(!e)throw new Error("assetId required");let n=await Il([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}q();var HU="https://api.binance.com",jU="https://fapi.binance.com",zU=8;function Pf(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||HU).replace(/\/$/,"")}function Al(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||jU).replace(/\/$/,"")}function Pa(e){return{error:String(e.message||e).slice(0,200)}}function kt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ta(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function _l(e={}){try{let t=await I(`${Pf(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function Pl(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await I(`${Pf(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:kt(o?.price??o?.lastPrice),volume24h:kt(o?.volume),quoteVolume24h:kt(o?.quoteVolume),raw:o}}catch(r){return Pa(r)}}async function Kk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Al(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Pf(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,a=await I(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return Ca({venue:"binance",market:o?"perp":"spot",symbol:n,bids:a?.bids,asks:a?.asks,raw:a})}catch(i){return Pa(i)}}async function Na(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await I(`${Al(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||zU,a=kt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:kt(o?.markPrice),indexPrice:kt(o?.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:kt(o?.nextFundingTime),raw:o??null}}catch(r){return Pa(r)}}async function Yk(e={},t={}){let n=await Na(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function Jk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await I(`${Al(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:kt(r?.openInterest),time:kt(r?.time),raw:r??null}}catch(r){return Pa(r)}}async function Xk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await I(`${Al(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(a=>({fundingTime:kt(a?.fundingTime),fundingRate:kt(a?.fundingRate)}))}}catch(o){return Pa(o)}}function Ca({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let a=m=>(Array.isArray(m)?m:[]).map(f=>{let h=kt(Array.isArray(f)?f[0]:f?.price),g=kt(Array.isArray(f)?f[1]:f?.size);return h==null||g==null?null:{price:h,size:g}}).filter(Boolean),s=a(r),c=a(o),l=s[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:s,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}q();var VU="https://www.okx.com",WU=8;function Lo(e={}){return(e.baseUrl||process.env.OKX_API_URL||VU).replace(/\/$/,"")}function Oa(e){return{error:String(e.message||e).slice(0,200)}}function gt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ra(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function $o(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function Tl(e={}){try{let t=await I(`${Lo(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:$o(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function Nl(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Ra(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await I(`${Lo(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:gt(i.last),bestBid:gt(i.bidPx),bestAsk:gt(i.askPx),volume24h:gt(i.vol24h),quoteVolume24h:gt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return Oa(o)}}async function Zk(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Ra(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await I(`${Lo(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=$o(i)[0];return a?Ca({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:a.bids,asks:a.asks,raw:a}):{error:`okx books empty for ${r}`}}catch(i){return Oa(i)}}async function Cl(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await I(`${Lo(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=$o(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||WU,a=gt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:a,nextFundingRate:gt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:gt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return Oa(r)}}async function Ol(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await I(`${Lo(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:gt(i.markPx),time:gt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return Oa(o)}}async function eS(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await I(`${Lo(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:gt(i.oiCcy??i.oi),openInterestContracts:gt(i.oi),openInterestUsd:gt(i.oiUsd),time:gt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return Oa(o)}}q();var GU="https://api.bybit.com",KU=8;function La(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||GU).replace(/\/$/,"")}function $a(e){return{error:String(e.message||e).slice(0,200)}}function ze(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Rl(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function Tf(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Ba(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function Ll(e={}){try{let t=await I(`${La(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Ba(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function nS(e,t){let n=Tf(e.market),r=Rl(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await I(`${La(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ba(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function $l(e={},t={}){try{let n=await nS(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:ze(r.lastPrice),bestBid:ze(r.bid1Price),bestAsk:ze(r.ask1Price),markPrice:ze(r.markPrice),indexPrice:ze(r.indexPrice),volume24h:ze(r.volume24h),quoteVolume24h:ze(r.turnover24h),raw:r}}catch(n){return $a(n)}}async function rS(e={},t={}){let n=Tf(e.market),r=Rl(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await I(`${La(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Ba(i);return a?Ca({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:a.b,asks:a.a,raw:a}):{error:`bybit orderbook empty for ${r}`}}catch(i){return $a(i)}}async function Ma(e={},t={}){try{let n=await nS({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||KU,a=ze(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ze(r.markPrice),indexPrice:ze(r.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:ze(r.nextFundingTime),openInterest:ze(r.openInterest),raw:r}}catch(n){return $a(n)}}async function oS(e={},t={}){let n=await Ma(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function iS(e={},t={}){let n=Rl(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=Tf(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let a=await I(`${La(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Ba(a)?.list,c=Array.isArray(s)?s[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:ze(c.openInterest),time:ze(c.timestamp),history:(Array.isArray(s)?s:[]).map(l=>({openInterest:ze(l?.openInterest),timestamp:ze(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(a){return $a(a)}}async function aS(e={},t={}){let n=Rl(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await I(`${La(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ba(o)?.list,a=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:a.length,history:a.map(s=>({fundingRate:ze(s?.fundingRate),fundingTime:ze(s?.fundingRateTimestamp)}))}}catch(o){return $a(o)}}ft();var Nf=["binance","okx","bybit","hyperliquid"],cS=1;function Ua(e){return{error:String(e.message||e).slice(0,200)}}function Qe(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function YU(e,t){return e==null||!t?null:e*(8760/t)*100}function Cf(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function JU(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Nf,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Nf.filter(i=>r.has(i));return o.length?o:Nf}async function XU(e={},t={}){let n=Cf(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await mt(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let a=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(a<0)return{error:`hyperliquid has no perp for ${n}`};let s=i[a]||{},c=Qe(s.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Qe(s.markPx),indexPrice:Qe(s.oraclePx),midPrice:Qe(s.midPx),fundingRate:c,fundingIntervalHours:cS,fundingAprPct:YU(c,cS),openInterest:Qe(s.openInterest)}}catch(r){return Ua(r)}}async function QU(e={},t={}){let n=Cf(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await Ht(t),o=Qe(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return Ua(r)}}async function ZU(e={},t={}){let[n,r]=await Promise.all([Cl(e,t).catch(Ua),Ol(e,t).catch(Ua)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Qe(r.markPrice),...r?.error?{markError:r.error}:{}}}async function er(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,Ua(n)]}}async function Of(e={},t={}){let n=Cf(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=JU(e),i=[];o.includes("binance")&&(i.push(er("binance:perp",Na({coin:n,quote:r},t))),i.push(er("binance:spot",Pl({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(er("okx:perp",ZU({coin:n,quote:r},t))),i.push(er("okx:spot",Nl({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(er("bybit:perp",Ma({coin:n,quote:r},t))),i.push(er("bybit:spot",$l({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(er("hyperliquid:perp",XU({coin:n},t))),i.push(er("hyperliquid:spot",QU({coin:n},t))));let a=await Promise.all(i),s={};for(let[c,l]of a){let[u,d]=c.split(":");s[u]=s[u]||{},s[u][d]=l}return{coin:n,quote:r,venues:o,legs:s}}function lS(e){return!e||e.error?null:Qe(e.price)??Qe(e.mid)??null}function eF(e){return!e||e.error?null:Qe(e.markPrice)??Qe(e.midPrice)??null}async function Rf(e={},t={}){let n=await Of(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:a}=n,s=[];for(let f of i){let h=lS(a[f]?.spot);h!=null&&h>0&&s.push(h)}let c=[...s].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=a[f]?.perp,g=a[f]?.spot,w=eF(h),x=lS(g),b=x??l,y=w!=null&&b?(w-b)/b*1e4:null;u.push({venue:f,symbol:h?.symbol??g?.symbol??r,markPrice:w,spotPrice:x,spotSource:x!=null?f:l!=null?"cross-venue-median":null,basisBps:y,fundingRate:h&&!h.error?Qe(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Qe(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Qe(h.fundingAprPct):null,openInterest:h&&!h.error?Qe(h.openInterest):null,errors:[h?.error,g?.error].filter(Boolean)})}let d=tF(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function tF(e=[]){let t=e.filter(r=>Qe(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],a=t[o],s=i.fundingAprPct-a.fundingAprPct,c=s>0?a.venue:i.venue,l=s>0?i.venue:a.venue;n.push({pair:`${i.venue}/${a.venue}`,aprSpreadPct:Math.abs(s),signedAprSpreadPct:s,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function uS(e={},t={}){let n=await Rf(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function dS(e={}){try{let t=await Promise.all([_l(e).catch(()=>({ok:!1})),Tl(e).catch(()=>({ok:!1})),Ll(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}import gS from"node:path";import{homedir as hF}from"node:os";import{createHash as gF,randomUUID as yF}from"node:crypto";import ge from"node:fs";import Bl from"node:path";import{createHash as rF,randomUUID as pS}from"node:crypto";var Lf=1,zt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function tr(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(tr).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${tr(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function mS(e){return rF("sha256").update(tr(e)).digest("hex")}function Ml(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Ul(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function fS(e){ge.mkdirSync(e,{recursive:!0,mode:448});try{ge.chmodSync(e,448)}catch{}}function $f(e){try{let t=ge.statSync(e);return{...JSON.parse(ge.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function Bo({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>pS()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let b=n();return r(b),{schemaVersion:Lf,kind:t,generation:0,data:b}}function d(b){let y;try{y=JSON.parse(b)}catch(v){throw new zt(`corrupt ${t} snapshot: invalid JSON (${v.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new zt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==Lf)throw new zt(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new zt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:S,...E}=y;if(typeof S!="string"||!/^[a-f0-9]{64}$/.test(S)||mS(E)!==S)throw new zt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(v){throw new zt(`corrupt ${t} snapshot: ${v.message}`,"STORE_CORRUPT")}return E}function p(){if(!ge.existsSync(e))return u();let b=ge.statSync(e);if(!b.isFile()||b.size>i)throw new zt(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ge.chmodSync(e,384)}catch{}return d(ge.readFileSync(e,"utf8"))}function m(){fS(Bl.dirname(e));let b=Ml(o),y=String(c()),S=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:b})}
147
+ `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function wn(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||F$()}function ex(e={}){return Fe({provider:"opensea",defaultUrl:L$,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Nr(e={}){return ex(e).baseUrl}function Cr(e={}){return Me({accept:"application/json"},{"x-api-key":wn(e)},ex(e).trusted)}function tx(e){let t=String(e||"ethereum").trim().toLowerCase();if(!U$.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ie(e,t="address"){try{return O$(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function nx(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Zw.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ie(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function D$(e,t){let n=String(e??"").trim();if(!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(n)||Number(n)<=0)throw new Error(`opensea: ${t} must be a positive plain decimal`);return n}function q$(e,t){let n=Number(e);if(!Number.isSafeInteger(n)||n<=0)throw new Error(`opensea: ${t} must be a positive integer`);return n}function Kw(e,t){let n=String(e||"").trim(),r=Date.parse(n);if(!n||!Number.isFinite(r))throw new Error(`opensea: ${t} must be an ISO 8601 timestamp`);return{text:new Date(r).toISOString(),ms:r}}function H$(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function rx(e={}){if(!wn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await ta("boredapeyachtclub",e);return{ok:!0,configured:!0,name:t.name||t.collection}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function ta(e,t={}){if(!e)throw new Error("collection slug required");if(!wn(t))throw new Error("OPENSEA_API_KEY required");return I(`${Nr(t)}/collections/${encodeURIComponent(e)}`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ox(e,t={}){let n=await ta(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function na(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=tx(e.chain),r=nx(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${Nr(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await I(l.toString(),{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(H$(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Hc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=nx(e.address||e.owner),r=await I(`${Nr(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var jc=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function ra(e){let t=String(e||"").trim().toLowerCase(),n=jc[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function pt(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function j$(e,t="transaction value"){let n;try{let r=String(e??"0").trim();if(!/^(?:0x[0-9a-fA-F]+|\d+)$/.test(r))throw new Error("invalid");n=BigInt(r)}catch{throw new Error(`opensea: ${t} must be a non-negative integer quantity`)}if(n<0n)throw new Error(`opensea: ${t} must be non-negative`);return{amount:n,hex:`0x${n.toString(16)}`}}function ea(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function ix(e,t=10){let n=Number(e??1);if(!Number.isSafeInteger(n)||n<1||n>t)throw new Error(`opensea: quantity must be an integer from 1 through ${t}`);return n}function ax(e,t,n="listing expiry"){let r=e==null?"":String(e).trim(),o;if(/^\d+$/.test(r)){let i=Number(r);o=r.length<=10?i*1e3:i}else o=Date.parse(r);if(!r||!Number.isFinite(o))throw new Error(`opensea: ${n} missing or invalid`);if(o<=t)throw new Error(`opensea: ${n} is expired or stale`);return new Date(o).toISOString()}function z$(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function V$(e,t){let n=Number(e?.itemType);if(![0,1].includes(n))throw new Error(`opensea: ${t} is not a native or ERC20 payment item`);let r=ie(e?.token,t);if(n===0&&r!==Zi)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Zi)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function W$(e,t){let n=pt(e?.startAmount,`${t} startAmount`),r=pt(e?.endAmount??e?.startAmount,`${t} endAmount`);if(n!==r)throw new Error(`opensea: ${t} must be a fixed amount, not a decaying range`);return n}function dm(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(z$);if(!r.length){if(n)throw new Error(`opensea: ${t} contains no native or ERC20 payment item`);return{paymentToken:null,totalWei:0n,count:0}}let o=null,i=0n;for(let a of r){let s=V$(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=W$(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var G$=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});function vt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Yw(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(n))throw new Error(`opensea: ${t} must be a 32-byte hex value`);return n}function sx(e,t){return{itemType:Number(vt(e?.itemType,`${t} itemType`)),token:ie(e?.token,`${t} token`),identifierOrCriteria:vt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:vt(e?.startAmount,`${t} startAmount`),endAmount:vt(e?.endAmount,`${t} endAmount`)}}function K$(e,t){return{...sx(e,t),recipient:ie(e?.recipient,`${t} recipient`)}}function Y$(e,t){if(!e||typeof e!="object")throw new Error(`opensea: ${t} has no canonical Seaport protocol parameters`);let n=Array.isArray(e.offer)?e.offer:null,r=Array.isArray(e.consideration)?e.consideration:null;if(!n||!n.length)throw new Error(`opensea: ${t} canonical offer array is missing`);if(!r||!r.length)throw new Error(`opensea: ${t} canonical consideration array is missing`);return{offerer:ie(e.offerer,`${t} offerer`),zone:ie(e.zone,`${t} zone`),offer:n.map((o,i)=>sx(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>K$(o,`${t} consideration[${i}]`)),orderType:Number(vt(e.orderType,`${t} orderType`)),startTime:vt(e.startTime,`${t} startTime`),endTime:vt(e.endTime,`${t} endTime`),zoneHash:Yw(e.zoneHash,`${t} zoneHash`),salt:vt(e.salt,`${t} salt`),conduitKey:Yw(e.conduitKey,`${t} conduitKey`),counter:vt(e.counter,`${t} counter`)}}function cx(e,t,n){let r=String(e?.order_hash??e?.orderHash??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new Error(`opensea: invalid ${n} order hash`);let o=Y$(t,n);if(pm.hashStruct("OrderComponents",G$,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function lx(e,t){let n=Number(e?.itemType);if([4,5].includes(n))throw new Error(`opensea: ${t} is a criteria item, not a fixed token`);if(![2,3].includes(n))throw new Error(`opensea: ${t} must be an ERC-721 or ERC-1155 item`);let r=ie(e?.token,`${t} contract`),o=ea(e?.identifierOrCriteria),i=pt(e?.startAmount,`${t} startAmount`,{positive:!0}),a=pt(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function J$(e,t){let n=Array.isArray(e?.offer)?e.offer:[];if(n.some(o=>[4,5].includes(Number(o?.itemType))))throw new Error(`opensea: ${t} uses a criteria offer item, not a fixed token`);let r=n.filter(o=>[2,3].includes(Number(o?.itemType)));if(r.length!==1||n.length!==1)throw new Error(`opensea: ${t} must offer exactly one fixed ERC-721 or ERC-1155 item`);return lx(r[0],`${t} offer NFT`)}function X$(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=lx(o[0],`${n} consideration NFT`);if(i.tokenId!==t)throw new Error(`opensea: ${n} consideration token does not match the requested token`);return i}function Q$(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ie(e.contract,`${r} display contract`)!==t)throw new Error(`opensea: ${r} display asset contract disagrees with the canonical Seaport offer`);if(e.identifier!=null&&String(e.identifier).trim()!==""&&String(e.identifier).trim()!==n)throw new Error(`opensea: ${r} display asset token disagrees with the canonical Seaport offer`)}}function Z$(e){let t=String(e??"").trim();return/^\d+$/.test(t)?t.length<=10?Number(t):Math.floor(Number(t)/1e3):Math.floor(Date.parse(t)/1e3)}function ux(e,t,n,r){let o=vt(t?.startTime,`${r} startTime`),i=vt(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=ax(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&Z$(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function eB(e,t,n){if(!e||typeof e!="object")throw new Error("opensea: invalid best listing");let r=String(e.chain||"").trim().toLowerCase();if(r!==t.chain)throw new Error("opensea: OpenSea returned a listing for the wrong chain");if(jc[r]!==t.chainId)throw new Error("opensea: OpenSea listing chain id mismatch");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active listing");let i=e.protocol_data?.parameters,a=J$(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;Q$(e.asset,s,c,"listing");let l=pt(e.price?.current?.value,"listing price",{positive:!0}),u=cx(e,i,"listing"),d=dm(i?.consideration,"listing consideration");if(d.totalWei!==l)throw new Error("opensea: listing consideration total does not equal the quoted listing price");return{orderHash:u,chain:t.chain,chainId:t.chainId,protocolAddress:ie(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:ux(e,i,n,"listing"),counter:vt(i?.counter,"listing counter")}}async function mm(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=ra(e.chain);n.contract=e.contract?ie(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Number(e.limit??12);if(!Number.isSafeInteger(o)||o<1||o>50)throw new Error("opensea: listing limit must be 1 through 50");let i=new URL(`${Nr(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await I(i.toString(),{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.length)throw new Error("opensea: no active best listings returned");let c=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return{provider:"opensea-nft",source:"opensea-best-listings",chain:n.chain,chainId:n.chainId,slug:r,contract:n.contract,listings:s.map(l=>eB(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function zc(e={},t={}){let n=ea(e.tokenId),r=Math.min(Math.max(Number(e.maxPages??20)||20,1),25),o=e.next?String(e.next):null,i=new Set;for(let a=1;a<=r;a+=1){let s=await mm({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function tB(e,t,n,r){if(!e||typeof e!="object")throw new Error("opensea: invalid best offer");if(String(e.chain||"").trim().toLowerCase()!==t.chain)throw new Error("opensea: OpenSea returned an offer for the wrong chain");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active offer");let i=e.protocol_data?.parameters||{},s=X$(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=pt(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=dm(i.offer,"offer payment"),u=l.paymentToken;if(l.totalWei!==c)throw new Error("opensea: offer payment total does not equal the quoted gross offer");let d=dm(i.consideration,"offer fee",{required:!1});if(d.count&&d.paymentToken!==u)throw new Error("opensea: offer fee consideration uses a different token than the offer payment");if(d.totalWei>c)throw new Error("opensea: offer fee consideration exceeds the gross offer");let p=d.totalWei.toString(),m=(c-d.totalWei).toString();return{provider:"opensea-nft",source:"opensea-best-exact-offer",orderHash:cx(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ie(e.protocol_address,"offer protocol address"),contract:s,tokenId:n,grossOfferWei:c.toString(),sellerNetWei:m,feeWei:p,paymentToken:u,currency:String(e.price?.current?.currency||e.price?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??e.price?.decimals??18),expiry:ux(e,i,r,"offer"),counter:vt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Vc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");let n=ra(e.chain);n.contract=e.contract?ie(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=ea(e.tokenId),i=await I(`${Nr(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:Cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return tB(a,n,o,s)}function nB(e){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after buyer, chain, contract, token, quantity, price cap, total cap, and expiry review")}function dx(e){if(!e||typeof e!="object")return!1;let t=String(e.action??e.type??e.method??"");return/approv|setapprovalforall|permit/i.test(t)?!0:Object.values(e).some(n=>n&&typeof n=="object"&&dx(n))}function px(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function mx(e){return!e||typeof e!="object"?!1:px(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&mx(t))}function fx(e,t=[],n=new Set){if(!e||typeof e!="object"||n.has(e))return t;n.add(e),e.transaction&&typeof e.transaction=="object"?t.push(e.transaction):e.tx&&typeof e.tx=="object"&&t.push(e.tx);for(let[r,o]of Object.entries(e))(r==="transaction"||r==="tx")&&o&&typeof o=="object"||o&&typeof o=="object"&&fx(o,t,n);return t}function Jw(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function hx(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(px(e))throw new Error("opensea: signed transaction material refused");if((e.from?ie(Jw(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ie(Jw(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=B$.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(c))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");c.endsWith(l.slice(2))||(c+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let d=j$(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Wc(e){return{from:e.from,to:e.to,data:e.data,value:e.value,chainId:e.chainId,...e.gasLimit==null?{}:{gasLimit:e.gasLimit},...e.maxFeePerGas==null?{}:{maxFeePerGas:e.maxFeePerGas},...e.maxPriorityFeePerGas==null?{}:{maxPriorityFeePerGas:e.maxPriorityFeePerGas},...e.worstCaseFeeWei==null?{}:{worstCaseFeeWei:e.worstCaseFeeWei}}}async function fm(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Ce(e,4,async c=>{let{chainId:l,...u}=Wc(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(ve(),tc)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(ve(),tc)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function rB(e,t){if(dx(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(mx(e))throw new Error("opensea: signed transaction material refused");let n=fx(e);if(!n.length&&e&&typeof e=="object"&&(e.to||e.target)&&n.push(e),!n.length)throw new Error("opensea: OpenSea returned no transaction action");return n.map(r=>hx(r,t))}function oB(e,t,n={}){return R({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function gx(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function yx(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function iB(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=ie(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Gc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");nB(e);let{chain:n,chainId:r}=ra(e.chain),o=ie(e.buyer||e.minter||e.address,"buyer"),i=ie(e.contract,"NFT contract"),a=ix(e.quantity),s=pt(e.priceWei,"priceWei"),c=pt(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=ax(e.expiry,l,"mint expiry");if(e.tokenId!=null)throw new Error("opensea: SeaDrop mint tokenId is unknown until the mined receipt and must not be caller supplied");let d=String(e.slug||"").trim();if(!d)throw new Error("opensea: collection slug required");let p=await ta(d,t),m=iB(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await I(`${Nr(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:Cr(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(g)?g:g?[g]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map(O=>ie(O,"SeaDrop mint target"))),b=rB(h,{buyer:o,chainId:r,targets:x});if(b.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,S,E=null,v;try{y=Dc.decodeFunctionData("mintPublic",b[0].data),S="public",v=Dc.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Dc.decodeFunctionData("mintAllowList",b[0].data),S="allowlist";let O=y[4],F=[...y[5]].map(String);if(F.length<1||F.length>64||F.some(Y=>!/^0x[0-9a-fA-F]{64}$/.test(Y)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let L=BigInt(O.startTime),D=BigInt(O.endTime),Q=BigInt(Math.floor(l/1e3));if(L>Q||D<=Q)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(O.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(O.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");v=Dc.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,F]),E={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:L.toString(),endTime:D.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:F}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let k=ie(y[0],"mint NFT contract"),A=ie(y[1],"mint fee recipient"),T=ie(y[2],"mint recipient");if(k!==m)throw new Error("opensea: mint calldata collection mismatch");if(T!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(v.toLowerCase()!==b[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=b.reduce((O,F)=>O+F.valueWei,0n);if(C!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let _=await fm(b,r,{...t,provider:e.provider||t.provider});if(_.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let $=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},M=Gw({chainId:r,tx:b[0],policy:$});return oB({action:"mint",mintType:S,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:b[0].to,feeRecipient:A,expiry:u,transactions:b.map(Wc),gasWar:M,..._},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+po,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function aB(e={}){let t=tx(e.chain);if(Zw.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Kw(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Kw(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:ie(e.contract,"NFT contract"),token_id:o,quantity:q$(e.quantity??1,"quantity"),price:{amount:D$(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ie(e.price?.currency??e.currency??Zi,"price currency")},start_time:n.text,end_time:r.text}}var ko={OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]},Xw=new qc(["function setApprovalForAll(address operator,bool approved)"]),sB=new qc(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);function Qw(e,t){return e?.[t]||(e?.action===t?e:null)}function cB(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(b=>Qw(b,"createListingsAction")).find(Boolean)||o.find(b=>/createListings/i.test(String(b?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=ie(c.verifyingContract,"listing protocol"),u=s.message;if(ie(u.offerer,"listing seller")!==t)throw new Error("opensea: listing seller mismatch");if(!Array.isArray(u.offer)||u.offer.length!==1)throw new Error("opensea: executable listing requires exactly one NFT offer");let d=u.offer[0];if(![2,3].includes(Number(d.itemType)))throw new Error("opensea: listing offer must be ERC721 or ERC1155");if(ie(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let b of u.consideration){if(Number(b.itemType)!==0||ie(b.token,"listing payment token")!==Zi)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(b.startAmount),S=BigInt(b.endAmount);if(y<=0n||y!==S)throw new Error("opensea: listing consideration must be fixed and positive");ie(b.recipient,"listing consideration recipient"),p+=y}let m=R$(n.price.amount,18);if(p!==m)throw new Error("opensea: listing price mismatch");let f=BigInt(Math.floor(Date.parse(n.start_time)/1e3)),h=BigInt(Math.floor(Date.parse(n.end_time)/1e3));if(BigInt(u.startTime)!==f||BigInt(u.endTime)!==h)throw new Error("opensea: listing time bounds mismatch");let g=pm.hashStruct("OrderComponents",ko,u),w=o.map(b=>Qw(b,"itemApprovalAction")).find(Boolean)||o.find(b=>/setApprovalForAll/i.test(String(b?.action||""))),x=null;if(w){let b=w.transaction||w.itemApprovalAction?.transaction,y=hx(b,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=Xw.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=ie(S[0],"listing approval operator");if(S[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Xw.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:ko,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Kc(e={},t={}){if(!wn(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=ie(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length!==1)throw new Error("opensea: executable listing preparation supports exactly one NFT per envelope");let o=r.map(aB);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=ie(e.taker,"taker"));let c=await I(`${Nr(t)}/listings/actions`,{method:"POST",headers:Cr(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=ra(o[0].chain),u=cB(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await fm(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return R({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,chainId:l,kind:"nft-list",action:"list",prepareReady:!0,executionReady:p.simulated===!0,signingReady:p.simulated===!0,broadcastReady:p.simulated===!0,requiresUserSignature:!0,requiresSeparateApproval:d.length>0,seller:n,contract:o[0].contract,tokenId:o[0].token_id,quantity:o[0].quantity,priceWei:u.priceWei.toString(),typedData:u.typedData,orderHash:u.orderHash,submission:{chain:o[0].chain,protocol:"seaport",protocolAddress:u.protocolAddress},transactions:d.map(Wc),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"Creator fees requested and bound into exact Seaport consideration recipients.":"Creator fees disabled by explicit request; every remaining consideration recipient is still bound.",...p})}async function bx(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=ra(e.chain),o=ie(e.seller||e.address||e.owner,"seller"),i=ie(e.protocolAddress,"reviewed Seaport protocol address"),a=ie(e.contract,"NFT contract"),s=ea(e.tokenId),c=ix(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[k,A]of Object.entries(ko)){let T=l.types?.[k];if(!Array.isArray(T)||T.length!==A.length||T.some((C,_)=>C?.name!==A[_].name||C?.type!==A[_].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(k=>k!=="EIP712Domain").sort().join(",")!==Object.keys(ko).sort().join(","))throw new Error("opensea: cancellation requires canonical Seaport types");let d=l.domain;if(d.name!=="Seaport"||d.version!=="1.6"||Number(d.chainId)!==r)throw new Error("opensea: cancellation domain mismatch");let p=ie(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ie(m.offerer,"listing seller")!==o)throw new Error("opensea: cancellation seller mismatch");if(!Array.isArray(m.offer)||m.offer.length!==1||!Array.isArray(m.consideration)||!m.consideration.length)throw new Error("opensea: cancellation requires one exact previously prepared listing order");if(Number(m.orderType)!==2)throw new Error("opensea: cancellation requires a FULL_RESTRICTED listing order");let f=m.offer[0];if(![2,3].includes(Number(f.itemType)))throw new Error("opensea: cancellation offer must be ERC721 or ERC1155");if(ie(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(ea(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=pt(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=pt(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let k of m.consideration){if(Number(k.itemType)!==0||ie(k.token,"cancellation payment token")!==Zi)throw new Error("opensea: cancellation requires native fixed-price consideration");let A=pt(k.startAmount,"cancellation consideration startAmount",{positive:!0}),T=pt(k.endAmount,"cancellation consideration endAmount",{positive:!0});if(A!==T)throw new Error("opensea: cancellation consideration must be fixed and positive");ie(k.recipient,"cancellation consideration recipient")}let w=pt(m.startTime,"cancellation startTime");if(pt(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let b=pm.hashStruct("OrderComponents",ko,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==b.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let S=sB.encodeFunctionData("cancel",[[m]]),E=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],v=await fm(E,r,{...t,provider:e.provider||t.provider});if(v.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return R({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:b,typedData:{domain:d,types:ko,primaryType:"OrderComponents",message:m},transactions:E.map(Wc),...v,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}Lr();var aa=new Map,yB=Object.keys(He).map(Number),bB=Object.keys(wt).map(Number),wB=Object.keys(xo).map(Number),Sm=Rr.map(e=>e.chainId),xB=[...new Set(Object.values(jc))],km=new Set,Px=!1;function Tx(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Tx(t);return Object.freeze(e)}function N(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Px&&km.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return aa.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),aa.get(t)}function Eo(e){return aa.get(e)||null}function Jc({venue:e,op:t}={}){let n=[...aa.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function vB(){km.clear();for(let[e,t]of aa)km.add(e),Tx(t);Px=!0}N({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});N({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});N({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});N({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});N({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});N({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});N({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});N({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});N({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});N({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});N({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});N({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});N({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});N({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])N({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});N({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});N({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Sm,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Rr.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});N({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});N({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});N({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});N({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});N({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});N({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + local-signer Solana swap handoff"});N({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});N({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});N({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});N({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});N({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});N({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});N({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});N({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});N({id:"uniswap-v3",venue:"dex",chainIds:yB,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});N({id:"lp-exit",venue:"dex",chainIds:wB,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});N({id:"lp-liquidity-ranker",venue:"dex",chainIds:Sm,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});N({id:"lp-destination-discovery",venue:"dex",chainIds:Sm,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});N({id:"uniswap-v4",venue:"dex",chainIds:bB,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});N({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});N({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});N({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});N({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});N({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});N({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});N({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});N({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});N({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});N({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});N({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});N({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});N({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});N({id:"opensea-nft",venue:"nft",chainIds:xB,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});N({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});N({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});N({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});N({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});N({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});N({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});N({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});N({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});N({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});N({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});N({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});N({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});N({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});N({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});N({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});N({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});N({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});N({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});N({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});N({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});N({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});N({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});N({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});N({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});N({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});N({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, and coin balances (0x1::coin::balance view with a CoinStore resource fallback). Read-only; the transaction submit door is never called."});N({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});N({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});N({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});N({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});N({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});N({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});N({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});N({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});N({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});N({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});N({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});N({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});N({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});N({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});N({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});N({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});N({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});N({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});N({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});N({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});N({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});N({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});N({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});N({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});N({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});N({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});N({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});N({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});N({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});N({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});N({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});N({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});N({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});N({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});N({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});N({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});N({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});N({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});N({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});N({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});N({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});N({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});N({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});N({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});N({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});N({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});N({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});vB();q();var NY=Object.freeze(["live","needs_key","deprecated","soft_fail","hard_down"]);function Xc(e={}){return e.execution==="unavailable"||!!e.deprecated}ft();ft();var AB=/^0x[0-9a-fA-F]{40}$/,ca="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Em(e,t){let n=String(e||"").trim();if(!AB.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Lx(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function $x(e={}){let t=Array.isArray(e.portfolio)?e.portfolio:[],n=t.find(([i])=>i==="day")?.[1]||null,r=Array.isArray(n?.accountValueHistory)?n.accountValueHistory:[],o=Array.isArray(n?.pnlHistory)?n.pnlHistory:[];return{name:e.name??null,vaultAddress:e.vaultAddress??e.address??null,leader:e.leader??null,description:e.description??null,tvl:e.tvl??r.at(-1)?.[1]??null,apr:e.apr??null,pnl:e.pnl??o.at(-1)?.[1]??null,isClosed:e.isClosed??null,allowDeposits:e.allowDeposits??null,maxDistributable:e.maxDistributable??null,followers:e.followers??null,portfolio:t}}function _B(e){return[...e].sort((t,n)=>(Lx(n.tvl)??-1)-(Lx(t.tvl)??-1))}function Im(e){return e.hlInfo||we}function Am(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function _m(e={},t={}){let n=await Im(t)({type:"vaultSummaries"},t),r=_B((Array.isArray(n)?n:[]).map($x));return Am({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function nl(e={},t={}){let r={type:"vaultDetails",vaultAddress:Em(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Em(e.user,"user"));let o=await Im(t)(r,t);return Am({provider:"hl-vaults",vault:$x(o||{}),raw:o})}async function Pm(e={},t={}){let n=Em(e.user||e.address,"user"),r=await Im(t)({type:"userVaultEquities",user:n},t),o=(Array.isArray(r)?r:[]).map(i=>({vaultAddress:i.vaultAddress??i.address??null,equity:i.equity??i.vaultEquity??null}));return Am({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Tm(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return nl({...e,vaultAddress:ca},t);if(n==="summaries")return _m(e,t);if(n==="details")return nl(e,t);if(n==="mine")return Pm(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Bx(e={}){try{let t=await Tm({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ca&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1,execution:"read-only",armed:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1,execution:"read-only",armed:!1}}}ve();import{AbiCoder as TB}from"ethers";var Nm=999;var Ge=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Cm=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),NB=TB.defaultAbiCoder();function la(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-precompiles: ${t} must be a 0x EVM address`);return n.toLowerCase()}function ua(e,t,n){let r=Number(e);if(!Number.isInteger(r)||r<0||r>=2**n)throw new Error(`hl-precompiles: ${t} must fit uint${n}`);return r}function $r(e,t){return e.length?NB.encode(e,t):"0x"}function xn(e,t=0){let r=String(e||"").replace(/^0x/i,"").slice(t*64,t*64+64);if(r.length!==64)throw new Error("hl-precompiles: malformed precompile result");return BigInt(`0x${r}`)}function CB(e,t=0){let n=xn(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function zn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Nm});let r=await W(Nm,"eth_call",[{to:e,data:t},"latest"],n);if(typeof r!="string"||!/^0x[0-9a-fA-F]*$/.test(r))throw new Error("hl-precompiles: eth_call did not return hex");return r}function Vn(e){return{provider:"hl-precompiles",chainId:Nm,...Cm,...e}}async function rl(e={}){let t=await zn(Ge.l1BlockNumber,"0x",e);return Vn({op:"l1BlockNumber",precompile:Ge.l1BlockNumber,l1BlockNumber:xn(t).toString(),raw:t})}async function Om(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.markPx,$r(["uint32"],[n]),t);return Vn({op:"markPx",precompile:Ge.markPx,index:n,markPx:xn(r).toString(),raw:r})}async function Rm(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.oraclePx,$r(["uint32"],[n]),t);return Vn({op:"oraclePx",precompile:Ge.oraclePx,index:n,oraclePx:xn(r).toString(),raw:r})}async function Lm(e={},t={}){let n=ua(e.index??e.assetId??0,"index",32),r=await zn(Ge.spotPx,$r(["uint32"],[n]),t);return Vn({op:"spotPx",precompile:Ge.spotPx,index:n,spotPx:xn(r).toString(),raw:r})}async function $m(e={},t={}){let n=la(e.user,"user"),r=ua(e.perp??e.assetId??0,"perp",16),o=await zn(Ge.position,$r(["address","uint16"],[n,r]),t);return Vn({op:"position",precompile:Ge.position,user:n,perp:r,szi:CB(o,0),raw:o})}async function Bm(e={},t={}){let n=la(e.user,"user"),r=ua(e.token??0,"token",64),o=await zn(Ge.spotBalance,$r(["address","uint64"],[n,r]),t);return Vn({op:"spotBalance",precompile:Ge.spotBalance,user:n,token:r,total:xn(o,0).toString(),hold:xn(o,1).toString(),raw:o})}async function Mm(e={},t={}){let n=la(e.user,"user"),r=la(e.vaultAddress??e.vault??ca,"vault"),o=await zn(Ge.vaultEquity,$r(["address","address"],[n,r]),t);return Vn({op:"vaultEquity",precompile:Ge.vaultEquity,user:n,vaultAddress:r,hlp:r===ca,equity:xn(o,0).toString(),raw:o})}async function Um(e={},t={}){let n=la(e.user,"user"),r=await zn(Ge.withdrawable,$r(["address"],[n]),t);return Vn({op:"withdrawable",precompile:Ge.withdrawable,user:n,withdrawable:xn(r).toString(),raw:r})}async function Mx(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return rl(t);if(n==="markPx")return Om(e,t);if(n==="oraclePx")return Rm(e,t);if(n==="spotPx")return Lm(e,t);if(n==="position")return $m(e,t);if(n==="spotBalance")return Bm(e,t);if(n==="vaultEquity"||n==="hlp")return Mm(e,t);if(n==="withdrawable")return Um(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Ux(e={}){try{let t=await rl(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Cm,l1BlockNumber:t.l1BlockNumber,precompiles:Ge}}catch(t){return{ok:!1,provider:"hl-precompiles",...Cm,error:String(t?.message||t).slice(0,160)}}}ft();ee();function Fx(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function il(e={},t,n){let r=String(t||""),o=Fx(e);if(o){let a=da(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=da(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function al(e={},t=[],n){let r=Fx(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(da(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&da(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(da(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Fm=Number.MAX_SAFE_INTEGER,ol=String(Fm);function da(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Fm?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>ol.length||t.length===ol.length&&t>ol||t===ol&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Fm?r:null}function tv(){return{ok:!0,provider:"hl-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated hl signer. Not automated."}}function kn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function nv(e){let t=kn(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function nM(e,t,n=4){let r=kn(e),o=kn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function rv(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},a=n[o]||{},s=String(i.name||"").trim(),c=kn(a.funding),l=kn(a.markPx??a.oraclePx),u=kn(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:kn(a.oraclePx),openInterest:u,fundingAprPct:nv(c)})}return r}function ov(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=kn(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=nv(n),o=n>0,i={coin:e.coin,notionalUsd:kn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?nM(t,e.markPx,e.szDecimals):"0",verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function ef(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await mt(t),i=rv(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function tf(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await mt(t),i=rv(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return ov(i,r)}async function nf(e={},t={}){av(e,t,"hl-delta-neutral");let n=sv(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await tf(e,t);if(r.verdict==="skip")return R({...r,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=il(e,r.coin,"hl-delta-neutral");if(!iv.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(r.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(ya(),Zm)),a=await i({coin:r.coin,side:r.perpSide,size:r.perpSize,type:e.orderType||"limit",price:e.price??r.markPx,owner:e.owner,maxNotionalUsd:n},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return R({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var iv=/^0x[0-9a-fA-F]{40}$/;function av(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function rM(e,t,n){av(e,t,n)}function oM(e={}){if(e.halted===!0)throw new Error("hl-delta-neutral: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("hl-delta-neutral: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("hl-delta-neutral: maxCoins must be an integer");if(o<1||o>8)throw new Error("hl-delta-neutral: maxCoins must be between 1 and 8");let i=sv(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&n.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&al(e,n,"hl-delta-neutral"),t==="live"&&!iv.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function sv(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function cv(e={},t={}){rM(e,t,"hl-delta-neutral");let n=oM(e),r=await ef({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=ov(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await nf({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}q();ee();Po();var aM=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ba=14,lv=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function No(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function rf(e){let t=String(e||"").replace(/\/$/,"");if(!aM.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function uv(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("lighter: structured artifact required");let r=lv(n.kind,"kind",48);if(r!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=rf(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(Br(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(Br(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");No(n.orderType,0,"orderType"),No(n.timeInForce,1,"timeInForce"),No(n.reduceOnly,0,"reduceOnly"),No(n.triggerPrice,0,"triggerPrice"),No(n.orderExpiry,-1,"orderExpiry");let c=lv(n.symbol||n.coin,"symbol",32),l=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(l.length&&!l.includes(c)&&!l.includes(String(i))&&!l.includes("*"))throw new Error("lighter: market not allowed");if(n.side!=="buy"&&n.side!=="sell")throw new Error("lighter: side must be buy or sell");let u=Ot(n.baseAmount,"lighter: baseAmount"),d=Ot(n.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(u),m=Number(d),f=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=f+h,w=u*d,x=De(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(w!==x)throw new Error("lighter: notionalUsd must match size and price");let b=De(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>b)throw new Error("lighter: notional exceeds cap");let y=je(n.notionalUsd,"lighter: notionalUsd");return No(n.txType,ba,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(y)})}function sM(e){let t=e.owner||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("lighter: owner address required for local-signer envelope");return String(t).toLowerCase()}function dv(e,t={},n={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=rf(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:sM(t),destination:"lighter",tradeId:String(t.tradeId||`lighter:${e.symbol}:${e.marketIndex}:${e.clientOrderIndex}`),expiresAtMs:r+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"lighter-delta-neutral",artifact:{kind:"lighter-order",symbol:e.symbol,marketIndex:e.marketIndex,side:e.side,baseAmount:e.baseAmount,price:e.price,notionalUsd:e.notionalUsd,sizeDecimals:e.sizeDecimals??0,priceDecimals:e.priceDecimals??0,clientOrderIndex:e.clientOrderIndex,txType:e.txType??ba,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return uv(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var mv="https://mainnet.zklighter.elliot.ai",fv="https://testnet.zklighter.elliot.ai";function cM(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?fv:mv}function hv(){return{ok:!0,provider:"lighter-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated lighter signer. Not automated."}}function Xn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function lM(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function gv(e){let t=Xn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function uM(e,t,n=4){let r=Xn(e),o=Xn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let a=10**i;return Math.floor(r/o*a+1e-12)}function pv(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function of(e,t){let n=Array.isArray(e?.funding_rates)?e.funding_rates:[],r=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let a of r){let s=pv(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=pv(a.market_id);if(s==null)continue;let c=o.get(s),l=Xn(c?.mark_price??c?.index_price),u=Xn(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:Xn(c?.open_interest)??0,sizeDecimals:Number(c?.supported_size_decimals??c?.size_decimals??4),priceDecimals:Number(c?.supported_price_decimals??c?.price_decimals??2),fundingAprPct:gv(u)})}return i}function yv(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Xn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=gv(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Xn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?uM(t,e.markPx,e.sizeDecimals):0,price:Math.round(Number(e.markPx)*10**Number(e.priceDecimals||0)),sizeDecimals:e.sizeDecimals,priceDecimals:e.priceDecimals,verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry on Lighter. Armed via official sendTx. Not automated."};if(!(i.notionalUsd>0))throw new Error("lighter: notionalUsd must be > 0");return i}async function af(e={}){let t=cM(e),n=new AbortController,r={fetchImpl:e.fetchImpl,retries:0,signal:n.signal};try{let[o,i]=await Promise.all([I(`${t}/api/v1/funding-rates`,r),I(`${t}/api/v1/orderBookDetails`,r)]);return{funding:o,books:i}}catch(o){throw n.abort(o),o}}async function bv(e={}){let{funding:t,books:n}=await af(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:of(t,n)}}async function sf(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await af(t),i=of(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function cf(e={},t={}){let n=String(e.coin||e.symbol||"").trim();if(!n)throw new Error("lighter: coin required");let r=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await af(t),a=of(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return yv(a,r)}async function lf(e={},t={}){xv(e,t,"lighter");let n=vv(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let r=e.accountIndex,o=await cf(e,t);if(o.verdict==="skip")return R({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=il(e,o.coin,"lighter");if(!wv.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=lM(BigInt(o.baseAmount)*BigInt(o.price),c);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let u={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:l,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:r,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:ba,submitTo:`${s?fv:mv}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=dv(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return R({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var wv=/^0x[0-9a-fA-F]{40}$/;function xv(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function dM(e,t,n){xv(e,t,n)}function pM(e={}){if(e.halted===!0)throw new Error("lighter: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("lighter: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("lighter: maxCoins must be an integer");if(o<1||o>8)throw new Error("lighter: maxCoins must be between 1 and 8");let i=vv(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&n.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&al(e,n,"lighter"),t==="live"&&!wv.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function vv(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function kv(e={},t={}){dM(e,t,"lighter");let n=pM(e),r=await sf({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=yv(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let l=await lf({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}q();var fM="https://clob.polymarket.com",hM="https://gamma-api.polymarket.com";function wa(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||fM).replace(/\/$/,"")}function Sv(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||hM).replace(/\/$/,"")}async function uf(e={}){return I(`${wa(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ev(e={}){let t=await uf(e);return{ok:t!=null&&t!=="",time:t}}async function Iv({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return I(`${Sv(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Av(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _v(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Pv(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${wa(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Tv(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return I(`${wa(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Nv({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return I(`${Sv(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}ve();q();import{createHash as Cv}from"node:crypto";var Co="mainnet-beta",yM="https://api.mainnet-beta.solana.com",df="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function bM(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||yM).trim()}function Ee(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function wM(e,t){return t?[...e,{commitment:t}]:e}async function xa(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await I(bM(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function pf(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await xa("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Co,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Ov(e={}){try{let[t,n]=await Promise.all([xa("getHealth",[],e),pf({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Co,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Co,error:String(t?.message||t),exec:!1}}}async function dl(e={},t={}){let n=Ee(e.address||e.owner,"address"),r=await xa("getBalance",wM([n],e.commitment),t);return{provider:"solana-rpc",cluster:Co,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function xM(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function va(e={},t={}){let n=Ee(e.owner||e.address,"owner"),r=e.mint?{mint:Ee(e.mint,"mint")}:{programId:Ee(e.programId||df,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await xa("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(xM):[];return{provider:"solana-rpc",cluster:Co,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function vM(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("solana-rpc: transaction must be base64");return t}function kM(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function SM(e){let t=Buffer.from(e,"base64");try{let n=kM(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Cv("sha256").update(t.subarray(r)).digest("hex")}catch{return Cv("sha256").update(t).digest("hex")}}async function Rv(e={},t={}){let n=vM(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await xa("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Co,ok:i.err==null,transactionHash:SM(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}q();var IM="mainnet",AM="https://mempool.space/api",_M="https://mempool.space/testnet/api";function rn(e={}){return String(e.network||process.env.BTC_NETWORK||IM).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ff(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):rn(e)==="testnet"?_M:AM}function mf(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function jt(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function PM(e,t="txHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n)||n.length<20||n.length%2!==0)throw new Error(`bitcoin-esplora: ${t} must be even-length hex`);return n}async function hf(e,t={}){let n=`${ff(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`bitcoin-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function pl(e,t={}){let n=await hf(e,t);try{return JSON.parse(n)}catch{return n}}async function Lv(e={}){try{let t=await hf("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:rn(e),baseUrl:mf(ff(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:rn(e),baseUrl:mf(ff(e)),error:mf(t?.message||t),exec:!1}}}async function $v(e={}){let t=await hf("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:rn(e),tipHeight:Number(t)}}async function Bv(e={}){try{let t=await pl("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:rn(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:rn(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ml(e={},t={}){let n=jt(e.address||e.addr,"address"),r=await pl(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:rn(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Mv(e={},t={}){let n=jt(e.address||e.addr,"address"),r=await pl(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:rn(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Uv(e={},t={}){let n=String(e.txid||e.txId||"").trim().toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error("bitcoin-esplora: txid must be 64-char hex");let r=await pl(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:rn(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function Fv(e={},t={}){let n=PM(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:rn(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}qt();var gf="https://ordinals.com";function fl(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var NM=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Dv(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=fl(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=NM.includes(o)&&(i==="https:"||a)}}catch{n=!1}return Me({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Oo(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Dv(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function qv(e={}){let t=fl(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Dv(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function hl(e={},t={}){let n=jt(e.address||e.addr,"address"),r=fl(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let a of o)try{let s=await Oo(a,t),c=CM(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function CM(e){let t=e?.data?.detail||e?.data?.list||e?.data||e?.balances||e?.results||e?.runes||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({rune:r.rune||r.runeid||r.runeId||r.spacedRune||r.name||r.ticker||null,runeId:r.runeid||r.runeId||r.id||null,amount:String(r.amount??r.balance??r.total??r.qty??"0"),symbol:r.symbol||null,divisibility:r.divisibility??r.div??null,raw:r}))}async function Ro(e={},t={}){let n=jt(e.address||e.addr,"address"),r=fl(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],a=null;for(let s of i)try{let c=await Oo(s,t),l=OM(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function Hv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||gf,o=await Oo(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function jv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||gf,o=Number(e.page||0),i=await Oo(`${r}/r/children/${n}${o?`/${o}`:""}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,page:o,children:Array.isArray(i?.ids)?i.ids:[],more:!!i?.more}}async function zv(e={},t={}){let n=t.ordinalsBase||gf,r=e.height??await Oo(`${n}/r/blockheight`,t),o=await Oo(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function OM(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}qt();ee();var LM=["unsigned","notsigned","tosign","signable"],$M=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),BM=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function yf(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function MM(e){return LM.some(t=>e.startsWith(t))||$M.has(e)}function UM(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=yf(t);return MM(n)?!1:BM.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function FM(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function bf(e,t=0,n=new Set,r={nodes:0}){if(e==null||typeof e!="object")return[];if(t>16)return["<max-depth>"];if(n.has(e))return[];if(r.nodes+=1,r.nodes>2048)return["<max-nodes>"];if(n.add(e),Array.isArray(e))return e.flatMap(c=>bf(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(UM(c)){o.push(c);continue}o.push(...bf(l,t+1,n,r))}let a=Object.keys(e).map(yf).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(yf(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),FM(e)&&o.push("v/r/s"),o}function Sn(e,t){let n=bf(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var DM="https://api.satflow.com/v1";function Vv(e={}){return Fe({provider:"satflow",defaultUrl:DM,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function gl(e={}){return Vv(e).baseUrl}function xf(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function qM(e={}){return Me({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":xf(e)},Vv(e).trusted)}async function Qn(e,{method:t="GET",body:n,opts:r={}}={}){if(!xf(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${gl(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:qM(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function Wv(e={}){if(!!!xf(e))return{ok:!1,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!1,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",note:"Set SATFLOW_API_KEY. Magic Eden BTC ordinals marketplace is shut down \u2014 do not use ME."};try{return await Qn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",capabilities:{floors:!0,walletContents:!0,purchaseIntent:!0,listIntent:!0,bidIntent:!0}}}catch(n){return{ok:!1,provider:"satflow",baseUrl:gl(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Gv(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await Qn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Kv(e={},t={}){let n=String(e.collectionId||e.id||e.slug||"").trim();if(!n)throw new Error("satflow: collectionId required");let r=new URLSearchParams({id:n});e.type&&r.set("type",e.type);let o=await Qn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Yv(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!n)throw new Error("satflow: inscriptionId required");let r=new URLSearchParams({id:n});return{provider:"satflow",item:await Qn(`/item?${r}`,{opts:t})}}async function yl(e={},t={}){let n=jt(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await Qn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function Jv(e={},t={}){let n=e.collectionIds||e.ids||e.collectionId;if(!n)throw new Error("satflow: collectionIds required");let r=new URLSearchParams({ids:Array.isArray(n)?n.join(","):String(n)});return e.limit!=null&&r.set("limit",String(e.limit)),{provider:"satflow",listings:await Qn(`/orders/floor?${r}`,{opts:t})}}var HM=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Xv(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))HM.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var jM=new Set(["listing_id","listingId","inscription_id","inscriptionId","runes_output","runesOutput","buyer_address","buyerAddress","ord_address","receive_address","payment_address","pay_address","tap_key","public_key","publicKey","fee_rate","feeRate","price","quantity","slug","collection_slug"]),zM=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function wf(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}function VM(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=jt(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=jt(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function Qv(e={},t={}){let n=Xv(e,jM);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=wf(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Qn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=wf(a)??wf(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);Sn("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=VM(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return R({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,unsignedPsbt:c,localSignerEnvelope:l,localSignerBlockedReason:u,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function bl(e={},t={}){let n=Xv(e,zM);if(!n.inscription_id&&!n.runes_output&&!n.inscriptionId&&!n.runesOutput)throw new Error("satflow: list requires inscription_id or runes_output");let r=await Qn("/intent/sell",{method:"POST",body:n,opts:t});return Sn("satflow",r),R({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}q();ee();var xl="https://lite-api.jup.ag/swap/v1",vf="So11111111111111111111111111111111111111112",tk="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GM=100,Zv=2e4;function nk(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||xl).replace(/\/$/,"")}function ka(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`jupiter: ${t} must be a positive integer string`)}}function rk(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("jupiter: slippageBps must be a non-negative integer");if(t>GM)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function wl(e,t){return e==null?t:!!e}function KM(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("jupiter: swapTransaction must be base64");return t}function YM(e,t=0){let n=0,r=0,o=t;for(;o<e.length&&o-t<3;){let i=e[o++];if(n|=(i&127)<<r,(i&128)===0)return{value:n,offset:o};r+=7}return null}function ok(e){let t=Buffer.from(e,"base64"),n=YM(t,0);if(!n||n.value!==1)throw new Error("jupiter: unsigned swapTransaction must declare exactly one signature slot");let r=n.offset+n.value*64;if(r>=t.length)throw new Error("jupiter: Solana transaction missing message bytes");if(t.subarray(n.offset,r).some(i=>i!==0))throw new Error("jupiter: swapTransaction already contains signature material");return t.subarray(r).toString("base64")}function Sa(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Zv}={}){let r=Ee(e.inputMint,"inputMint"),o=Ee(e.outputMint,"outputMint"),i=ka(e.inAmount,"inAmount"),a=ka(e.outAmount,"outAmount"),s=ka(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=rk(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==l)throw new Error("jupiter: otherAmountThreshold does not match serialized min-out");return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||Zv,1e3),3e4)}}function kf({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==vf)throw new Error("jupiter: local signer supports native SOL input only");if(BigInt(o?.prioritizationFeeLamports??0)!==0n)throw new Error("jupiter: local signer requires zero priority fee until exact fee accounting is supplied");let i=ok(n),a=ka(r.exactFeeLamports??o.exactFeeLamports??"5000","exactFeeLamports");return{version:1,surface:"sol",action:"swap",owner:e,destination:t.outputMint,tradeId:r.tradeId||`jupiter-${t.inputMint.slice(0,6)}-${t.outputMint.slice(0,6)}-${t.inAmount}`,slippageBps:t.slippageBps,expiresAtMs:t.expiresAtMs,fee:{oracleFeeBps:5},artifact:{cluster:r.cluster||"mainnet",provider:"jupiter",inputMint:t.inputMint,outputMint:t.outputMint,inAmount:t.inAmount,outAmount:t.outAmount,otherAmountThreshold:t.otherAmountThreshold,slippageBps:t.slippageBps,jupiterProgram:r.jupiterProgram||o.jupiterProgram||"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",messageBase64:i,exactFeeLamports:a}}}var JM=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),XM="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ek(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=XM.indexOf(o);if(i<0)return!1;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n="0"+n);let r=n.length/2;for(let o of e)if(o==="1")r++;else break;return r===32}async function ik(e={},t={}){let n=e.rpc||t.solanaRpc||process.env.SOLANA_RPC||"https://api.mainnet-beta.solana.com",r=t.fetchImpl||fetch,o=await r(`${xl}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),a=Object.entries(i),s=a.filter(([p])=>ek(p)),c=[],l=a.filter(([p])=>!ek(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${xl}/program-id-to-label`,verified:s.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<s.length;p+=90){let m=s.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[w,x]=m[g];h&&h.executable===!0&&JM.has(h.owner)?c.push({programId:w,label:x,owner:h.owner}):l.push({programId:w,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${xl}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function ak(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await vl({inputMint:vf,outputMint:tk,amount:"1000000",slippageBps:50},e)).quote.outAmount,exec:!1}}catch(t){return{ok:!1,provider:"jupiter",error:String(t?.message||t),exec:!1}}}async function vl(e={},t={}){let n=Ee(e.inputMint||e.fromMint||vf,"inputMint"),r=Ee(e.outputMint||e.toMint||tk,"outputMint"),o=ka(e.amount||e.inAmount,"amount"),i=rk(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${nk(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await I(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Sa({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function QM(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function sk(e={},t={}){let n=Ee(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Sa(e.quoteResponse,t)}:await vl(e,t),o=r.quote,i=r.solanaGuard||Sa(o,t);if(wl(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await I(`${nk(t)}/swap`,{method:"POST",body:QM({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:wl(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:wl(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:wl(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=KM(a?.swapTransaction);ok(s),Sn("jupiter",a);let c=a?.quoteResponse??a?.quote??null,l=["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"],u=!1;if(c&&typeof c=="object"){for(let m of l){let f=o?.[m],h=c?.[m];if(f==null||h==null)throw new Error(`jupiter: echoed quote is incomplete \u2014 missing ${m}`);if(String(f)!==String(h))throw new Error(`jupiter: swap response ${m} (${h}) does not match the quoted ${m} (${f}) \u2014 refusing to prepare`)}u=!0}let d=null,p=null;try{d=kf({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return R({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}Ar();Vi();$n();Er();fo();import{getAddress as eU}from"ethers";var Ef=Object.freeze(["uniswap-v2","uniswap-v3","uniswap-v4","aerodrome","curve","balancer","meteora-dlmm","pancakeswap","sushiswap"]),lk="0x0000000000000000000000000000000000000000",uk=/^0x[0-9a-fA-F]{40}$/,tU=25,kl=Object.freeze([["removalGasUsd","estimateRemovalGasUsd"],["swapCostUsd","estimateSwapCostUsd"],["bridgeCostUsd","estimateBridgeCostUsd"],["addLiquidityGasUsd","estimateAddLiquidityGasUsd"],["priceImpactUsd","estimatePriceImpactUsd"]]);function Ea(e,t){let n=String(e??"").trim();if(!n)throw new Error(`${t} is required`);if(uk.test(n))try{return eU(n)}catch{throw new Error(`${t} is not a valid EVM address`)}return n}function Sl(e,t){let n=e?.[t];if(typeof n!="function")throw new Error(`lp-liquidity-ranker: opts.${t} must be a function`);return n}function nU(e){if(!e||typeof e!="object")throw new Error("candidate must be an object");let t=Number(e.chainId);if(!Number.isInteger(t)||t<=0)throw new Error("chainId must be a positive integer");let n=String(e.venue??"").trim().toLowerCase();if(!n)throw new Error("venue is required");let r=Ea(e.poolAddress,"poolAddress"),o=e.token;if(!o||typeof o!="object")throw new Error("token is required");let i=String(o.symbol??"").trim();if(!i)throw new Error("token.symbol is required");let a=Ea(o.address,"token.address"),s=null;if(o.decimals!=null&&(s=Number(o.decimals),!Number.isInteger(s)||s<0||s>255))throw new Error("token.decimals must be a uint8 when provided");let c=Number(e.liquidityUsd);if(!Number.isFinite(c)||c<0)throw new Error("liquidityUsd must be a non-negative finite number");let l=n==="uniswap-v4"||e.isV4===!0,u=null;if(e.hook!=null){if(typeof e.hook!="object")throw new Error("hook must be an object when provided");u=Object.freeze({address:e.hook.address!=null?Ea(e.hook.address,"hook.address"):lk,dynamicFee:e.hook.dynamicFee===!0,reviewed:e.hook.reviewed===!0})}let d=e.id!=null?String(e.id):`${n}:${t}:${r}`;return Object.freeze({id:d,chainId:t,venue:n,poolAddress:r,token:Object.freeze({symbol:i,address:a,decimals:s}),liquidityUsd:c,isV4:l,hook:u})}function rU(e){if(!Ef.includes(e.venue))return`unsupported venue "${e.venue}"; supported: ${Ef.join(", ")}`;if(e.isV4){if(!e.hook)return"uniswap-v4 candidate is missing hook disclosure; failing closed";if(e.hook.dynamicFee)return"uniswap-v4 pool uses a dynamic fee; fee is not knowable in advance, failing closed";if(e.hook.address!==lk&&!e.hook.reviewed)return`uniswap-v4 pool has an unreviewed hook (${e.hook.address}); failing closed`}return null}async function oU(e,t,n){let r=Sl(n,"resolveTokenIdentity"),o;try{o=await r({chainId:e.chainId,address:e.token.address,symbol:e.token.symbol})}catch(l){return{ok:!1,reason:`identity resolution failed: ${l?.message??l}`}}if(!o||typeof o!="object")return{ok:!1,reason:"identity unresolved"};if(o.ambiguous)return{ok:!1,reason:o.reason??"ambiguous token identity"};if(!o.canonicalId)return{ok:!1,reason:"identity resolver returned no canonicalId"};if(o.canonicalId!==t.canonicalId)return{ok:!1,reason:`token resolves to canonical id "${o.canonicalId}", expected "${t.canonicalId}"`};let i=Number(o.homeChainId);if(!Number.isInteger(i)||i<=0)return{ok:!1,reason:"identity resolver returned no homeChainId"};let a;try{a=Ea(o.canonicalAddress,"identity resolver canonicalAddress")}catch(l){return{ok:!1,reason:l.message}}let s=e.token.address;return(uk.test(a)?a===s:a.toLowerCase()===String(s).toLowerCase())?{ok:!0,canonicalId:o.canonicalId,homeChainId:i,canonicalAddress:a,decimals:o.decimals??e.token.decimals??null}:{ok:!1,reason:`token address ${e.token.address} on chain ${e.chainId} does not match the canonical address ${a}; possible wrapped variant or spoof`}}async function iU(e,t,n){let r={},o=[];for(let[s,c]of kl){let l=Sl(n,c),u;try{u=await l(e,t)}catch(p){return{ok:!1,reason:`${c} failed for ${e.id}: ${p?.message??p}`}}if(u==null||!Number.isFinite(Number(u))){r[s]=null,o.push(s);continue}let d=Number(u);if(d<0)return{ok:!1,reason:`${c} returned a negative cost for ${e.id}`};r[s]=d}let i=kl.reduce((s,[c])=>s+(r[c]??0),0),a=o.length===0;return{ok:!0,costs:Object.freeze(r),missingLegs:Object.freeze(o),grossOnly:!a,measuredCostUsd:i,totalCostUsd:a?i:null,netUsd:a?t.amountUsd-i:null}}function Sf(e){return Object.freeze({id:e.id,chainId:e.chainId,venue:e.venue,poolAddress:e.poolAddress,token:e.token,liquidityUsd:e.liquidityUsd,canonicalId:e.identity.canonicalId,homeChainId:e.identity.homeChainId})}function ck(e,t){let n=null;for(let r of e){if(!n){n=r;continue}let o=t(r),i=t(n);(o>i||o===i&&r.id<n.id)&&(n=r)}return n}async function aU(e={},t={}){let n=String(e.canonicalId??"").trim();if(!n)throw new Error("lp-liquidity-ranker: canonicalId is required");let r=Number(e.amountUsd);if(!Number.isFinite(r)||r<=0)throw new Error("lp-liquidity-ranker: amountUsd must be a positive finite number");if(!Array.isArray(e.candidates)||e.candidates.length===0)throw new Error("lp-liquidity-ranker: candidates must be a non-empty array");let o=e.materialityThresholdBps??tU;if(!Number.isInteger(o)||o<0)throw new Error("lp-liquidity-ranker: materialityThresholdBps must be a non-negative integer");Sl(t,"resolveTokenIdentity");for(let[,h]of kl)Sl(t,h);let i=Object.freeze({canonicalId:n,amountUsd:r,materialityThresholdBps:o}),a=[],s=[],c=new Set,l=null;for(let h=0;h<e.candidates.length;h+=1){let g=e.candidates[h],w=g?.id!=null?String(g.id):`candidates[${h}]`,x;try{x=nU(g)}catch(E){a.push({id:w,reason:E.message});continue}if(c.has(x.id)){a.push({id:x.id,reason:"duplicate candidate id"});continue}c.add(x.id);let b=rU(x);if(b){a.push({id:x.id,reason:b});continue}let y=await oU(x,i,t);if(!y.ok){a.push({id:x.id,reason:y.reason});continue}if(l==null)l=y.homeChainId;else if(y.homeChainId!==l){a.push({id:x.id,reason:`ambiguous home chain for canonical token "${n}": got ${y.homeChainId}, expected ${l}`});continue}let S=await iU(x,i,t);if(!S.ok){a.push({id:x.id,reason:S.reason});continue}s.push({...x,identity:y,...S})}let u=[];if(s.length===0)return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:0,rejected:Object.freeze(a),deepestLiquidity:null,netBest:null,netRankingComplete:!1,preparationEligible:!1,runnersUp:Object.freeze([]),warnings:Object.freeze(["no candidate passed identity, venue, or cost validation"])});let d=ck(s,h=>h.liquidityUsd),p=s.filter(h=>!h.grossOnly&&h.netUsd!=null),m=ck(p,h=>h.netUsd);for(let h of s)h.grossOnly&&u.push(`${h.id}: gas/fees not fully accounted (missing: ${h.missingLegs.join(", ")}); missing costs were not treated as zero`);m?d.id!==m.id&&u.push(`${d.id} has the deepest liquidity ($${d.liquidityUsd}) but ${m.id} nets more after costs; these are intentionally different answers`):u.push("net-best migration is unavailable until every ranking cost leg is measured; missing gas is never treated as zero and deepest liquidity is not claimed as net-best"),p.length<s.length&&u.push("partial-cost candidates were excluded from net ranking; missing gas was not treated as zero");let f=s.filter(h=>h.id!==m?.id).sort((h,g)=>h.netUsd==null&&g.netUsd==null?h.id<g.id?-1:1:h.netUsd==null?1:g.netUsd==null?-1:g.netUsd-h.netUsd||(h.id<g.id?-1:1)).map(h=>{let g=m!=null&&h.netUsd!=null,w=g?m.netUsd-h.netUsd:null,x=g?Math.round(w/r*1e4):null;return Object.freeze({...Sf(h),netUsd:h.netUsd,totalCostUsd:h.totalCostUsd,grossOnly:h.grossOnly,missingLegs:h.missingLegs,marginUsd:w,marginBps:x,material:x!=null&&x>o})});return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:s.length,rejected:Object.freeze(a),deepestLiquidity:Sf(d),netBest:m?Object.freeze({...Sf(m),netUsd:m.netUsd,totalCostUsd:m.totalCostUsd,costs:m.costs,grossOnly:!1,missingLegs:m.missingLegs}):null,netRankingComplete:!!m&&p.length===s.length,preparationEligible:!1,runnersUp:Object.freeze(f),warnings:Object.freeze(u)})}async function dk(e={}){let t=String(e.canonicalId??"").trim(),n=Number(e.homeChainId);if(!t)throw new Error("lp-liquidity-ranker: canonicalId is required");if(!Number.isInteger(n)||n<=0)throw new Error("lp-liquidity-ranker: homeChainId must be a positive integer");if(!Array.isArray(e.canonicalAssets)||e.canonicalAssets.length===0)throw new Error("lp-liquidity-ranker: canonicalAssets must be a non-empty array");let r=new Map;for(let c of e.canonicalAssets){let l=Number(c?.chainId);if(!Number.isInteger(l)||l<=0)throw new Error("lp-liquidity-ranker: canonical asset chainId must be positive");if(r.has(l))throw new Error(`lp-liquidity-ranker: duplicate canonical asset for chain ${l}`);let u=Ea(c?.address,"canonical asset address"),d=c?.decimals==null?null:Number(c.decimals);if(d!=null&&(!Number.isInteger(d)||d<0||d>255))throw new Error("lp-liquidity-ranker: canonical asset decimals must be a uint8");r.set(l,Object.freeze({canonicalAddress:u,decimals:d}))}let o={resolveTokenIdentity:async({chainId:c})=>{let l=r.get(Number(c));return l?{canonicalId:t,homeChainId:n,...l}:{ambiguous:!0,reason:`no exact canonical asset mapping for chain ${c}`}}},i=(e.candidates??[]).map(c=>({...c,costs:c?.costs&&typeof c.costs=="object"?{...c.costs}:{}})),a=new Map(i.map(c=>[String(c?.id??`${String(c?.venue??"").toLowerCase()}:${Number(c?.chainId)}:${String(c?.poolAddress??"")}`),c.costs]));for(let[c,l]of kl)o[l]=async u=>a.get(u.id)?.[c]??null;let s=await aU({...e,canonicalId:t,candidates:i},o);return Object.freeze({...s,evidenceMode:"caller-supplied",warnings:Object.freeze(["canonical mappings, pool liquidity, and migration costs were caller-supplied and not independently live-verified",...s.warnings])})}async function pk(){return Object.freeze({ok:!0,execution:"analysis-only",supportedVenues:Ef,note:"Deepest liquidity and net-best migration are reported separately; no signing or broadcasting."})}$n();var cU=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),lU=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),uU=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function dU(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function pU(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=dU(n);if(lU.has(r)||uU.some(o=>r.includes(o)))return!0}return!1}function mk(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var mU=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function fU(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function hU(e){let t=e.match(mU)||[];for(let n of t){let r=fU(n),o=mk(r),i=o?mk(o):null;for(let a of[r,o,i])if(a&&pU(a))return!0}return!1}function fk(e){return typeof e!="string"||e.length===0?!1:cU.some(t=>t.test(e))?!0:hU(e)}var hk=/^0x[0-9a-fA-F]{40}$/,gU=new Set(["source","reviewedAt","evidenceHash","txHash"]),yU=1e4,En=e=>String(e??"").trim().toLowerCase();function bU(e,t){if(!e||typeof e!="object"||!String(e.source??"").trim())throw new Error(`lp-destination-discovery: ${t}.provenance.source is required`);if(Object.keys(e).filter(s=>!gU.has(s)).length)throw new Error(`lp-destination-discovery: ${t}.provenance contains unsupported fields`);let r=String(e.source).trim();if(r.length>512||fk(r))throw new Error(`lp-destination-discovery: ${t}.provenance.source is unsafe`);let o=e.evidenceHash==null?null:String(e.evidenceHash).trim();if(o!=null&&!/^[0-9a-f]{64}$/i.test(o))throw new Error(`lp-destination-discovery: ${t}.provenance.evidenceHash must be a sha256 digest`);let i=e.txHash==null?null:String(e.txHash).trim();if(i!=null&&!/^0x[0-9a-f]{64}$/i.test(i))throw new Error(`lp-destination-discovery: ${t}.provenance.txHash must be an EVM transaction hash`);let a=e.reviewedAt==null?null:String(e.reviewedAt).trim();if(a!=null&&!Number.isFinite(Date.parse(a)))throw new Error(`lp-destination-discovery: ${t}.provenance.reviewedAt must be ISO time`);return Object.freeze({source:r,reviewedAt:a,evidenceHash:o,txHash:i})}function gk(e,t){if(!e||typeof e!="object")throw new Error(`lp-destination-discovery: ${t} is required`);let n=Number(e.chainId),r=String(e.token0??"").trim(),o=String(e.token1??"").trim();if(!Number.isInteger(n)||n<=0)throw new Error(`lp-destination-discovery: ${t}.chainId must be positive`);if(!hk.test(r)||!hk.test(o)||En(r)===En(o))throw new Error(`lp-destination-discovery: ${t} requires distinct exact token0/token1 addresses`);return Object.freeze({...e,chainId:n,token0:r,token1:o,provenance:bU(e.provenance,t)})}function wU(e,t){if(!String(e.dexId??"").toLowerCase().includes("v4"))return{eligible:!0,reason:null};let n=t.v4;if(!n)return{eligible:!1,reason:"Uniswap V4 metadata is unreviewed"};if(n.dynamicFee===!0)return{eligible:!1,reason:"Uniswap V4 dynamic fee is not preparation-eligible"};let r=En(n.hook);return r&&r!=="0x0000000000000000000000000000000000000000"&&n.reviewed!==!0?{eligible:!1,reason:"Uniswap V4 hook is unreviewed"}:{eligible:!0,reason:null}}function xU(e){let t=e?.best;if(!t||t.quality!=="FULL")return null;let n=Number(t.gasUsd),r=Number(t.feeUsd);return t.gasUsd==null||t.feeUsd==null||!Number.isFinite(n)||!Number.isFinite(r)?null:n+r}async function yk({source:e,destination:t,amountIn:n,index:r},o,i){if(n==null)return{requested:!1,measured:!1,costUsd:null,quote:null};let a=e[`token${r}`],s=t[`token${r}`];if(e.chainId===t.chainId&&En(a)===En(s))return{requested:!0,measured:!0,costUsd:0,quote:null,kind:"none",amountIn:String(n)};let c=e.chainId===t.chainId?{chainId:e.chainId,tokenIn:a,tokenOut:s,amountIn:String(n)}:{fromChainId:e.chainId,toChainId:t.chainId,tokenIn:a,tokenOut:s,amountIn:String(n)},l=e.chainId===t.chainId?"swap":"bridge";try{let u=l==="swap"?await o.bestSwapRoute(c,i):await o.bestBridgeRoute(c,i),d=xU(u);return{requested:!0,measured:d!=null,costUsd:d,quote:u,kind:l,amountIn:String(n)}}catch(u){return{requested:!0,measured:!1,costUsd:null,quote:null,kind:l,amountIn:String(n),error:u?.message??String(u)}}}function vU(e){let t=e.minLiquidityBpsOfDeepest??yU;if(!Number.isInteger(t)||t<1||t>1e4)throw new Error("lp-destination-discovery: minLiquidityBpsOfDeepest must be an integer from 1 to 10000");if(e.minLiquidityUsd==null)return{bps:t,minLiquidityUsd:null};let n=Number(e.minLiquidityUsd);if(!Number.isFinite(n)||n<0)throw new Error("lp-destination-discovery: minLiquidityUsd must be a non-negative number");return{bps:t,minLiquidityUsd:n}}function kU(e,t,n){if(e.venueReviewEligible===!1)return{destinationEligible:!1,destinationIneligibleReason:e.ineligibleReason};if(e.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is unknown"};let r=Number(e.liquidityUsd);if(!Number.isFinite(r)||r<=0)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is not positive"};if(n.minLiquidityUsd!=null&&r<n.minLiquidityUsd)return{destinationEligible:!1,destinationIneligibleReason:`liquidity $${r} is below the $${n.minLiquidityUsd} floor`};if(!t||t.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"no eligible deepest pool"};let o=Number(t.liquidityUsd)*n.bps/1e4;return r<o?{destinationEligible:!1,destinationIneligibleReason:`shallower than the deepest eligible pool ($${r} < $${o} required)`}:{destinationEligible:!0,destinationIneligibleReason:null}}function bk(e,t,n="max"){return[...e].sort((r,o)=>(n==="max"?t(o)-t(r):t(r)-t(o))||String(r.poolAddress).localeCompare(String(o.poolAddress)))[0]??null}async function wk(e={},t={}){let n=gk(e.sourcePair,"sourcePair");if(!Array.isArray(e.destinationPairs))throw new Error("lp-destination-discovery: destinationPairs must be an array");let r=e.destinationPairs.map((k,A)=>gk(k,`destinationPairs[${A}]`)),o=new Map;for(let k of r){if(o.has(k.chainId))throw new Error(`lp-destination-discovery: duplicate destination mapping for chain ${k.chainId}`);o.set(k.chainId,k)}let i=vU(e),a=t.chainConfigs??(await Promise.resolve().then(()=>(Lr(),vm))).CHAIN_CONFIGS,s=e.amounts?.token0!=null||e.amounts?.token1!=null,c=s&&r.some(k=>k.chainId===n.chainId&&(En(k.token0)!==En(n.token0)||En(k.token1)!==En(n.token1))),l=s&&r.some(k=>k.chainId!==n.chainId),u=c&&!t.bestSwapRoute||l&&!t.bestBridgeRoute?await Promise.resolve().then(()=>(om(),Ow)):null,d={discoverExactPairPools:t.discoverExactPairPools??wb,bestSwapRoute:t.bestSwapRoute??u?.bestSwapRoute,bestBridgeRoute:t.bestBridgeRoute??u?.bestBridgeRoute},p=e.limit??10,m=await Promise.all(a.map(async k=>{let A=o.get(Number(k.chainId));if(!k.dexscreenerSlug)return{chainId:k.chainId,chain:k.name??k.key??null,status:"unavailable",reason:"DexScreener coverage slug is not configured",pools:[]};if(!A)return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"unavailable",reason:"no explicit provenanced destination token0/token1 mapping",pools:[]};try{let T=await d.discoverExactPairPools({chainSlug:k.dexscreenerSlug,token0:A.token0,token1:A.token1,limit:p,dexIds:A.dexIds},t);return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"available",mapping:A,pools:T}}catch(T){return{chainId:k.chainId,chain:k.name??k.key??null,chainSlug:k.dexscreenerSlug,status:"unavailable",reason:T?.message??String(T),mapping:A,pools:[]}}})),f=m.flatMap(k=>k.pools.map(A=>({...A,chainId:Number(k.chainId),mapping:k.mapping}))),h=e.amounts??{},g=await Promise.all(f.map(async k=>{let[A,T]=await Promise.all([yk({source:n,destination:k.mapping,amountIn:h.token0,index:0},d,t),yk({source:n,destination:k.mapping,amountIn:h.token1,index:1},d,t)]),_=!(A.requested||T.requested)||[A,T].filter(O=>O.requested).every(O=>O.measured),$=_?[A,T].reduce((O,F)=>O+(F.costUsd??0),0):null,M=wU(k,k.mapping);return Object.freeze({...k,mappingProvenance:k.mapping.provenance,legs:Object.freeze([A,T]),fullyMeasured:_,costUsd:$,preparationEligible:!1,venueReviewEligible:M.eligible,ineligibleReason:M.reason})})),w=bk(g.filter(k=>k.liquidityUsd!=null),k=>Number(k.liquidityUsd)),x=g.map(k=>Object.freeze({...k,...kU(k,w,i)})),b=x.find(k=>k.destinationEligible&&w&&k.poolAddress===w.poolAddress&&k.chainId===w.chainId)??null,y=x.filter(k=>k.fullyMeasured&&k.destinationEligible),S=bk(y,k=>k.costUsd,"min"),E=x.filter(k=>k.destinationEligible===!1&&k.destinationIneligibleReason?.includes("shallower")),v=w&&x.some(k=>k.poolAddress===w.poolAddress&&k.chainId===w.chainId&&k.destinationEligible===!1);return Object.freeze({ok:!0,analysisOnly:!0,sourcePair:n,coverage:Object.freeze(m),routes:Object.freeze(x),deepestLiquidity:w,recommendedDestination:b,migrationCostBest:S,netBest:null,rankedOn:"liquidity",netRankingComplete:!1,preparationEligible:!1,liquidityFloor:Object.freeze(i),warnings:Object.freeze([...y.length<x.filter(k=>k.fullyMeasured).length?["partial-cost or thin-book routes were excluded from migration-cost comparison; missing gas was not treated as zero and thinner pools are not destinations"]:[],...E.length?[`${E.length} shallower pool(s) are not destination-eligible; a thinner V3 book is never recommended over a deeper V4 book`]:[],...v?["deepest book is not destination-eligible (unreviewed/dynamic-fee V4 or liquidity floor); thinner pools are still not recommended"]:[],"net-best migration is unavailable until destination token values and final add-liquidity gas/impact are measured; deepest liquidity is not claimed as net-best"])})}async function xk(){let{CHAIN_CONFIGS:e}=await Promise.resolve().then(()=>(Lr(),vm));return{ok:!0,execution:"analysis-only",configuredChains:e.length}}ve();tt();ee();import{Interface as Sk,getAddress as Ia,isAddress as EU}from"ethers";var Zn={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},IU=[1,50,100,200,2e3],vk=new Sk(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),AU=new Sk(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Ek="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ik="0x0000000000000000000000000000000000000000";function Ak(e){let t=Number(e),n=Zn[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Zn).join(", ")})`);return{chainId:t,...n}}function kk(e,t){let n=Zn[Number(t)];if(!e||e===Ek||e===Ik||/^eth$/i.test(String(e)))return Ia(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ia(n.weth);if(/^usdc$/i.test(r))return Ia(n.usdc);if(!EU(r))throw new Error(`invalid token address: ${e}`);return Ia(r)}async function El(e={},t={}){let{chainId:n,quoter:r,router:o}=Ak(e.chainId??8453),i=kk(e.tokenIn||"WETH",n),a=kk(e.tokenOut||Zn[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...IU],u=await Promise.all(c.map(async p=>{let m=vk.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await W(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=vk.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return pe({venue:"aerodrome",chainId:n,chain:Zn[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _k(e={},t={}){let n=Number(e.chainId??8453),r=Ak(n),o=Ia(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Ek||i===Ik||/^eth$/i.test(i),s=await El(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=AU.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return R({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:Pe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Pk(e={}){let t=Number(e.chainId??8453);try{let n=await El({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:Zn[t]?.router,quoter:Zn[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Tk(){return Object.entries(Zn).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}Gi();Bc();Xi();Hp();ee();var PU=96*1024,Nk=50;function TU(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>PU)throw new Error("x402: invalid PAYMENT-REQUIRED payload");if(t.startsWith("{"))try{return JSON.parse(t)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED JSON")}if(!/^[A-Za-z0-9+/_-]+={0,2}$/.test(t)||t.length%4===1)throw new Error("x402: invalid PAYMENT-REQUIRED Base64");let n=t.replace(/-/g,"+").replace(/_/g,"/"),r=n+"=".repeat((4-n.length%4)%4);try{let o=Buffer.from(r,"base64").toString("utf8");if(!o.trim().startsWith("{"))throw new Error("shape");return JSON.parse(o)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED Base64 JSON")}}function In(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function Ok(e,t){let n=In(e,t);if(!/^\d+$/.test(n))throw new Error(`x402: ${t} must be atomic units`);let r=BigInt(n);if(r<=0n)throw new Error(`x402: ${t} must be positive`);return r.toString()}function NU(e){if(!e||typeof e!="object"||Array.isArray(e))return Object.freeze({});let t={};for(let n of["name","version"])typeof e[n]=="string"&&e[n].trim()&&(t[n]=e[n].trim());return Object.freeze(t)}function CU(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=In(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:In(e.network,`accepts[${t}].network`),amount:Ok(e.amount,`accepts[${t}].amount`),asset:In(e.asset,`accepts[${t}].asset`),payTo:In(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:NU(e.extra)})}function If(e){let t=TU(e);if(t.x402Version!==2)throw new Error("x402: only x402Version 2 is supported");if(!Array.isArray(t.accepts)||t.accepts.length===0||t.accepts.length>Nk)throw new Error(`x402: accepts must contain 1-${Nk} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:In(t.resource.url,"resource.url"),description:String(t.resource.description||""),mimeType:String(t.resource.mimeType||"")}):null;if(!n)throw new Error("x402: resource required");let r=Object.freeze(t.accepts.map(CU));for(let o of r)if(!Number.isInteger(o.maxTimeoutSeconds)||o.maxTimeoutSeconds<=0)throw new Error("x402: maxTimeoutSeconds must be a positive integer");return Object.freeze({x402Version:2,resource:n,accepts:r})}function Ck(e,t){return String(e)===String(t)}function OU(e,t={}){let n=If(e),r=In(t.network,"network"),o=In(t.asset,"asset"),i=In(t.payTo,"payTo"),a=BigInt(Ok(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&Ck(l.asset,o)&&Ck(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function Rk(e={}){return e.paymentRequired??e.header??e.body}function Lk(e={}){return If(Rk(e))}function $k(e={},t={}){let n=If(Rk(e)),r=OU(n,e);return R({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function Bk(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}q();qt();var LU="https://api.bankr.bot";function Af(e={}){return Fe({provider:"bankr",defaultUrl:LU,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function Mk(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function $U(e={}){let t=Mk(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function Uk(e={},t=!1){let n=$U(e),r=Af(e);return Me({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function Fk(e,t={}){return I(`${Af(t).baseUrl}${e}`,{headers:Uk(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function _f(e={}){return Fk("/wallet/me",e)}async function Dk(e={}){return Fk("/wallet/portfolio",e)}function Aa(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function BU(e){let t=Aa(e,"amount");if(!/^\d+(?:\.\d+)?$/.test(t)||Number(t)<=0)throw new Error("bankr: amount must be a positive decimal string");return t}async function qk(e={},t={}){let n={fromChain:Aa(e.fromChain,"fromChain"),fromToken:Aa(e.fromToken,"fromToken"),toChain:Aa(e.toChain,"toChain"),toToken:Aa(e.toToken,"toToken"),amount:BU(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return I(`${Af(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:Uk(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function Hk(e={}){if(!Mk(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await _f(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var UU=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function _a(e,t={}){if(!e?.type)throw new Error("hlWsSnapshot requires subscription.type");let n=t.timeoutMs??8e3,r=t.maxMessages??1,o=t.WebSocket||globalThis.WebSocket;if(!o)throw new Error("WebSocket not available in this runtime");let i=t.url||UU,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function jk(e={}){try{let t=await _a({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function zk(e={}){let t=await _a({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Vk(e,t={}){if(!e)throw new Error("coin required");let n=await _a({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var DU=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Il(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let a=t.url||DU,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function Wk(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Il([t],{...e,maxMessages:1});return{ok:!0,ms:n.ms,got:!!n.last,partial:n.partial||!1}}catch(n){return{ok:!1,error:String(n.message||n).slice(0,160)}}}async function Gk(e,t={}){if(!e)throw new Error("assetId required");let n=await Il([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}q();var HU="https://api.binance.com",jU="https://fapi.binance.com",zU=8;function Pf(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||HU).replace(/\/$/,"")}function Al(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||jU).replace(/\/$/,"")}function Pa(e){return{error:String(e.message||e).slice(0,200)}}function kt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ta(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function _l(e={}){try{let t=await I(`${Pf(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function Pl(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await I(`${Pf(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:kt(o?.price??o?.lastPrice),volume24h:kt(o?.volume),quoteVolume24h:kt(o?.quoteVolume),raw:o}}catch(r){return Pa(r)}}async function Kk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Al(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Pf(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,a=await I(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return Ca({venue:"binance",market:o?"perp":"spot",symbol:n,bids:a?.bids,asks:a?.asks,raw:a})}catch(i){return Pa(i)}}async function Na(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await I(`${Al(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||zU,a=kt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:kt(o?.markPrice),indexPrice:kt(o?.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:kt(o?.nextFundingTime),raw:o??null}}catch(r){return Pa(r)}}async function Yk(e={},t={}){let n=await Na(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function Jk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await I(`${Al(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:kt(r?.openInterest),time:kt(r?.time),raw:r??null}}catch(r){return Pa(r)}}async function Xk(e={},t={}){let n=Ta(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await I(`${Al(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(a=>({fundingTime:kt(a?.fundingTime),fundingRate:kt(a?.fundingRate)}))}}catch(o){return Pa(o)}}function Ca({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let a=m=>(Array.isArray(m)?m:[]).map(f=>{let h=kt(Array.isArray(f)?f[0]:f?.price),g=kt(Array.isArray(f)?f[1]:f?.size);return h==null||g==null?null:{price:h,size:g}}).filter(Boolean),s=a(r),c=a(o),l=s[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:s,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}q();var VU="https://www.okx.com",WU=8;function Lo(e={}){return(e.baseUrl||process.env.OKX_API_URL||VU).replace(/\/$/,"")}function Oa(e){return{error:String(e.message||e).slice(0,200)}}function gt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ra(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function $o(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function Tl(e={}){try{let t=await I(`${Lo(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:$o(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function Nl(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Ra(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await I(`${Lo(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:gt(i.last),bestBid:gt(i.bidPx),bestAsk:gt(i.askPx),volume24h:gt(i.vol24h),quoteVolume24h:gt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return Oa(o)}}async function Zk(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Ra(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await I(`${Lo(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=$o(i)[0];return a?Ca({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:a.bids,asks:a.asks,raw:a}):{error:`okx books empty for ${r}`}}catch(i){return Oa(i)}}async function Cl(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await I(`${Lo(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=$o(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||WU,a=gt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:a,nextFundingRate:gt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:gt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return Oa(r)}}async function Ol(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await I(`${Lo(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:gt(i.markPx),time:gt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return Oa(o)}}async function eS(e={},t={}){let n=Ra(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await I(`${Lo(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=$o(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:gt(i.oiCcy??i.oi),openInterestContracts:gt(i.oi),openInterestUsd:gt(i.oiUsd),time:gt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return Oa(o)}}q();var GU="https://api.bybit.com",KU=8;function La(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||GU).replace(/\/$/,"")}function $a(e){return{error:String(e.message||e).slice(0,200)}}function ze(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Rl(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function Tf(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Ba(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function Ll(e={}){try{let t=await I(`${La(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Ba(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function nS(e,t){let n=Tf(e.market),r=Rl(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await I(`${La(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ba(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function $l(e={},t={}){try{let n=await nS(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:ze(r.lastPrice),bestBid:ze(r.bid1Price),bestAsk:ze(r.ask1Price),markPrice:ze(r.markPrice),indexPrice:ze(r.indexPrice),volume24h:ze(r.volume24h),quoteVolume24h:ze(r.turnover24h),raw:r}}catch(n){return $a(n)}}async function rS(e={},t={}){let n=Tf(e.market),r=Rl(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await I(`${La(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Ba(i);return a?Ca({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:a.b,asks:a.a,raw:a}):{error:`bybit orderbook empty for ${r}`}}catch(i){return $a(i)}}async function Ma(e={},t={}){try{let n=await nS({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||KU,a=ze(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ze(r.markPrice),indexPrice:ze(r.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:ze(r.nextFundingTime),openInterest:ze(r.openInterest),raw:r}}catch(n){return $a(n)}}async function oS(e={},t={}){let n=await Ma(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function iS(e={},t={}){let n=Rl(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=Tf(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let a=await I(`${La(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Ba(a)?.list,c=Array.isArray(s)?s[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:ze(c.openInterest),time:ze(c.timestamp),history:(Array.isArray(s)?s:[]).map(l=>({openInterest:ze(l?.openInterest),timestamp:ze(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(a){return $a(a)}}async function aS(e={},t={}){let n=Rl(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await I(`${La(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ba(o)?.list,a=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:a.length,history:a.map(s=>({fundingRate:ze(s?.fundingRate),fundingTime:ze(s?.fundingRateTimestamp)}))}}catch(o){return $a(o)}}ft();var Nf=["binance","okx","bybit","hyperliquid"],cS=1;function Ua(e){return{error:String(e.message||e).slice(0,200)}}function Qe(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function YU(e,t){return e==null||!t?null:e*(8760/t)*100}function Cf(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function JU(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Nf,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Nf.filter(i=>r.has(i));return o.length?o:Nf}async function XU(e={},t={}){let n=Cf(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await mt(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let a=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(a<0)return{error:`hyperliquid has no perp for ${n}`};let s=i[a]||{},c=Qe(s.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Qe(s.markPx),indexPrice:Qe(s.oraclePx),midPrice:Qe(s.midPx),fundingRate:c,fundingIntervalHours:cS,fundingAprPct:YU(c,cS),openInterest:Qe(s.openInterest)}}catch(r){return Ua(r)}}async function QU(e={},t={}){let n=Cf(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await Ht(t),o=Qe(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return Ua(r)}}async function ZU(e={},t={}){let[n,r]=await Promise.all([Cl(e,t).catch(Ua),Ol(e,t).catch(Ua)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Qe(r.markPrice),...r?.error?{markError:r.error}:{}}}async function er(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,Ua(n)]}}async function Of(e={},t={}){let n=Cf(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=JU(e),i=[];o.includes("binance")&&(i.push(er("binance:perp",Na({coin:n,quote:r},t))),i.push(er("binance:spot",Pl({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(er("okx:perp",ZU({coin:n,quote:r},t))),i.push(er("okx:spot",Nl({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(er("bybit:perp",Ma({coin:n,quote:r},t))),i.push(er("bybit:spot",$l({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(er("hyperliquid:perp",XU({coin:n},t))),i.push(er("hyperliquid:spot",QU({coin:n},t))));let a=await Promise.all(i),s={};for(let[c,l]of a){let[u,d]=c.split(":");s[u]=s[u]||{},s[u][d]=l}return{coin:n,quote:r,venues:o,legs:s}}function lS(e){return!e||e.error?null:Qe(e.price)??Qe(e.mid)??null}function eF(e){return!e||e.error?null:Qe(e.markPrice)??Qe(e.midPrice)??null}async function Rf(e={},t={}){let n=await Of(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:a}=n,s=[];for(let f of i){let h=lS(a[f]?.spot);h!=null&&h>0&&s.push(h)}let c=[...s].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=a[f]?.perp,g=a[f]?.spot,w=eF(h),x=lS(g),b=x??l,y=w!=null&&b?(w-b)/b*1e4:null;u.push({venue:f,symbol:h?.symbol??g?.symbol??r,markPrice:w,spotPrice:x,spotSource:x!=null?f:l!=null?"cross-venue-median":null,basisBps:y,fundingRate:h&&!h.error?Qe(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Qe(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Qe(h.fundingAprPct):null,openInterest:h&&!h.error?Qe(h.openInterest):null,errors:[h?.error,g?.error].filter(Boolean)})}let d=tF(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function tF(e=[]){let t=e.filter(r=>Qe(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],a=t[o],s=i.fundingAprPct-a.fundingAprPct,c=s>0?a.venue:i.venue,l=s>0?i.venue:a.venue;n.push({pair:`${i.venue}/${a.venue}`,aprSpreadPct:Math.abs(s),signedAprSpreadPct:s,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function uS(e={},t={}){let n=await Rf(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function dS(e={}){try{let t=await Promise.all([_l(e).catch(()=>({ok:!1})),Tl(e).catch(()=>({ok:!1})),Ll(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}import gS from"node:path";import{homedir as hF}from"node:os";import{createHash as gF,randomUUID as yF}from"node:crypto";import ge from"node:fs";import Bl from"node:path";import{createHash as rF,randomUUID as pS}from"node:crypto";var Lf=1,zt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function tr(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(tr).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${tr(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function mS(e){return rF("sha256").update(tr(e)).digest("hex")}function Ml(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Ul(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function fS(e){ge.mkdirSync(e,{recursive:!0,mode:448});try{ge.chmodSync(e,448)}catch{}}function $f(e){try{let t=ge.statSync(e);return{...JSON.parse(ge.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function Bo({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>pS()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let b=n();return r(b),{schemaVersion:Lf,kind:t,generation:0,data:b}}function d(b){let y;try{y=JSON.parse(b)}catch(v){throw new zt(`corrupt ${t} snapshot: invalid JSON (${v.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new zt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==Lf)throw new zt(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new zt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:S,...E}=y;if(typeof S!="string"||!/^[a-f0-9]{64}$/.test(S)||mS(E)!==S)throw new zt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(v){throw new zt(`corrupt ${t} snapshot: ${v.message}`,"STORE_CORRUPT")}return E}function p(){if(!ge.existsSync(e))return u();let b=ge.statSync(e);if(!b.isFile()||b.size>i)throw new zt(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ge.chmodSync(e,384)}catch{}return d(ge.readFileSync(e,"utf8"))}function m(){fS(Bl.dirname(e));let b=Ml(o),y=String(c()),S=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:b})}
148
148
  `,E=()=>{let T;try{return T=ge.openSync(l,"wx",384),ge.writeFileSync(T,S,"utf8"),ge.fsyncSync(T),ge.closeSync(T),{lockId:y}}catch(C){let _=T!==void 0;if(_)try{ge.closeSync(T)}catch{}if(_)try{ge.unlinkSync(l)}catch{}if(C?.code!=="EEXIST")throw C;return null}},k=Ml(o)+s,A=new Int32Array(new SharedArrayBuffer(4));for(;;){let T=E();if(T)return T;let C=Ml(o),_=$f(l),$=!1;if(_){let O=C-Number(_.acquiredAt??_.mtimeMs);$=Number.isFinite(O)&&O>=a}else try{$=C-ge.statSync(l).mtimeMs>=a}catch{$=!1}if($){let O=$f(l);if(_?O?.lockId===_.lockId:O===null){try{ge.unlinkSync(l)}catch(L){if(L?.code!=="ENOENT")throw L}continue}}let M=k-C;if(M<=0)throw new zt(`${t} store is busy`,"STORE_BUSY");Atomics.wait(A,0,0,Math.min(10,M))}}function f(b){if($f(l)?.lockId===b.lockId)try{ge.unlinkSync(l)}catch(S){if(S?.code!=="ENOENT")throw S}}function h(b){r(b.data);let y={...b,integrity:mS(b)},S=`${tr(y)}
149
149
  `;if(Buffer.byteLength(S)>i)throw new zt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let E=Bl.dirname(e);fS(E);let v=Bl.join(E,`.${Bl.basename(e)}.${process.pid}.${pS()}.tmp`),k;try{k=ge.openSync(v,"wx",384),ge.writeFileSync(k,S,"utf8"),ge.fsyncSync(k),ge.closeSync(k),k=void 0,ge.renameSync(v,e);try{ge.chmodSync(e,384)}catch{}try{let A=ge.openSync(E,"r");try{ge.fsyncSync(A)}finally{ge.closeSync(A)}}catch{}}finally{if(k!==void 0)try{ge.closeSync(k)}catch{}try{ge.unlinkSync(v)}catch(A){if(A?.code!=="ENOENT")throw A}}}function g(){return Ul(p().data)}function w(){let b=p();return{schemaVersion:b.schemaVersion,kind:b.kind,generation:b.generation,data:Ul(b.data)}}function x(b){if(typeof b!="function")throw new TypeError("mutator must be a function");let y=m();try{let S=p(),E=Ul(S.data),v=b(E,{generation:S.generation,now:Ml(o)});return r(E),h({schemaVersion:Lf,kind:t,generation:S.generation+1,data:E}),Ul(v)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:w,mutate:x})}import{wordlists as oF}from"ethers";var iF=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),aF=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],sF=new Set([12,15,18,21,24]);function cF(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return sF.has(t.length)&&t.every(n=>oF.en.getWordIndex(n)>=0)}var lF=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,uF=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,dF=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function pF(e){let t=hS(e);return dF.has(t)||uF.test(t)}var Fa=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function hS(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function mF(e){let t=hS(e);return[...iF].some(n=>t.includes(n))}function fF(e,t,n){if(typeof t=="string"){if(aF.some(r=>r.test(t))||cF(t))throw new Fa(n);if(lF.test(t)&&!pF(e))throw new Fa(n)}}function Bf(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return fF(n,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)=>Bf(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(mF(o))throw new Fa(i);e[o]!==void 0&&(r[o]=Bf(e[o],i,o))}return r}function An(e){return Bf(e)}var Dl=1,yS="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",tX=Object.freeze(["listing","offer","arm","instruct"]),bF=Object.freeze(["open","cancelled","expired","armed","submitted"]),nX=Object.freeze(["arm","sign-and-broadcast"]),wF=Object.freeze({protocol:"oracle-a2a/1",name:"oracle-local-marketplace",brand:"Oracle",publisher:"Oracle",product:"Oracle",role:"Oracle owner-local P2 catalog",consultOnly:!0,remoteDelegation:!1,pluginExecution:!1,refusesSignHash:!0,skills:Object.freeze(["list-local-listings"]),note:"Oracle consult-only local Agent Card. Untrusted A2A text cannot create, fill, cancel, sign, or broadcast listings. Existing marketplace providers are unchanged. No plugin pack loader."}),xF=/^(?:0|[1-9][0-9]*)$/,vF=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,kF=/^0x[a-fA-F0-9]{40}$/,SF=/^0x[a-fA-F0-9]{64}$/,EF=/[\u0000-\u001f\u007f]/,IF=new Set(bF),Ff=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function te(e,t){throw new Ff(e,t)}function Dr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Dr(t);Object.freeze(e)}return e}function qa(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&te(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||EF.test(o))&&te(`${t} is invalid`),r?o.toLowerCase():o}function rt(e,t){let n=qa(e,t,{max:128});return vF.test(n)||te(`${t} must be a bounded id`),n}function Da(e,t,{positive:n=!1}={}){typeof e=="number"&&te(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return xF.test(r)||te(`${t} must be a canonical integer string`),n&&r==="0"&&te(`${t} must be positive`),r}function Fr(e,t){let n=qa(e,t,{max:42,lower:!0});return kF.test(n)||te(`${t} must be a 20-byte EVM address`),n}function bS(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&te(`${t} must be a plain object`),e}function Ur(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&te("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Mf(e){return new Date(e).toISOString()}function AF(e){return gF("sha256").update(tr(e),"utf8").digest("hex")}function _F(e=process.env){let t=e.ORACLE_CONFIG_DIR||gS.join(hF(),".config","oracle");return gS.join(t,"local-marketplace.v1.json")}function Fl(e){let t=e.status==="submitted";return Dr({schemaVersion:Dl,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:IF.has(e.status)?e.status:te("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>Dr({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:yS,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function PF(e){(!e||e.schemaVersion!==Dl||!Array.isArray(e.listings))&&te("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&te("marketplace capacity exceeded","STORE_LIMIT")}function Uf(e,t){return Dr({schemaVersion:Dl,recordType:"local-marketplace-armed",listingId:e.listingId,offerId:t.offerId,tenantId:e.tenantId,seller:e.seller,buyer:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId,listingHash:e.listingHash,unsigned:{kind:"local-p2-fill",from:e.seller,to:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId},review:`Local P2 fill ${e.listingId} is armed for the owner-local signer: seller ${e.seller} transfers ${t.amount} ${e.asset} to ${t.buyer} at ${e.price} on chain ${e.chainId}. Sign and broadcast still require an explicit instruction.`,label:yS,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function TF(e,t,n){typeof e=="string"&&te("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=bS(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&te("generic signHash is refused","SIGNHASH_REFUSED");let o=Fr(r.from??r.offerer??t.seller,"artifact.from"),i=Fr(r.to??r.recipient??n.buyer,"artifact.to"),a=Da(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&te("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&te("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&te("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&te("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function NF(e,t){if(e==null)return{action:"arm"};let n=bS(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&te("generic signHash is refused","SIGNHASH_REFUSED");let r=qa(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&te("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&te("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&te("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&te("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&te("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&te("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function wS({filePath:e=_F(),clock:t=()=>Date.now(),idFactory:n=()=>yF()}={}){let r=Bo({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Dl,listings:[]}),validateData:PF});function o(h,g){return h.tenantId===g}function i(h,g){return h.status==="open"&&Date.parse(h.expiresAt)<=g&&(h.status="expired"),h}function a(h={}){An(h);let g=rt(h.tenantId,"tenantId"),w=Fr(h.seller,"seller"),x=qa(h.asset,"asset",{max:128}),b=Da(h.amount,"amount",{positive:!0}),y=Da(h.price,"price",{positive:!0}),S=Da(h.chainId,"chainId",{positive:!0}),E=Ur(t),v=Mf(E),k=h.expiresAt==null?Mf(E+864e5):qa(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(k))||Date.parse(k)<=E)&&te("expiresAt must be after now");let A=rt(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(T=>{T.listings.some($=>$.listingId===A)&&te("listingId already exists","DUPLICATE");let C={listingId:A,tenantId:g,seller:w,asset:x,amount:b,price:y,chainId:S,status:"open",createdAt:v,expiresAt:k,offers:[],custody:"none",execution:"armed-local"},_={...C,listingHash:AF(C)};return T.listings.push(_),Fl(_)})}function s({tenantId:h}={}){let g=rt(h,"tenantId"),w=Ur(t);return Dr(r.read().listings.filter(x=>o(x,g)).map(x=>Fl(i({...x,offers:x.offers.map(b=>({...b}))},w))))}function c({tenantId:h,listingId:g,actor:w}={}){let x=rt(h,"tenantId"),b=rt(g,"listingId"),y=Fr(w,"actor"),S=Ur(t);return r.mutate(E=>{let v=E.listings.find(k=>o(k,x)&&k.listingId===b);return v||te("listing not found","NOT_FOUND"),i(v,S),v.seller!==y&&te("only the seller can cancel","FORBIDDEN"),v.status!=="open"&&te("listing is not open","NOT_OPEN"),v.status="cancelled",Fl(v)})}function l(h={}){An(h);let g=rt(h.tenantId,"tenantId"),w=rt(h.listingId,"listingId"),x=Fr(h.buyer,"buyer"),b=Da(h.amount,"amount",{positive:!0}),y=Ur(t),S=rt(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(E=>{let v=E.listings.find(k=>o(k,g)&&k.listingId===w);return v||te("listing not found","NOT_FOUND"),i(v,y),v.status!=="open"&&te("listing is not open","NOT_OPEN"),v.seller===x&&te("seller cannot offer on their own listing","FORBIDDEN"),v.offers.some(k=>k.offerId===S)&&te("offerId already exists","DUPLICATE"),v.offers.push({offerId:S,buyer:x,amount:b,status:"open",createdAt:Mf(y)}),Fl(v)})}function u(h,{tenantId:g,listingId:w,offerId:x,actor:b,now:y,allowed:S=["open","armed"]}){let E=h.listings.find(k=>o(k,g)&&k.listingId===w);E||te("listing not found","NOT_FOUND"),i(E,y),S.includes(E.status)||te("listing is not open","NOT_OPEN"),E.seller!==b&&te("only the seller can arm a fill","FORBIDDEN");let v=E.offers.find(k=>k.offerId===x);return(!v||!["open","armed"].includes(v.status))&&te("offer not found","NOT_FOUND"),{row:E,offer:v}}function d({tenantId:h,listingId:g,offerId:w,actor:x}={}){let b=rt(h,"tenantId"),y=rt(g,"listingId"),S=rt(w,"offerId"),E=Fr(x,"actor"),v=Ur(t);return r.mutate(k=>{let{row:A,offer:T}=u(k,{tenantId:b,listingId:y,offerId:S,actor:E,now:v});return A.status="armed",T.status="armed",Uf(A,T)})}async function p({tenantId:h,listingId:g,offerId:w,actor:x,instruction:b,executor:y}={}){let S=rt(h,"tenantId"),E=rt(g,"listingId"),v=rt(w,"offerId"),k=Fr(x,"actor"),A=Ur(t),T=r.mutate(L=>{let{row:D,offer:Q}=u(L,{tenantId:S,listingId:E,offerId:v,actor:k,now:A,allowed:["open","armed"]}),Y=NF(b,D);return D.status="armed",Q.status="armed",{armed:Uf(D,Q),instruction:Y,listingHash:D.listingHash}});if(T.instruction.action==="arm")return T.armed;let C=r.read().listings.find(L=>L.listingId===E&&L.tenantId===S),_=C?.offers.find(L=>L.offerId===v),$=TF(T.instruction.artifact,C,_);(!y||typeof y.executeConfirmedArtifact!="function")&&te("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&te("generic signHash executors are refused","SIGNHASH_REFUSED");let M=await y.executeConfirmedArtifact($,T.instruction.nonce,y),O=M?.receipt?.transactionHash??M?.transactionHash;(typeof O!="string"||!SF.test(O))&&te("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let F=M?.receipt?.status??M?.status;return F!==1&&F!=="0x1"&&te("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(L=>{let{row:D,offer:Q}=u(L,{tenantId:S,listingId:E,offerId:v,actor:k,now:Ur(t),allowed:["armed"]});return D.status="submitted",Q.status="submitted",D.transactionHash=O.toLowerCase(),Dr({...Uf(D,Q),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:D.transactionHash,review:`Local P2 fill ${D.listingId} signed and broadcast through the instructed local signer. transactionHash=${D.transactionHash}`})})}function m({tenantId:h,text:g}={}){return rt(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&te("consult text required"),Dr({accepted:!1,reason:"untrusted consult text cannot create, fill, or cancel listings",custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1})}function f(){return wF}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import xS from"node:path";import{homedir as CF}from"node:os";import{createHash as OF,randomUUID as RF}from"node:crypto";var Hl=1,vS="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",lX=Object.freeze(["open","cancelled","armed","submitted"]),LF=/^(?:0|[1-9][0-9]*)$/,$F=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,BF=/^0x[a-fA-F0-9]{40}$/,MF=/^0x[a-fA-F0-9]{64}$/,UF=/[\u0000-\u001f\u007f]/,Hf=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function oe(e,t){throw new Hf(e,t)}function Ha(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ha(t);Object.freeze(e)}return e}function ja(e,t,{max:n=256}={}){typeof e!="string"&&oe(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||UF.test(r))&&oe(`${t} is invalid`),r}function _n(e,t){let n=ja(e,t,{max:128});return $F.test(n)||oe(`${t} must be a bounded id`),n}function ql(e,t,{positive:n=!1}={}){typeof e=="number"&&oe(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return LF.test(r)||oe(`${t} must be a canonical integer string`),n&&r==="0"&&oe(`${t} must be positive`),r}function qr(e,t){let n=ja(e,t,{max:42}).toLowerCase();return BF.test(n)||oe(`${t} must be a 20-byte EVM address`),n}function FF(e){let t=ja(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{oe("resource must be an https URL")}return n.protocol!=="https:"&&oe("resource must be https"),(n.username||n.password)&&oe("resource must not contain credentials"),n.toString()}function kS(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&oe(`${t} must be a plain object`),e}function DF(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&oe("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function qF(e){return new Date(e).toISOString()}function HF(e=process.env){let t=e.ORACLE_CONFIG_DIR||xS.join(CF(),".config","oracle");return xS.join(t,"local-x402.v1.json")}function Df(e){let t=e.status==="submitted";return Ha({schemaVersion:Hl,intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,maxBudget:e.maxBudget,asset:e.asset,chainId:e.chainId,status:e.status,createdAt:e.createdAt,intentHash:e.intentHash,transactionHash:e.transactionHash||null,label:vS,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function jF(e){(!e||e.schemaVersion!==Hl||!Array.isArray(e.intents))&&oe("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&oe("x402 capacity exceeded","STORE_LIMIT")}function qf(e){return Ha({schemaVersion:Hl,recordType:"local-x402-armed",intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,asset:e.asset,chainId:e.chainId,intentHash:e.intentHash,unsigned:{kind:"local-x402-pay",from:e.payer,to:e.payTo,amount:e.amount,asset:e.asset,chainId:e.chainId,resource:e.resource},review:`Oracle local x402 ${e.intentId} is armed: pay ${e.amount} ${e.asset} to ${e.payTo} for ${e.resource}. Sign and broadcast still require an explicit instruction.`,label:vS,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function zF(e,t){typeof e=="string"&&oe("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=kS(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=qr(n.from??t.payer,"artifact.from"),o=qr(n.to??t.payTo,"artifact.to"),i=ql(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&oe("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&oe("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&oe("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&oe("amount exceeds maxBudget","BUDGET"),n}function VF(e,t){if(e==null)return{action:"arm"};let n=kS(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=ja(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&oe("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&oe("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&oe("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&oe("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function SS({filePath:e=HF(),clock:t=()=>Date.now(),idFactory:n=()=>RF()}={}){let r=Bo({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Hl,intents:[]}),validateData:jF});function o(l={}){An(l);let u=_n(l.tenantId,"tenantId"),d=qr(l.payer,"payer"),p=qr(l.payTo,"payTo"),m=FF(l.resource),f=ql(l.amount,"amount",{positive:!0}),h=ql(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&oe("amount exceeds maxBudget","BUDGET");let g=ja(l.asset??"USDC","asset",{max:32}),w=ql(l.chainId,"chainId",{positive:!0}),x=DF(t),b=_n(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(v=>v.intentId===b)&&oe("intentId already exists","DUPLICATE");let S={intentId:b,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:w,status:"open",createdAt:qF(x),custody:"none",execution:"armed-local"},E={...S,intentHash:OF("sha256").update(tr(S),"utf8").digest("hex")};return y.intents.push(E),Df(E)})}function i({tenantId:l}={}){let u=_n(l,"tenantId");return Ha(r.read().intents.filter(d=>d.tenantId===u).map(Df))}function a({tenantId:l,intentId:u,actor:d}={}){let p=_n(l,"tenantId"),m=_n(u,"intentId"),f=qr(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&oe("intent is not open","NOT_OPEN"),g.status="cancelled",Df(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=_n(l,"tenantId"),m=_n(u,"intentId"),f=qr(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||oe("intent is not open","NOT_OPEN"),g.status="armed",qf(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=_n(l,"tenantId"),h=_n(u,"intentId"),g=qr(d,"actor"),w=r.mutate(v=>{let k=v.intents.find(T=>T.tenantId===f&&T.intentId===h);k||oe("intent not found","NOT_FOUND"),k.payer!==g&&oe("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(k.status)||oe("intent is not open","NOT_OPEN");let A=VF(p,k);return k.status="armed",{armed:qf(k),instruction:A}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(v=>v.tenantId===f&&v.intentId===h),b=zF(w.instruction.artifact,x);(!m||typeof m.executeConfirmedArtifact!="function")&&oe("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&oe("generic signHash executors are refused","SIGNHASH_REFUSED");let y=await m.executeConfirmedArtifact(b,w.instruction.nonce,m),S=y?.receipt?.transactionHash??y?.transactionHash;(typeof S!="string"||!MF.test(S))&&oe("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let E=y?.receipt?.status??y?.status;return E!==1&&E!=="0x1"&&oe("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(v=>{let k=v.intents.find(A=>A.tenantId===f&&A.intentId===h);return(!k||k.status!=="armed")&&oe("intent is not armed","NOT_OPEN"),k.status="submitted",k.transactionHash=S.toLowerCase(),Ha({...qf(k),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:k.transactionHash,review:`Oracle local x402 ${k.intentId} signed and broadcast. transactionHash=${k.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import ES from"node:path";import{homedir as WF}from"node:os";import{randomUUID as GF}from"node:crypto";var Vf=1,KF="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",bX=Object.freeze(["listed","revoked"]),YF=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,JF=/[\u0000-\u001f\u007f]/,XF=/^[a-f0-9]{64}$/,QF=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,ZF=new Set(["read","prepare","none"]),zf=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function qe(e,t){throw new zf(e,t)}function Wf(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Wf(t);Object.freeze(e)}return e}function nr(e,t,{max:n=256}={}){typeof e!="string"&&qe(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||JF.test(r))&&qe(`${t} is invalid`),r}function za(e,t){let n=nr(e,t,{max:128});return YF.test(n)||qe(`${t} must be a bounded id`),n}function IS(e,t){let n=nr(e,t,{max:64}).toLowerCase();return XF.test(n)||qe(`${t} must be 64 lowercase hex`),n}function eD(e,t){let n=nr(e,t,{max:2048}),r;try{r=new URL(n)}catch{qe(`${t} must be an https URL`)}return r.protocol!=="https:"&&qe(`${t} must be https`),(r.username||r.password)&&qe(`${t} must not contain credentials`),r.toString()}function tD(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&qe("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=nr(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!QF.test(r)||r==="0.0.0.0")&&qe(`outboundHosts[${n}] is not an allowlisted host`),r}))}function AS(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&qe("clock invalid","CLOCK_INVALID"),n}function _S(e){return new Date(e).toISOString()}function nD(e=process.env){let t=e.ORACLE_CONFIG_DIR||ES.join(WF(),".config","oracle");return ES.join(t,"local-pack-registry.v1.json")}function jf(e){return Wf({schemaVersion:Vf,packId:e.packId,tenantId:e.tenantId,name:e.name,version:e.version,publisher:e.publisher,manifestDigest:e.manifestDigest,sbomDigest:e.sbomDigest,homepage:e.homepage,outboundHosts:e.outboundHosts,spendScope:e.spendScope,status:e.status,createdAt:e.createdAt,revokedAt:e.revokedAt,label:KF,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function rD(e){(!e||e.schemaVersion!==Vf||!Array.isArray(e.packs))&&qe("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&qe("pack registry capacity exceeded","STORE_LIMIT")}function PS({filePath:e=nD(),clock:t=()=>Date.now(),idFactory:n=()=>GF()}={}){let r=Bo({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Vf,packs:[]}),validateData:rD});function o(l={}){An(l);let u=za(l.tenantId,"tenantId"),d=nr(l.name,"name",{max:128}),p=nr(l.version,"version",{max:64}),m=nr(l.publisher,"publisher",{max:128}),f=IS(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:IS(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:eD(l.homepage,"homepage"),w=tD(l.outboundHosts),x=nr(l.spendScope??"none","spendScope",{max:16});ZF.has(x)||qe("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&qe("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let b=AS(t),y=za(String(l.packId??`pack-${n()}`),"packId");return r.mutate(S=>{S.packs.some(v=>v.packId===y||v.tenantId===u&&v.name===d&&v.version===p&&v.status==="listed")&&qe("pack already listed","DUPLICATE");let E={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:w,spendScope:x,status:"listed",createdAt:_S(b),revokedAt:null,execution:"none",pluginExecution:!1};return S.packs.push(E),jf(E)})}function i({tenantId:l}={}){let u=za(l,"tenantId");return Wf(r.read().packs.filter(d=>d.tenantId===u).map(jf))}function a({tenantId:l,packId:u}={}){let d=za(l,"tenantId"),p=za(u,"packId"),m=AS(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||qe("pack not found","NOT_FOUND"),h.status!=="listed"&&qe("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=_S(m),jf(h)})}function s(){qe("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){qe("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}q();import{getAddress as uD,Interface as Uo,keccak256 as Yf}from"ethers";import{createHash as Jf,createHmac as dD,timingSafeEqual as jS}from"node:crypto";fo();ve();import{Interface as CS,getAddress as Gf,isAddress as oD}from"ethers";var iD="0x0000000000000000000000000000000000000000",OS=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),aD=new CS(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),sD=new CS(["function quoteExactInputSingle((address tokenIn,address tokenOut,uint256 amountIn,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)","function quoteExactOutputSingle((address tokenIn,address tokenOut,uint256 amount,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountIn,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)"]);function cD(e){let t=Number(e??4663),n=OS[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function TS(e,t){if(/^weth$/i.test(String(e||"")))return Gf(OS[t].weth);if(!oD(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Gf(e)}function lD(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function NS(e,t,n,r,o,i){let a=r.encodeFunctionData(o,i),s=await e(t,"eth_call",[{to:n,data:a},"latest"]);if(!s||s==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,s)}async function RS(e,t={},n={}){try{let r=cD(t.chainId),o=TS(t.tokenIn,r.chainId),i=TS(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=lD(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),s=Number(t.tickSpacing??2e3);if(!Number.isInteger(s)||s<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||W,l=await NS(c,r.chainId,r.factory,aD,"getPool",[o,i,s]),u=Gf(l[0]);if(u.toLowerCase()===iD)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:a,tickSpacing:s,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:a,tickSpacing:s,sqrtPriceLimitX96:0n},m=await NS(c,r.chainId,r.quoter,sD,d,[p]),f={provider:"up33",venue:"up33-v3",chainId:r.chainId,chain:r.name,factory:r.factory,quoter:r.quoter,router:r.router,pool:u.toLowerCase(),tokenIn:o.toLowerCase(),tokenOut:i.toLowerCase(),tickSpacing:s,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:a.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:a.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function LS(e={},t={}){return RS("exact-input",e,t)}async function $S(e={},t={}){return RS("exact-output",e,t)}ee();var X=4663,jl="https://anvil.clutch.market",pD=`${jl}/api/markets/snapshot?chainId=${X}`,mD=`${jl}/api/rpc?chainId=${X}`,fD=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),St="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Xf="0x0000000000000000000000000000000000000000",Hr=1e5,hD=256e3,BS=256,gD=3e4,yD=Object.freeze({"0x25482a6e453646f518c6194def85b0d477134f27":"0xdb1cb50fd93395644993895a2d1ee784973287453c16b1aa92716284fd265265","0x2554cad3d851381ec1a16b7bf7b4737ed46b40fe":"0x3a7563ef4a79e56aeab6e11b3fea2e319964a962379cb31beeedc4eaadf87cc1","0xd9206764cbc81c326ee6cace76c80089f6a0b360":"0x93cee896d680d2a0fb068413f39cf5b684dd70799dd9379f9ec35a2492d28b75","0x4e07aa3e0228cfe099462bc25f4789adb6038451":"0x04078324b6c9b861b6b59308c9327d73250992e1dd76546feccdf18e5e4d5fbc","0x714a07a5accc26a2799c50f3781612b4675129a1":"0x83ef76324d1c19aa59c76e5376814c0ed1071354d0c850110a94e91f35b4db28","0xfe0b24a3b4052ad78f10fa75a27118c3e54a00e6":"0x965e384f236132ec25d88662665408e49a443014a7fc58af92c03833df957f2f","0x2079c001b1a1e1be53b7463387510ddac2b45da2":"0x6c9c976c7cbd34e17e14189ccd487be9b541107885b86e28aa7ef1a033b7bb9f","0x147ef077bfbe4bbec3f267c358073c449cbb4b32":"0x5064f645f51ece3be2e5a6624c9cc6d508ba1544fef45455bbc7a906d07e6a4f","0xe6fa04e189ea271f0311162afc839443c51fe920":"0x467b919a9109c34d63ce40f8fcb4c9f33bccb45e7f6a027685a22228882553e1","0x492d80f0009cd250ceabcfcfb1c5c1de40f98ef6":"0x5da29cfd5f8f686998564a8ef0b89156c9f75d381c80ee5886b617385346e928","0x5bdf7bd9b20bb7c50061e4f4748725cd341d1f45":"0x94c052d894b557ac5b20295d74ee82c2a34b127cf148ba93e7596dc0cab549eb","0xdd59536f394c4b589e695f5921723b89ea479379":"0xa2c5533b1f8a41d863fa787dec42e51d57d8d77343555e5b0a9ce18fb51361ef","0xf29aa29804033d5fc9a16ad6f864e495d950acb4":"0xec8d77482cbd2f550345d67fc7f0f317e349ffd148a06b05237c9efb82b61900","0x26c41f7c732cf27b9c687f88ae4c9dbfed4f9ac4":"0xce7a9041ec2808643506b6327fed3d46b07dca344ff7b32e110d28a8fe6c712a","0x6109ed398827f06ba2ccd763a597ae2e0586b349":"0x625695c20dccfca1c2db898d09b4f56bde23b6ae0b9d76adc05573d280f320b0","0x95aa9e2130016e7ffe8828a4e1e2047441704cfd":"0xded628a34f602a70f5dc4d34974a2107ad5539be3428a34083aeddce8b2f46c4"}),Rt=Object.freeze({chainId:X,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ze=new Uo(["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 inventoryLength() view returns (uint256)","function oldestTokenId() view returns (uint256)","function getNextTokenId(uint256 tokenId) view returns (uint256)","function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),bD=new Uo(["function allowance(address owner,address spender) view returns (uint256)"]),zS=new Uo(["function decimals() view returns (uint8)"]),MS=new Uo(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),Lt=new Uo(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)","function tokenURI(uint256 tokenId) view returns (string)","function rarityOf(uint256 tokenId) view returns (uint8)","function tokenWallet(uint256 tokenId) view returns (address)","function predictWallet(uint256 tokenId) view returns (address)"]),rr=new Uo(["function pendingEth() view returns (uint256)","function minDropWei() view returns (uint256)","function roundActive() view returns (bool)","function currentRound() view returns (uint256)","function roundState() view returns (uint256 roundId,bool active,uint256 cursor,uint256 remaining,uint256[3] amounts,uint256[3] paid)","function getStockTokens() view returns (address[3])","function startDropPublic(uint256 minOutBps)","function continueDrop(uint256 batchSize)"]);function K(e,t){try{return uD(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Tn(e,t="tokenId"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return n}function Et(e,t,n=null){let r=e==null&&n!=null?n:e,o=String(r??"").trim();if(!/^\d+$/.test(o))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return BigInt(o)}async function se(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(X,"eth_call",[{to:K(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function VS(e,t){let n=BigInt(e).toString(),r=BigInt(t).toString(),o=(BigInt(e)+BigInt(t)).toString();return{anvilFeeRaw:n,protocolFeeRaw:r,totalFeeRaw:o}}function US(e={}){let t;if(Array.isArray(e))t=e;else if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.data))t=e.data;else if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.markets))t=e.markets;else throw new Error("stonkbrokers: Anvil snapshot shape requires a data array");if(t.length>BS)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${BS}`);return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("stonkbrokers: Anvil snapshot rows must be objects");if(Number(n.chainId)!==X)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${X}`);return{name:n.name||n.collectionName||null,chainId:X,collection:K(n.collection||n.collectionAddress,"Anvil collection"),market:K(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?K(n.tokenAddress,"Anvil payment token"):null,floorPrice:n.floorPrice??null,buyPrice:n.buyPrice??null,tokensPerNFT:n.tokensPerNFT??null,inventoryCount:Number(n.inventoryCount??n.inventoryLength??0),specificFeeBps:Number(n.specificFeeBps??0),source:"anvil-snapshot"}})}async function wD(e,t,n=[],r={}){if(Number(e)!==X)throw new Error(`stonkbrokers: Anvil supports chain ${X} only`);if(!fD.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await I(mD,{method:"POST",headers:{origin:jl,referer:`${jl}/`,"user-agent":"Mozilla/5.0"},body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??2e4,retries:0});if(o?.error)throw new Error(`stonkbrokers: Anvil RPC ${o.error.message||"failed"}`);if(o?.result==null)throw new Error("stonkbrokers: Anvil RPC returned no result");return o.result}function Vt(e={}){return e.rpcCall||((t,n,r)=>wD(t,n,r,e))}async function Fo(e={},t={}){if(e.snapshot){let s=US(e.snapshot),c={kind:"anvil-markets",chainId:X,total:s.length,contentHash:Jf("sha256").update(Mo(s)).digest("hex")},l=Qf(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.headers?.get?.("content-type")||"").split(";",1)[0].trim().toLowerCase();if(c!=="application/json"&&!c.endsWith("+json"))throw new Error("stonkbrokers: Anvil snapshot content-type must be JSON")},r=await I(pD,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:hD,retries:0});if(!r||typeof r!="object"||Array.isArray(r)||!Array.isArray(r.data))throw new Error("stonkbrokers: Anvil snapshot must be a JSON object with a data array");let o=US(r),i={kind:"anvil-markets",chainId:X,total:o.length,contentHash:Jf("sha256").update(Mo(o)).digest("hex")},a=Qf(e.snapshotCompletenessEvidence??r.completenessEvidence,i,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(o,"snapshotCoverage",{value:{complete:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function zl(e){let t=String(e||"").toLowerCase();if(!/^0x(?:0|[1-9a-f][0-9a-f]*)$/.test(t))throw new Error("stonkbrokers: Anvil RPC returned an invalid block number");return t}async function WS({market:e,collection:t},n={}){let r=Number(n.nowMs??Date.now());if(!Number.isFinite(r))throw new Error("stonkbrokers: opts.nowMs must be finite");let i=(await Fo({},n)).find(f=>f.market===e);if(!i)throw new Error("stonkbrokers: market is missing from the trusted Anvil snapshot");if(i.collection!==t)throw new Error("stonkbrokers: trusted Anvil snapshot collection mismatch");if(!i.tokenAddress)throw new Error("stonkbrokers: trusted Anvil snapshot payment token is missing");let a=yD[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=Vt(n),c=zl(await s(X,"eth_blockNumber",[])),l=await s(X,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||zl(l?.number)!==c)throw new Error("stonkbrokers: Anvil RPC returned an invalid block attestation");let d=Object.freeze({blockHash:u,requireCanonical:!0}),p=String(await s(X,"eth_getCode",[e,d])).toLowerCase();if(!/^0x[0-9a-f]+$/.test(p)||p==="0x")throw new Error("stonkbrokers: Anvil market runtime is empty");let m=Yf(p).toLowerCase();if(m!==a)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:s,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+gD}}function GS(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:X,market:e.record.market,collection:e.record.collection,paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r,snapshotFetchedAtMs:e.snapshotFetchedAtMs,snapshotExpiresAtMs:e.snapshotExpiresAtMs,blockNumber:BigInt(e.blockNumber).toString(),blockHash:e.blockHash,runtimeCodeHash:e.runtimeCodeHash})}async function Wa(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=Tn(e.tokenId),i=await WS({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([se(a,n,Ze,"quoteSpecificBuy",[BigInt(o)],s),se(a,n,Ze,"inventory",[BigInt(o)],s),se(a,r,Lt,"ownerOf",[BigInt(o)],s),se(a,n,Ze,"collection",[],s),se(a,n,Ze,"token",[],s),se(a,n,Ze,"robinhoodSwapFeeWei",[],s)]),f=K(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=K(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await se(a,h,zS,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(m[0]).toString(),x=GS(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),b=!!c[4],y=!!l[0],S=K(u[0],"NFT owner")===n,E=b&&y&&S;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:X,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:g,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:w,fees:VS(c[2],c[3]),available:E,evidence:{quoteAvailable:b,inventory:y,ownerIsMarket:S,marketCollection:f,attestation:x},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Vl(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await WS({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([se(i,n,Ze,"quoteSellNFT",[],a),se(i,n,Ze,"collection",[],a),se(i,n,Ze,"token",[],a),se(i,n,Ze,"robinhoodSwapFeeWei",[],a)]),d=K(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=K(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await se(i,p,zS,"decimals",[],a))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=GS(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:X,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:f,fees:VS(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function KS(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9._:-]{1,128}$/.test(t))throw new Error("stonkbrokers: bounded tradeId required");return t}function Pn(e,t){let n=Et(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function YS({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:X,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Pn(o,"gasLimit").toString(),maxFeePerGas:Pn(i,"maxFeePerGasWei").toString(),nonce:Number(s),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return a!=null&&a!==""&&(c.maxPriorityFeePerGas=Pn(a,"maxPriorityFeePerGasWei").toString()),c}function JS(e,t){return R({provider:"anvil-nft",kind:"anvil-nft-execution",execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:"pending-local-signer",broadcast:"pending-local-signer",simulation:"required-again-at-local-signer",localSignerEnvelope:e,quote:t},{provider:"anvil-nft",kind:"anvil-nft-execution"})}async function XS(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=K(e.market,"Anvil market"),o=K(e.collection,"NFT collection"),i=Tn(e.tokenId),a=Pn(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Et(e.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"),c=Number(e.actionNonce);if(!Number.isSafeInteger(c)||c<0)throw new Error("stonkbrokers: explicit non-negative actionNonce required");let l=await Wa({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>a||BigInt(l.nativeSwapFeeWei)>s)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=Pn(e.confirmedTotalCostRaw,"confirmedTotalCostRaw");if(d!==u)throw new Error("stonkbrokers: confirmed buy economics do not match the exact fresh quote");let p=Number(t.nowMs??Date.now()),m=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),f=K(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,w={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await se(Vt(t),f,bD,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let b={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[YS({...b,to:r,data:Ze.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],S={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},E={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:S,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:KS(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:S,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return JS(E,l)}async function QS(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Vt(t),r=K(e.seller,"seller"),o=K(e.market,"Anvil market"),i=K(e.collection,"NFT collection"),a=Tn(e.tokenId),s=Pn(e.minPayoutRaw,"minPayoutRaw"),c=Et(e.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"),l=Number(e.actionNonce);if(!Number.isSafeInteger(l)||l<0)throw new Error("stonkbrokers: explicit non-negative actionNonce required");let u=await Vl({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([se(n,i,Lt,"ownerOf",[BigInt(a)],p).then(T=>K(T[0],"NFT owner")),se(n,i,Lt,"getApproved",[BigInt(a)],p).then(T=>K(T[0],"NFT approval")),se(n,i,Lt,"isApprovedForAll",[r,o],p).then(T=>!!T[0])]);if(m!==r)throw new Error("stonkbrokers: seller does not own exact NFT");if(f!==o&&!h)throw new Error("stonkbrokers: pre-existing NFT approval is required");if(BigInt(u.netPayoutRaw)<s||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),w=Pn(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),b=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=K(u.paymentToken,"Anvil payment token"),S=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},v=[YS({...E,to:o,data:Ze.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],k={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},A={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:k,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:KS(e.tradeId),slippageBps:0,expiresAtMs:x+b,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:k,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:v}};return JS(A,u)}async function xD(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(S=>Tn(S)),b={kind:"anvil-inventory",chainId:X,market:K(e.market,"Anvil market"),collection:K(e.collection,"NFT collection"),total:x.length,contentHash:Jf("sha256").update(Mo(x)).digest("hex")},y=Qf(e.inventoryCompletenessEvidence,b,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=Vt(t),r=K(e.market,"Anvil market"),o=zl(await n(X,"eth_blockNumber",[])),i=await n(X,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||zl(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await se(n,r,Ze,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>Hr)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${Hr}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>Hr))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${Hr}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:Hr};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await se(n,r,Ze,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let x=f.toString();g.add(x),h.push(x),f=BigInt((await se(n,r,Ze,"getNextTokenId",[f],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function vD(e){if(!String(e).startsWith("data:application/json"))return null;let t=String(e).indexOf(",");if(t<0)throw new Error("stonkbrokers: malformed metadata data URI");let n=String(e).slice(0,t),r=String(e).slice(t+1),o=/;base64/i.test(n)?Buffer.from(r,"base64").toString("utf8"):decodeURIComponent(r);if(Buffer.byteLength(o)>256e3)throw new Error("stonkbrokers: metadata exceeds 256KB");return JSON.parse(o)}async function kD(e,t,n){let r=Vt(n);try{let o=String((await se(r,e,Lt,"tokenURI",[BigInt(t)]))[0]),i=vD(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await I(a,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,lookupFn:n.lookupFn,untrustedUrl:!0,maxResponseBytes:256e3})}catch(o){if(n.allowRarityOfFallback===!1)throw o;let i=await se(r,e,Lt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function ZS(e,t){let n=String(t||"Stars").trim().toLowerCase(),r=(Array.isArray(e?.attributes)?e.attributes:[]).find(i=>String(i?.trait_type??i?.traitType??"").trim().toLowerCase()===n),o=Number(r?.value);return Number.isFinite(o)?o:null}function SD(e,t=[]){let n=Array.isArray(e?.attributes)?e.attributes:[];return t.every(r=>{let o=String(r?.traitType??r?.trait_type??"").trim().toLowerCase();if(!o)throw new Error("stonkbrokers: trait filter requires traitType");let i=n.find(u=>String(u?.trait_type??u?.traitType??"").trim().toLowerCase()===o),a=String(r?.op||"eq").trim().toLowerCase();if(a==="exists")return i!=null;if(i==null)return!1;let s=i.value;if(a==="eq")return String(s).toLowerCase()===String(r.value).toLowerCase();if(a==="in")return Array.isArray(r.values)&&r.values.some(u=>String(s).toLowerCase()===String(u).toLowerCase());let c=Number(s),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(a==="gte")return c>=l;if(a==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${a}`)})}async function Wl(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await xD({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=Vt(t),p=(await Ce(i,s,async h=>{try{let g=await se(u,r,Lt,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(g[0])+1}}catch(g){return e.includeErrors?{tokenId:h,stars:null,error:String(g.message||g)}:null}})).filter(h=>h&&h.stars>=a),f=(await Ce(p,s,async h=>{try{let g=await Wa({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:g.available,quote:g,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(g){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(g.message||g)}:null}})).filter(Boolean).sort((h,g)=>Number(g.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(g.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:X,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:f.length,candidates:f,exec:!1,readOnly:!0}}let l=(await Ce(i,s,async u=>{try{let[d,p]=await Promise.all([kD(r,u,t),Wa({market:n,collection:r,tokenId:u},t)]),m=ZS(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?SD(d,f):e.includeAll===!0?!0:m!=null&&m>=a)?{tokenId:u,stars:m,traits:d.attributes||[],available:p.available,quote:p,decision:"WATCH",reason:"trait evidence is ranking-only until exact exit liquidity clears net-profit gates"}:null}catch(d){return e.includeErrors?{tokenId:u,available:!1,error:String(d.message||d)}:null}})).filter(Boolean).sort((u,d)=>Number(d.stars||0)-Number(u.stars||0)||(BigInt(u.tokenId)<BigInt(d.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-traits",chainId:X,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:l.length,candidates:l,exec:!1,readOnly:!0}}function eE(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function FS(e,t,n){if(!Object.hasOwn(e,t)||e[t]==null)return null;let r=Number(e[t]);if(!Number.isSafeInteger(r)||r<1||r>n)throw new Error(`stonkbrokers: ${t} must be an integer from 1 through ${n}`);return r}function tE(e={}){return{maxMarkets:FS(e,"maxMarkets",Hr),maxItemsPerMarket:FS(e,"maxItemsPerMarket",Hr)}}function nE(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Va(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function rE(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(s=>s.complete===!0),a=t.filter(s=>s.complete!==!0).map(s=>({market:s.market,continuation:s.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?a.length?{markets:a}:null:{snapshotEvidenceRequired:!0,...a.length?{markets:a}:{}}:{marketOffset:n}}}async function oE(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=tE(e),o=await Fo(e,t),i=nE(o,e,n),a=t.scanCollection||Wl,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ce(i,s,async l=>{let u=eE(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await a(d,t);return{...l,status:"ok",scan:p,...Va(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Va(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:X,marketCount:i.length,...rE(o,c),collectionCount:new Set(i.map(l=>l.collection)).size,scannedMarketCount:c.filter(l=>l.status==="ok").length,candidateCount:c.reduce((l,u)=>l+Number(u.scan?.count||0),0),markets:c,exec:!1,readOnly:!0}}async function iE(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=tE(e),o=await Fo(e,t),i=o.snapshotCoverage?.complete===!0,a=nE(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Zf,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ce(a,l,async d=>{let p=eE(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Va(d,null)};try{let f={...e,...p,market:d.market,collection:d.collection,slug:m,includeAll:p.includeAll??!p.raritySource};r!=null&&(f.maxItems=r);let h=await c(f,t),g=Va(d,h);return{...d,decision:i&&g.complete&&h.arbCount>0?"ARB":"WATCH",slug:m,scan:h,...g}}catch(f){return{...d,decision:"WATCH",slug:m,reason:String(f.message||f).slice(0,240),...Va(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:X,marketCount:a.length,...rE(o,u),scannedMarketCount:u.filter(d=>d.scan).length,arbCount:i?u.reduce((d,p)=>d+(p.complete?Number(p.scan?.arbCount||0):0),0):0,markets:u,exec:!1,readOnly:!0}}function DS(e,t){return e>t?"ARB":"PASS"}async function ED(e={},t={}){let n=String(e.direction||""),r=Et(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=K(e.paymentToken,"Anvil payment token"),i={chainId:X,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:Vt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||$S)({chainId:X,tokenIn:St,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:St,amountOutRaw:r.toString(),amountInWei:String(l.amountIn),source:`up33:${l.pool}`,venue:l.venue||"up33-v3",tickSpacing:l.tickSpacing,pool:l.pool,quoter:l.quoter,gasEstimate:l.gasEstimate};let u=await(t.uniV4QuoteExactOut||mp)({...i,tokenIn:St,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:St,amountOutRaw:r.toString(),amountInWei:String(u.amountIn),source:`uniswap-v4:${u.poolId}`,venue:u.venue||"uniswap-v4",fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks||null,poolId:u.poolId,gasEstimate:u.gasEstimate}}if(n!=="liquidate-exact-input")throw new Error("stonkbrokers: unsupported conversion direction");let s=await(t.up33QuoteExactIn||LS)({chainId:X,tokenIn:o,tokenOut:St,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:St,amountInRaw:r.toString(),amountOutWei:String(s.amountOut),source:`up33:${s.pool}`,venue:s.venue||"up33-v3",tickSpacing:s.tickSpacing,pool:s.pool,quoter:s.quoter,gasEstimate:s.gasEstimate};let c=await(t.uniV4QuoteExactIn||Mn)({...i,tokenIn:o,tokenOut:St,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:St,amountInRaw:r.toString(),amountOutWei:String(c.amountOut),source:`uniswap-v4:${c.poolId}`,venue:c.venue||"uniswap-v4",fee:c.fee,tickSpacing:c.tickSpacing,hooks:c.hooks||null,poolId:c.poolId,gasEstimate:c.gasEstimate}}function qS(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=K(e.quoteToken,"conversion quote token");if(n!==St)throw new Error("conversion quote token must be Robinhood WETH");if(!String(e.source||"").trim())throw new Error("conversion quote source required");if(t.direction==="acquire-exact-output"){if(String(e.amountOutRaw)!==t.amountRaw)throw new Error("conversion exact-output amount mismatch");let o=Et(e.amountInWei,"conversion amountInWei");if(o<=0n)throw new Error("conversion amountInWei must be positive");return{...e,quoteToken:n,amountInWei:o.toString()}}if(String(e.amountInRaw)!==t.amountRaw)throw new Error("conversion exact-input amount mismatch");let r=Et(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function ID(e,t){return Array.isArray(e)?e.find(n=>n?.route===t)||null:!e||typeof e!="object"?null:Object.hasOwn(e,"route")||Object.hasOwn(e,"chainId")?e:e[t]||e.routes?.[t]||null}function Mo(e){return Array.isArray(e)?`[${e.map(Mo).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Mo(e[t])}`).join(",")}}`:JSON.stringify(e)}function aE(e,t){let n=String(t||"");if(n.length<16)throw new Error("stonkbrokers: gas evidence secret must be at least 16 characters");let r={...e};return delete r.mac,{...r,mac:dD("sha256",n).update(Mo(r)).digest("hex")}}function AD(e,t){return aE(e,t)}function Qf(e,t,n,r){try{if(!e||typeof e!="object"||Array.isArray(e))throw new Error("completeness evidence is required");if(!r||String(r).length<16)throw new Error("trusted completeness attestation secret is unavailable");let o=String(e.mac||"").toLowerCase(),i=AD(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!jS(a,s))throw new Error("completeness evidence authentication failed");for(let[u,d]of Object.entries(t))if(String(e[u])!==String(d))throw new Error(`completeness evidence ${u} mismatch`);let c=Number(e.quotedAtMs),l=Number(e.expiresAtMs);if(!Number.isFinite(c)||!Number.isFinite(l)||c>n||l<=n||l<=c)throw new Error("completeness evidence is stale or has invalid freshness bounds");if(!String(e.source||"").trim())throw new Error("completeness evidence source is required");return{valid:!0,evidence:e,error:null}}catch(o){return{valid:!1,evidence:null,error:String(o.message||o)}}}function _D(e,t,n,r){return Array.isArray(e)?e.find(o=>o?.route===t&&o?.leg===r&&(n==null||String(o?.calldataHash||"").toLowerCase()===n))||null:ID(e,t)}function Kf(e,t,n,r,o,i){let a=_D(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==X)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.source||"").trim())throw new Error(`${r} evidence source is required`);if(!i||String(i).length<16)throw new Error(`${r} trusted attestation secret is unavailable`);let s=String(a.mac||"").toLowerCase(),c=aE(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!jS(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(a.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(a.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(a.blockHash||"").toLowerCase()!==o.blockHash||String(a.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(a.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&K(a.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(a.quotedAtMs),p=Number(a.expiresAtMs);if(!Number.isFinite(d)||!Number.isFinite(p)||d>n||p<=n||p<=d)throw new Error(`${r} evidence is stale or has invalid freshness bounds`);let m=a.amountWei??a.amount??a.gasCostWei??a.gasPriceWei,f=Et(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Pn(a.gasLimit,`${r} evidence gasLimit`),g=Pn(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let w=a.simulation;if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`${r} simulation evidence is required`);if(Number(w.chainId)!==X)throw new Error(`${r} simulation chainId mismatch`);if(String(w.route||"")!==t||String(w.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(w.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(w.blockHash||"").toLowerCase()!==o.blockHash||String(w.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(w.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(K(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let b=K(w.sender,`${r} simulation sender`),y=K(w.owner,`${r} simulation owner`);if(!o.owner||b!==o.owner||y!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Et(w.valueWei,`${r} simulation valueWei`))!==String(Et(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(w.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&K(w.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(w.success!==!0||w.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(w.result??"")))throw new Error(`${r} simulation did not return a successful result`);let S=Number(w.quotedAtMs),E=Number(w.expiresAtMs);if(!Number.isFinite(S)||!Number.isFinite(E)||S>n||E<=n||E<=S)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...a,amountWei:f.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function HS(e){let t=K(e,"OpenSea payment token");if(t!==Xf&&t!==St)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Zf(e={},t={}){let n=await Wl(e,t),r=Number(t.nowMs??Date.now());if(!Number.isFinite(r))throw new Error("stonkbrokers: opts.nowMs must be finite");let o=t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET,i=null;try{i=K(e.owner,"execution owner")}catch{}let a=(w,x,b,y={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:b,owner:i,...y}),s=(w,x,b,y,S)=>Kf(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(b,y,x,S),o),c=(w,x)=>{let b=null;try{b=K(w?.target,"conversion target")}catch{}let y=a(w?.calldataHash,w,"conversion",{target:b,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(y.calldataHash)||!/^0x[0-9a-f]{64}$/.test(y.blockHash)||!/^\d+$/.test(y.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let S=Kf(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",y,o);if(S.amount!=null||w?.gasEstimate==null)return S;let E=Kf(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let v=Et(w.gasEstimate,"conversion gasEstimate");return{amount:v*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:v.toString(),gasPriceEvidence:E.evidence},error:null}},l=(w,x,b,y,S)=>{try{let E=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(E))throw new Error("exact Seaport order hash is required");let v=K(x?.protocolAddress,"Seaport protocol address"),k=String(x?.executionCalldataHash||"").toLowerCase(),A=/^0x[0-9a-f]{64}$/.test(k)?k:null,T=y==="seaport-fulfillment"&&S===Xf?String(x?.priceWei??""):"0",C={orderHash:E,protocolAddress:v,target:v,valueWei:T},_=s(w,y,A,b,C);if(_.amount==null)throw new Error(_.error);if(_.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let $=_.evidence?.approvalRequired;if(typeof $!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==$)throw new Error("Seaport approval requirement evidence mismatch");let M=[_];if($){let F=String(x?.approvalCalldataHash||"").toLowerCase(),L=/^0x[0-9a-f]{64}$/.test(F)?F:null,D=y==="seaport-offer-acceptance"?n.collection:S;M.push(s(w,"seaport-approval",L,b,{...C,target:D,valueWei:"0"}))}if(S===Xf){let F=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",L=String(x?.prerequisiteCalldataHash||"").toLowerCase(),D=/^0x[0-9a-f]{64}$/.test(L)?L:null,Q=F==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";M.push(s(w,F,D,b,{...C,target:St,valueWei:Q}))}let O=M.find(F=>F.amount==null);if(O)throw new Error(O.error);return{amount:M.reduce((F,L)=>F+L.amount,0n),evidence:M.map(F=>F.evidence),error:null}}catch(E){return{amount:null,evidence:null,error:String(E.message||E)}}},u=Et(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||zc,p=t.openSeaBestOffer||Vc,m=t.paymentTokenConversion||(w=>ED({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await Vl({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let b=w.quote,y=Yf(Ze.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(b.totalCostRaw)])).toLowerCase(),S=s("anvil-to-opensea","anvil-call",y,b.evidence.attestation,{target:n.market,valueWei:b.nativeSwapFeeWei}),E=null,v=null;if(x)try{E=HS(x.paymentToken)}catch(L){v=String(L.message||L)}let k=v||!x?{amount:null,evidence:null,error:v||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,b.evidence.attestation,"seaport-offer-acceptance",E),A={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:b.paymentToken,amountUnits:b.amountUnits,anvilTotalCostRaw:b.totalCostRaw,anvilBaseCostRaw:b.baseCostRaw,anvilFeeRaw:b.fees.totalFeeRaw,paymentTokenDecimals:b.paymentTokenDecimals,nativeSwapFeeWei:b.nativeSwapFeeWei,openSeaGrossOfferWei:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.feeWei),openSeaPaymentToken:E,gasCostWei:S.amount==null?null:S.amount.toString(),gasEvidence:S.evidence,marketplaceGasCostWei:k.amount==null?null:k.amount.toString(),marketplaceGasEvidence:k.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!b.available)h.push({...A,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(v)h.push({...A,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${v}`});else if(S.amount==null)h.push({...A,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${S.error}`});else if(k.amount==null)h.push({...A,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${k.error}`});else if(typeof m!="function")h.push({...A,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let L=qS(await m({chainId:X,direction:"acquire-exact-output",amountRaw:b.totalCostRaw,paymentToken:b.paymentToken,quoteToken:St}),{direction:"acquire-exact-output",amountRaw:b.totalCostRaw}),D=c(L,"anvil-to-opensea");if(D.amount==null)h.push({...A,conversion:L,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${D.error}`});else{let Q=S.amount+k.amount+D.amount,Y=BigInt(x.sellerNetWei)-BigInt(L.amountInWei)-BigInt(b.nativeSwapFeeWei)-Q;h.push({...A,conversionGasCostWei:D.amount.toString(),conversionGasEvidence:D.evidence,totalExecutionGasWei:Q.toString(),anvilCostInWethWei:L.amountInWei,conversion:L,netWei:Y.toString(),decision:DS(Y,u),reason:Y>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(L){h.push({...A,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(L.message||L)}`})}let T=null;try{T=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!T)continue;let C=Yf(Ze.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),_=s("opensea-to-anvil","anvil-call",C,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),$=null,M=null;try{$=HS(T.paymentToken)}catch(L){M=String(L.message||L)}let O=M?{amount:null,evidence:null,error:M}:l("opensea-to-anvil",T,f.evidence.attestation,"seaport-fulfillment",$),F={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(T.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:$,gasCostWei:_.amount==null?null:_.amount.toString(),gasEvidence:_.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(M){h.push({...F,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${M}`});continue}if(_.amount==null){h.push({...F,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${_.error}`});continue}if(O.amount==null){h.push({...F,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${O.error}`});continue}if(typeof m!="function"){h.push({...F,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let L=qS(await m({chainId:X,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:St}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),D=c(L,"opensea-to-anvil");if(D.amount==null)h.push({...F,conversion:L,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${D.error}`});else{let Q=_.amount+O.amount+D.amount,Y=BigInt(L.amountOutWei)-BigInt(T.priceWei)-BigInt(f.nativeSwapFeeWei)-Q;h.push({...F,conversionGasCostWei:D.amount.toString(),conversionGasEvidence:D.evidence,totalExecutionGasWei:Q.toString(),anvilPayoutInWethWei:L.amountOutWei,conversion:L,netWei:Y.toString(),decision:DS(Y,u),reason:Y>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(L){h.push({...F,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(L.message||L)}`})}}let g=n.complete===!0?h:h.map(w=>w.decision==="ARB"?{...w,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:w);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:X,collection:n.collection,market:n.market,slug:String(e.slug||""),gasCostWei:null,conversionGasCostWei:null,gasPriceWei:null,inventoryTotal:n.inventoryTotal,inventoryScanned:n.inventoryScanned,complete:n.complete,truncated:n.truncated,continuation:n.continuation,minNetWei:u.toString(),opportunities:g.sort((w,x)=>{let b=BigInt(w.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>b?1:y<b?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Gl(e={},t={}){let n=Vt(t),r=Tn(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([se(n,Rt.ammVault,MS,"quoteSpecificBuy",[BigInt(r)]),se(n,Rt.ammVault,MS,"inventory",[BigInt(r)]),se(n,Rt.nft,Lt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:K(a[0],"broker owner")===Rt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:X,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function sE(e,t){try{return K((await se(t,Rt.nft,Lt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return K((await se(t,Rt.nft,Lt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function cE(e={},t={}){let n=Vt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ce(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Tn(a.brokerTokenId,"brokerTokenId"),c=Tn(a.nestedTokenId,"nestedTokenId"),l=K(a.tba,"TBA"),u=K(a.nestedCollection,"nested collection"),d=ZS({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([sE(s,n),se(n,u,Lt,"ownerOf",[BigInt(c)]).then(g=>K(g[0],"nested owner")),Gl({brokerTokenId:s},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.traits||[],available:h,quote:f,decision:"WATCH",reason:h?"rarity is ranking-only until exit-liquidity evidence clears profit gates":"nested custody or parent availability is stale"}})).filter(Boolean).sort((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:X,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function lE(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=Tn(e.brokerTokenId,"brokerTokenId"),o=Et(e.maxTokenCostWei,"maxTokenCostWei"),i=Et(e.maxEthFeeWei,"maxEthFeeWei"),a=await Gl({brokerTokenId:r},t);if(!a.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(a.tokenCostWei)>o||BigInt(a.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return R({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:X,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:Rt.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Ga(e={},t={}){let n=Vt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?Rt.overtimeBooster:Rt.stockBooster,[i,a,s,c,l,u]=await Promise.all([se(n,o,rr,"pendingEth"),se(n,o,rr,"minDropWei"),se(n,o,rr,"roundActive"),se(n,o,rr,"currentRound"),se(n,o,rr,"roundState").catch(()=>null),se(n,o,rr,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:X,which:r,booster:o,pendingWei:d.toString(),minDropWei:p.toString(),roundActive:m,roundId:BigInt(c[0]).toString(),cursor:l?BigInt(l[2]).toString():null,remaining:l?BigInt(l[3]).toString():null,stockTokens:u?Array.from(u[0]).map(g=>K(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function uE(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?Rt.overtimeBooster:Rt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?rr.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):rr.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return R({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:X,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:X,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function dE(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Tn(s,"brokerTokenId")):[],r=Vt(t),o=await Ce(n,8,async s=>{let[c,l]=await Promise.all([se(r,Rt.nft,Lt,"ownerOf",[BigInt(s)]).then(u=>K(u[0],"broker owner")),sE(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Ga({which:"stock"},t),Ga({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:X,owner:e.owner?K(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function pE(e={},t={}){try{let n=await Fo(e,t);return{ok:!0,chainId:X,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function mE(e={},t={}){try{let n=await Ga({which:"stock"},t);return{ok:!0,chainId:X,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180)}}}ee();import{createHash as TD}from"node:crypto";var Kl="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",ND=Object.freeze([{name:"register",signature:"register(string)",selector:"0xf2c298be"},{name:"setAgentURI",signature:"setAgentURI(uint256,string)",selector:"0x0af28bd3"},{name:"ownerOf",signature:"ownerOf(uint256)",selector:"0x6352211e"},{name:"tokenURI",signature:"tokenURI(uint256)",selector:"0xc87b56dd"},{name:"getAgentWallet",signature:"getAgentWallet(uint256)",selector:"0x00339509"}]),jr=Object.freeze(Object.fromEntries(ND.map(e=>[e.name,e.selector]))),CD=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),OD=new Set(["name","endpoint","version","skills","domains"]),RD=new Set(["agentId","agentRegistry"]),fE=new Set(["reputation","crypto-economic","tee-attestation"]),LD=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,$D=64*1024;function Ka(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Error(`erc8004: ${t} must be a plain object`);return e}function eh(e,t,n){for(let r of Object.keys(e)){if(LD.test(r))throw new Error(`erc8004: secret-looking field ${n}.${r} forbidden`);if(!t.has(r))throw new Error(`erc8004: unknown field ${n}.${r}`)}}function Do(e,t,n,{empty:r=!1}={}){if(typeof e!="string"||!r&&e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`erc8004: malformed or oversized ${t}`);return e}function hE(e,t,{service:n=!1}={}){let r=Do(e,t,2048);if(/^(?:javascript|file):/i.test(r))throw new Error(`erc8004: unsafe ${t} URI`);if(n&&(/^[^\s@]+@[^\s@]+$/.test(r)||/^[\w-]+(?:\.[\w-]+)*\.eth$/i.test(r))||n&&/^did:[a-z0-9]+:[^\s]+$/i.test(r)||/^(?:https|ipfs):\/\/[^\s]+$/i.test(r)||/^data:image\/(?:png|jpeg|gif|webp|svg\+xml);base64,[a-z0-9+/]+=*$/i.test(r)&&r.length<=16384)return r;throw new Error(`erc8004: ${t} must use a safe URI scheme`)}function th(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`erc8004: ${t} must be a 20-byte address`);return n.toLowerCase()}function Yl(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function nh(e){if(typeof e!="number"&&typeof e!="bigint"||e<0||!Number.isSafeInteger(Number(e)))throw new Error("erc8004: agentId must be a non-negative safe integer");return BigInt(e)}function rh(e){let t=Yl(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return th(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function yE(){let e=[];try{let t=Yl(process.env.ORACLE_ERC8004_CHAIN_ID);rh(t),e=[t]}catch{}return{provider:"erc8004-identity",status:e.length>0?"configured":"unconfigured",standardStatus:"draft",custody:"public-keyless",signingReady:!1,broadcastReady:!1,configuredChainIds:e}}function BD(e){return JSON.parse(JSON.stringify(e))}function Jl(e){let t=Ka(e,"registration file");if(eh(t,CD,"registration"),t.type!==Kl)throw new Error("erc8004: registration-v1 type required");let n={type:Kl,name:Do(t.name,"name",128),description:Do(t.description,"description",4096),image:hE(t.image,"image")};if(!Array.isArray(t.services)||t.services.length>32)throw new Error("erc8004: services must be a bounded array");let r=new Set;if(n.services=t.services.map((a,s)=>{let c=Ka(a,`services[${s}]`);eh(c,OD,`services[${s}]`);let l=Do(c.name,`services[${s}].name`,64);if(/^(?:x|twitter)$/i.test(l)||/(?:^|\.)x\.com(?:\/|$)|twitter\.com/i.test(String(c.endpoint)))throw new Error("erc8004: X/Twitter services are excluded");let u=l.toLowerCase();if(r.has(u))throw new Error(`erc8004: duplicate service ${l}`);r.add(u);let d={name:l,endpoint:hE(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=Do(c.version,`services[${s}].version`,64));for(let p of["skills","domains"])if(c[p]!=null){if(!Array.isArray(c[p])||c[p].length>64||c[p].some(m=>typeof m!="string"||m.length>128))throw new Error(`erc8004: malformed services[${s}].${p}`);d[p]=[...c[p]]}return d}),typeof t.x402Support!="boolean"||typeof t.active!="boolean")throw new Error("erc8004: x402Support and active must be boolean");if(n.x402Support=t.x402Support,n.active=t.active,!Array.isArray(t.registrations)||t.registrations.length>32)throw new Error("erc8004: registrations must be a bounded array");let o=new Set;if(n.registrations=t.registrations.map((a,s)=>{let c=Ka(a,`registrations[${s}]`);eh(c,RD,`registrations[${s}]`);let l=nh(c.agentId),u=/^eip155:([1-9][0-9]*):(0x[0-9a-fA-F]{40})$/.exec(String(c.agentRegistry||""));if(!u)throw new Error(`erc8004: malformed registrations[${s}].agentRegistry`);let d=`eip155:${Number(u[1])}:${u[2].toLowerCase()}`,p=`${d}:${l}`;if(o.has(p))throw new Error("erc8004: duplicate registration");return o.add(p),{agentId:Number(l),agentRegistry:d}}),t.supportedTrust!=null){if(!Array.isArray(t.supportedTrust)||t.supportedTrust.length>fE.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!fE.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>$D)throw new Error("erc8004: registration metadata oversized");return BD(n)}function MD(e){if(Ka(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Kl)throw new Error("erc8004: registration-v1 type required");return Jl({type:Kl,...e})}function UD(e){let t=Jl(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Ya(e){return BigInt(e).toString(16).padStart(64,"0")}function bE(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Ya(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function FD(e){return`${jr.register}${Ya(32)}${bE(e)}`}function DD(e,t){return`${jr.setAgentURI}${Ya(e)}${Ya(64)}${bE(t)}`}function qD(e,t){return`${e}${Ya(t)}`}function HD(e){return TD("sha256").update(e,"utf8").digest("hex")}function oh(e,t){Ka(e,"arguments");for(let n of Object.keys(e))if(!t.has(n))throw new Error(`erc8004: caller field ${n} is forbidden or unknown`)}function wE(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Yl(e.chainId),c=th(e.owner,"owner"),l=rh(s),u=Number(t?.nowMs??Date.now());return R({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:HD(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:s,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function xE(e={},t={}){oh(e,new Set(["chainId","owner","registration"]));let n=UD(MD(e.registration));return wE(e,t,{kind:"erc8004-register",uri:n,selector:jr.register,data:FD(n)})}function vE(e={},t={}){oh(e,new Set(["chainId","owner","agentId","agentURI"]));let n=nh(e.agentId),r=kE(e.agentURI);return wE(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:jr.setAgentURI,data:DD(n,r),id:n})}function kE(e){let t=Do(e,"agentURI",9e4);if(/^(?:javascript|file):/i.test(t))throw new Error("erc8004: unsafe agentURI");if(/^(?:https|ipfs):\/\/[^\s]+$/i.test(t))return t;let n="data:application/json;base64,";if(!t.startsWith(n)||t.length>9e4)throw new Error("erc8004: agentURI must use https, ipfs, or base64 JSON data URI");let r=t.slice(n.length);if(!/^[A-Za-z0-9+/]+={0,2}$/.test(r)||r.length%4!==0)throw new Error("erc8004: malformed agentURI base64");let o;try{o=JSON.parse(Buffer.from(r,"base64").toString("utf8"))}catch{throw new Error("erc8004: malformed agentURI JSON")}return Jl(o),t}function gE(e,t){if(!/^0x[0-9a-fA-F]{64}$/.test(e)||!/^0{24}/.test(e.slice(2)))throw new Error(`erc8004: malformed ${t} RPC result`);return th(`0x${e.slice(-40)}`,t)}function jD(e,t){if(!/^0x[0-9a-fA-F]*$/.test(e)||e.length<130)throw new Error(`erc8004: malformed ${t} RPC result`);let n=e.slice(2),r=Number.parseInt(n.slice(0,64),16)*2,o=Number.parseInt(n.slice(r,r+64),16)*2;if(!Number.isSafeInteger(r)||!Number.isSafeInteger(o)||r+64+o>n.length)throw new Error(`erc8004: malformed ${t} RPC bounds`);return Buffer.from(n.slice(r+64,r+64+o),"hex").toString("utf8")}async function SE(e={},t={}){oh(e,new Set(["chainId","agentId"]));let n=Yl(e.chainId),r=nh(e.agentId),o=rh(n);if(typeof t.rpcCall!="function")throw new Error("erc8004: reviewed rpcCall function required");let i=async d=>t.rpcCall("eth_call",[{to:o,data:qD(d,r)},"latest"]),[a,s,c]=await Promise.all([i(jr.ownerOf),i(jr.tokenURI),i(jr.getAgentWallet)]),l=kE(jD(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Jl(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:gE(a,"owner"),tokenURI:l,agentURI:l,agentWallet:gE(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}$n();ve();var EE=999;async function IE(e={}){let t={chainId:EE,rpc:null,dex:null};try{t.rpc=await uo(EE,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Bi("HYPE",e),r=(n.pairs||[]).filter(o=>/hyper|hl|hyperevm/i.test(String(o.chainId||o.chain||"")));t.dex={ok:!0,hypePairs:r.length||(n.pairs||[]).length,sample:(r[0]||n.pairs?.[0])?.pairAddress||null}}catch(n){t.dex={ok:!1,error:String(n.message||n).slice(0,120)}}return{ok:!!(t.rpc?.ok||t.dex?.ok),...t}}async function AE(e="HYPE",t={}){let r=(await Bi(e,t)).pairs||[],o=r.filter(i=>/hyper|hl|hyperevm/i.test(String(i.chainId||"")));return{query:e,hyperPairs:o,allPairs:r.slice(0,20),count:o.length||r.length}}async function _E(e,t={}){return Zt(e,t)}q();qt();ee();var WD="https://api-mainnet.magiceden.dev/v2",Ja=1e9;function PE(e={}){return Fe({provider:"magiceden",defaultUrl:WD,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Ho(e={}){return PE(e).baseUrl}function zr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function jo(e={}){let t=zr(e);return Me({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},PE(e).trusted)}function ih(e){let t=String(e||"").trim();if(!/^[a-z0-9_]{1,64}$/i.test(t))throw new Error("magiceden: symbol must be a collection slug");return t}function qo(e,t){if(typeof e=="number"){if(!Number.isFinite(e)||e<=0)throw new Error(`magiceden: ${t} must be a positive number`);return e}let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`magiceden: ${t} must be a plain decimal number (no hex, exponent, or sign)`);let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new Error(`magiceden: ${t} must be a positive number`);return r}function GD(e){let t=[e?.price,e?.mintPrice,e?.priceSol,e?.v0?.price,e?.launchStageInfo?.price,e?.stage?.price];for(let n of t){if(n==null)continue;let r=Number(n);if(Number.isFinite(r)&&r>=0)return r}return e?.isFree===!0?0:null}function KD(e){return Math.round(qo(e,"priceSol")*Ja)}function YD(e){if(e==null||e==="")throw new Error("magiceden: listing expiry is required and must be in the future");let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("magiceden: expiry must be a future Unix timestamp in seconds");if(t<=Math.floor(Date.now()/1e3))throw new Error("magiceden: expiry must be in the future");return t}function JD({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function XD(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=JD(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function TE(e={}){try{let t=await ah({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!zr(e),readTier:"keyless",prepareTier:zr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!zr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function ah(e={},t={}){let n=ih(e.symbol||e.collection),r=await I(`${Ho(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Number(r?.floorPrice??0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,floorPriceLamports:o||null,floorPriceSol:o?o/Ja:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Ja:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Ja:null,exec:!1,raw:r}}function NE(e={}){let t=Number(e.price??0);return{tokenMint:e.tokenMint??null,tokenATA:e.tokenAddress??null,seller:e.seller??null,sellerReferral:e.sellerReferral??null,auctionHouse:e.auctionHouse??null,pdaAddress:e.pdaAddress??null,priceSol:t||null,priceLamports:t?Math.round(t*Ja):null,tokenSize:e.tokenSize??1}}async function CE(e={},t={}){let n=ih(e.symbol||e.collection),r=Math.min(Math.max(Number(e.limit??20)||20,1),100),o=Math.max(Number(e.offset??0)||0,0),i=new URL(`${Ho(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let a=await I(i.toString(),{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(NE);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function OE(e={},t={}){let n=Ee(e.tokenMint||e.mint,"tokenMint"),r=await I(`${Ho(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(NE);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function RE(e={},t={}){if(!zr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=Ee(e.buyer||e.userPublicKey,"buyer"),r=Ee(e.seller,"seller"),o=Ee(e.tokenMint,"tokenMint"),i=Ee(e.tokenATA||e.tokenAddress,"tokenATA"),a=Ee(e.auctionHouse,"auctionHouse"),s=qo(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:qo(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Ho(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await I(l.toString(),{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Sn("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return R({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:s,maxPriceSol:c,lamports:KD(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Xl(e={},t={}){if(!zr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=Ee(e.seller||e.userPublicKey,"seller"),r=Ee(e.tokenMint,"tokenMint"),o=Ee(e.tokenATA||e.tokenAddress,"tokenATA"),i=Ee(e.auctionHouse,"auctionHouse"),a=qo(e.priceSol??e.price,"priceSol"),s=YD(e.expiry),c=XD(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Ho(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",Ee(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await I(l.toString(),{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Sn("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return R({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:a,expiry:s,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function LE(e={},t={}){if(!zr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=Ee(e.buyer||e.userPublicKey,"buyer"),r=ih(e.symbol||e.collection);if(e.maxPriceSol==null)throw new Error("magiceden: maxPriceSol is required to prepare a mint \u2014 an uncapped mint has no spend ceiling");let o=qo(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:qo(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Ho(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await I(a.toString(),{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=GD(s);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);Sn("magiceden",s);let u=s?.v0?.tx?.data??s?.tx?.data??null;if(!Array.isArray(u))throw s?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return R({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:s})}ee();jm();q();ft();var zo=8,sh=10n**BigInt(zo),ZD="0xa4b1",$E=7,ch=1,eq=2n**64n-1n;function tq(e={}){return e.exchangeUrl?e.exchangeUrl:process.env.HL_EXCHANGE_URL?process.env.HL_EXCHANGE_URL:e.testnet||process.env.HL_TESTNET==="1"?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange"}function Qa(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Wo(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-staking: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Xa(e,t="amount"){let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`hl-staking: ${t} must be a positive decimal HYPE amount`);let[r,o=""]=n.split(".");if(o.length>zo)throw new Error(`hl-staking: ${t} has more than ${zo} decimals`);let i=BigInt(r)*sh+BigInt((o+"0".repeat(zo)).slice(0,zo)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>eq)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Vo(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Nn(e){let t=BigInt(String(e||"0")),n=t/sh,r=(t%sh).toString().padStart(zo,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function BE(e={}){try{let t=await lh(e);return{ok:t.count>0,provider:"hl-staking",chain:Qa(e),validators:t.count,exec:!1}}catch(t){return{ok:!1,provider:"hl-staking",error:String(t?.message||t).slice(0,160),exec:!1}}}async function lh(e={}){let t=await we({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function uh(e={},t={}){let n=Wo(e.user||e.address,"user"),r=await we({type:"delegatorSummary",user:n},t);return{provider:"hl-staking",user:n,delegatedWei:r?.delegated??null,undelegatedWei:r?.undelegated??null,totalPendingWithdrawalWei:r?.totalPendingWithdrawal??null,nPendingWithdrawals:r?.nPendingWithdrawals??null,delegatedHype:r?.delegated!=null?String(r.delegated):null,undelegatedHype:r?.undelegated!=null?String(r.undelegated):null,exec:!1,raw:r}}async function dh(e={},t={}){let n=Wo(e.user||e.address,"user"),r=await we({type:"delegations",user:n},t),o=Array.isArray(r)?r:[];return{provider:"hl-staking",user:n,count:o.length,delegations:o.map(i=>({validator:i.validator??null,amount:i.amount??null,lockedUntilTimestamp:i.lockedUntilTimestamp??null})),exec:!1,raw:r}}async function ME(e={},t={}){let n=Wo(e.user||e.address,"user"),r=await we({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function UE(e={},t={}){let n=Wo(e.user||e.address,"user"),r=await we({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function ph(e={}){let t=e.nonce==null?Date.now():Number(e.nonce);if(!Number.isInteger(t)||t<=0)throw new Error("hl-staking: nonce must be a positive integer ms timestamp");return t}function Ql(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||ZD)}function nq(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ql(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function mh({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:a,caps:s,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Qa(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:tq(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:nq(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=cl(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,R(l,{provider:"hl-staking",kind:e})}function FE(e={},t={}){let n=Xa(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Xa(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Nn(n)} HYPE exceeds maxHype cap ${Nn(r)} HYPE`);let o=ph(e),i=Qa(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ql(t),wei:Vo(n),nonce:o};return mh({kind:"hype-stake-deposit",action:a,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:Vo(n),nonce:o},opts:t,args:e,caps:{amountHype:Nn(n),maxHype:r?Nn(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function DE(e={},t={}){let n=Xa(e.amountHype??e.amount,"amountHype"),r=ph(e),o=Qa(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ql(t),wei:Vo(n),nonce:r};return mh({kind:"hype-stake-withdraw",action:i,primaryType:"HyperliquidTransaction:CWithdraw",types:{"HyperliquidTransaction:CWithdraw":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:o,wei:Vo(n),nonce:r},opts:t,args:e,caps:{amountHype:Nn(n)},notes:[`Starts the ${$E} day unstaking queue back to spot. The HYPE is not liquid during the queue.`,"Undelegate from the validator first: only undelegated staking balance can be withdrawn.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function qE(e={},t={}){let n=Wo(e.validator,"validator"),r=Xa(e.amountHype??e.amount,"amountHype"),o=Object.prototype.hasOwnProperty.call(e,"isUndelegate"),i=Object.prototype.hasOwnProperty.call(e,"undelegate");if(o&&typeof e.isUndelegate!="boolean")throw new Error("hl-staking: isUndelegate must be a boolean");if(i&&typeof e.undelegate!="boolean")throw new Error("hl-staking: undelegate must be a boolean");if(o&&i&&e.isUndelegate!==e.undelegate)throw new Error("hl-staking: isUndelegate and undelegate must match");let a=o?e.isUndelegate:i?e.undelegate:!1,s=e.maxHype==null?null:Xa(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${Nn(r)} HYPE exceeds maxHype cap ${Nn(s)} HYPE`);let c=ph(e),l=Qa(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ql(t),validator:n,wei:Vo(r),isUndelegate:a,nonce:c};return mh({kind:a?"hype-undelegate":"hype-delegate",action:u,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:l,validator:n,wei:Vo(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:Nn(r),maxHype:s?Nn(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${ch} day validator lockup before they can be undelegated.`,"Oracle prepared this. Your wallet signs it. Nothing was submitted."]:["Delegates staking balance to the chosen validator so it starts earning.",`Once delegated, the stake is locked with that validator for ${ch} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function HE(e={},t={}){let n=Wo(e.user||e.address,"user"),r=await uh({user:n},t),o=await dh({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:$E,validatorLockupDays:ch,exec:!1}}ft();async function fh(e={}){let t=Date.now();try{let n=await Ht(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}var oq=24*365,iq=8;function et(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function aq(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Go(e={},t={}){let[n,r]=await Promise.all([mt(t),Ht(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],s=o.map((c,l)=>{let u=i[l]||{},d=et(u.markPx),p=et(u.prevDayPx),m=et(u.openInterest),f=et(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:et(u.oraclePx),midPx:et(u.midPx)??et(r?.[c.name]),prevDayPx:p,change24hPct:aq(d,p),dayNtlVolumeUsd:et(u.dayNtlVlm),premium:et(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(oq/iq)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function jE(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Go(e,t),a=(s,c=-1)=>r.filter(l=>l[s]!=null).sort((l,u)=>(l[s]-u[s])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:a("change24hPct"),losers:a("change24hPct",1),byVolume:a("dayNtlVolumeUsd"),byOpenInterest:a("openInterestUsd"),fundingHighest:a("fundingRateAprPct"),fundingLowest:a("fundingRateAprPct",1)}}async function zE(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),a=i-o,[s,c,l]=await Promise.all([Go({},t),Ao({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Io(n,t).catch(()=>null)]),u=s.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:et(h.o),high:et(h.h),low:et(h.l),close:et(h.c),volume:et(h.v)})),p=l?.levels??[],m=et(p?.[0]?.[0]?.px),f=et(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:m,bestAsk:f,spread:m==null||f==null?null:f-m,spreadBps:m==null||f==null||f===0?null:(f-m)/f*1e4},candles:{interval:r,count:d.length,series:d}}}async function VE(e={},t={}){let n=await tl(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}import{mkdirSync as Iq,readFileSync as Aq,readdirSync as _q,renameSync as Pq,writeFileSync as Tq}from"node:fs";import{homedir as Nq}from"node:os";import{join as ru}from"node:path";var Za=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});Ar();q();ve();ee();import{Interface as hh,getAddress as QE,isAddress as cq}from"ethers";var WE=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),GE=Object.freeze({42161:{name:"arbitrum",api:WE[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:WE[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),KE="0x0000000000000000000000000000000000000000",lq=`0x${"0".repeat(64)}`,YE=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),JE=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Zl=new hh(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),ZE=new hh(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),uq=new hh(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),dq=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Yo(e){let t=Number(e??42161),n=GE[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(GE).join(", ")})`);return{chainId:t,...n}}function eu(e,t={}){let n=Yo(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function $t(e,t){if(!cq(e))throw new Error(`${t} must be a valid EVM address`);return QE(e)}function le(e){return QE(e).toLowerCase()}function Ko(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function Vr(e,t){let n;try{n=BigInt(String(e??"0"))}catch{throw new Error(`${t} must be an integer string`)}if(n<0n)throw new Error(`${t} must be non-negative`);return n}function pq(e,t=50){let n=Number(e??t);if(!Number.isFinite(n)||n<0||n>100)throw new Error("gmx maxSlippageBps must be 0..100");return Math.floor(n)}function mq(e){let t=String(e||"marketIncrease").trim();if(!(t in YE))throw new Error(`gmx unsupported orderType ${t}`);if(!["marketIncrease","marketDecrease"].includes(t))throw new Error("gmx prepare currently supports marketIncrease and marketDecrease only");return{key:t,code:YE[t]}}function fq(e){let t=String(e||"noSwap").trim();if(!(t in JE))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:JE[t]}}function hq(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function gq(e,t){let n=le(t);return e.find(r=>le(r.marketToken||r.market||r.address)===n)||null}function yq(e,t){let n=le(t);return e.find(r=>le(r.tokenAddress||r.address)===n)||null}function bq({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Ko(e?.minPrice,"gmx minPrice"),i=Ko(e?.maxPrice,"gmx maxPrice"),a=BigInt(r),s=10000n;return n==="marketIncrease"?(t?i*(s+a)/s:o*(s-a)/s).toString():(t?o*(s-a)/s:i*(s+a)/s).toString()}function wq(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function xq(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function on(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function vq(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:on(t,"account",a=>le(a)),market:on(t,"market",a=>le(a)),initialCollateralToken:on(t,"initialCollateralToken",a=>le(a)),key:on(o,"key",a=>String(a).toLowerCase()),reason:on(i,"reason",a=>String(a)),sizeDeltaUsd:on(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:on(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:on(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:on(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:on(r,"isLong",a=>!!a)}}function kq(e={},t){if(le(e.address)!==le(t.eventEmitter))return null;let n;try{n=uq.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=dq[r];if(!o)return null;let i=vq(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||xq(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?le(s):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function XE(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function Sq(e=[],{chainId:t}={}){let n=Yo(t);return(Array.isArray(e)?e:[]).map(r=>kq(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function eI(e={},t={}){return I(`${eu(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function gh(e={},t={}){return I(`${eu(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function tI(e={},t={}){return I(`${eu(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function or(e={},t={}){return I(`${eu(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function nI(e={}){let t=await or({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function rI(e={},t={}){let n=Yo(e.chainId??42161),r=$t(e.account||e.owner||e.user,"gmx account"),o=Vr(e.start??0,"gmx start"),i=Vr(e.end??e.limit??20,"gmx end"),a=ZE.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),account:le(r),raw:c}}async function oI(e={},t={}){let n=Yo(e.chainId??42161),r=String(e.key||e.orderKey||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error("gmx order key must be bytes32 hex");let o=ZE.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),key:r,raw:a}}async function iI(e={},t={}){let n=Yo(e.chainId??42161),r=t.receipt||await $i({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=Sq(r.logs||[],{chainId:n.chainId}),a=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,s=a?i.filter(u=>u.orderKey===a):i;if(s.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:a?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=s.reduce((u,d)=>XE(d.status)>=XE(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?le(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:le(n.eventEmitter),events:s,receipt:r}}async function tu(e={},t={}){let n=Yo(e.chainId??42161),r=mq(e.orderType||e.type),o=fq(e.decreasePositionSwapType),i=$t(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=$t(e.receiver||i,"gmx receiver"),s=$t(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?$t(e.callbackContract,"gmx callbackContract"):KE,l=e.uiFeeReceiver?$t(e.uiFeeReceiver,"gmx uiFeeReceiver"):KE,u=$t(e.market||e.marketToken,"gmx market"),d=$t(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Ko(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Vr(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Ko(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Ko(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let g=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>g)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let w=pq(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[b,y]=await Promise.all([gh({chainId:n.chainId},t),or({chainId:n.chainId},t)]),S=gq(hq(b,"markets"),u);if(!S)throw new Error("gmx market not found in public registry");if(S.isListed===!1)throw new Error("gmx market is not listed");let E=$t(S.indexToken,"gmx market indexToken"),v=$t(S.longToken,"gmx market longToken"),k=$t(S.shortToken,"gmx market shortToken"),A=le(d);if(![le(v),le(k)].includes(A))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let T=wq(S,x);if(T>0n&&m>T)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let C=yq(y,E);if(!C)throw new Error("gmx index ticker not found");let _=e.acceptablePrice?Ko(e.acceptablePrice,"gmx acceptablePrice").toString():bq({ticker:C,isLong:x,typeKey:r.key,maxSlippageBps:w}),$=(e.swapPath||[]).map(be=>$t(be,"gmx swapPath market"));if($.length>3)throw new Error("gmx swapPath too long for guarded slice");let M=Vr(e.triggerPrice??"0","gmx triggerPrice"),O=Vr(e.callbackGasLimit??"0","gmx callbackGasLimit"),F=Vr(e.minOutputAmount??"0","gmx minOutputAmount"),L=Vr(e.validFromTime??"0","gmx validFromTime"),D=!!e.shouldUnwrapNativeToken,Q=e.autoCancel==null?!0:!!e.autoCancel,Y=String(e.referralCode||lq);if(!/^0x[0-9a-fA-F]{64}$/.test(Y))throw new Error("gmx referralCode must be bytes32 hex");let Le=Array.isArray(e.dataList)?e.dataList:[];for(let be of Le)if(!/^0x[0-9a-fA-F]{64}$/.test(String(be)))throw new Error("gmx dataList entries must be bytes32 hex");let bt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:$},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:M,acceptablePrice:BigInt(_),executionFee:f,callbackGasLimit:O,minOutputAmount:F,validFromTime:L},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:D,autoCancel:Q,referralCode:Y,dataList:Le},H=[];r.key==="marketIncrease"&&p>0n&&H.push(Zl.encodeFunctionData("sendTokens",[d,n.orderVault,p])),H.push(Zl.encodeFunctionData("sendWnt",[n.orderVault,f])),H.push(Zl.encodeFunctionData("createOrder",[bt]));let j=Zl.encodeFunctionData("multicall",[H]),ne={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:le(i),receiver:le(a),exchangeRouter:le(n.exchangeRouter),router:le(n.router),orderVault:le(n.orderVault),market:le(u),indexToken:le(E),initialCollateralToken:le(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:_,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return R({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:le(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:le(d),spender:le(n.router),amount:p.toString()}:null,gmxGuard:ne,transaction:{chainId:n.chainId,from:le(i),to:le(n.exchangeRouter),data:j,value:f.toString(),gmxGuard:ne}},{provider:"gmx",kind:"gmx-order"})}ft();var ir="oracle.hl.entry-state.v1",Cq=8,Oq=24*365;function ke(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jo(e){return e==null||e===0?0:e>0?1:-1}function es(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function Rq(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||ru(Nq(),".config","oracle")}function cI(e={}){return ru(Rq(e),"hl-entry-states")}function nu(e,t,n){return n==null&&e.push(t),n}function Lq(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(a=>String(a?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function Cn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function $q(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:ke(a.time),rate:ke(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return Cn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)Jo(o[a].rate)!==Jo(o[a-1].rate)&&(i+=1);return{source:"hl-info.fundingHistory",asOfMs:n??o[o.length-1].t,unknown:!1,coin:t||null,samples:o.length,firstRate:o[0].rate,lastRate:o[o.length-1].rate,signFlips:i,windowMs:o[o.length-1].t-o[0].t}}function Bq(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return Cn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=ke(a.peggedUSD??a.usd??i.circulatingPrevDay?.peggedUSD);s!=null&&(r+=s,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:Cn("defillama.stablecoins","no peggedUSD")}function aI(e,t){let n=ke(e);if(n==null)return null;if(t!=null&&t>0){for(let r of[1,1e12,1e22,1e30]){let o=n/r;if(o>t*.5&&o<t*1.5)return o}return null}return n>1e20?n/1e22:n>1e12?n/1e30:n}function Mq(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return Cn("gmx.tickers","no matching symbol");let c=aI(s.minPrice,n),l=aI(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return Cn("gmx.tickers","unreadable price");let d=n!=null&&n>0?es(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?Cn("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(s.tokenSymbol||s.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function Uq({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?Cn("hl-info.fundingHistory","not fetched"):$q(r,{coin:e,asOfMs:n}),llamaStables:o==null?Cn("defillama.stablecoins","not fetched"):Bq(o,n),gmxTicker:i==null?Cn("gmx.tickers","not fetched"):Mq(i,{coin:e,hlMark:t,asOfMs:n})}}function sI(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=ke(s?.px),l=ke(s?.sz);if(c==null||l==null||c<=0||l<=0)continue;let u=c*l,d=Math.min(u,Math.max(0,t-o));if(d<=0||(i+=d/c,o+=d,o>=t))break}let a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function Fq(e,t){if(!e)return{present:!1,unknown:["userState"]};let n=String(t).toUpperCase(),i=(e.assetPositions||e.clearinghouseState?.assetPositions||[]).find(f=>String(f?.position?.coin||"").toUpperCase()===n)?.position;if(!i)return{present:!1,unknown:[]};let a=ke(i.szi),s=ke(i.positionValue)!=null&&a?Math.abs(ke(i.positionValue)/a):null,c=ke(i.entryPx),l=ke(i.liquidationPx),u=a==null?null:a>0?"long":a<0?"short":null,d=null,p=s??c;l!=null&&p!=null&&p!==0&&u==="long"?d=(p-l)/p*100:l!=null&&p!=null&&p!==0&&u==="short"&&(d=(l-p)/p*100);let m=[];return a==null&&m.push("position.szi"),c==null&&m.push("position.entryPx"),l==null&&m.push("position.liquidationPx"),d==null&&m.push("position.liqDistancePct"),{present:!0,side:u,szi:a,entryPx:c,liquidationPx:l,leverage:ke(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function Dq({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:ir,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=Lq(n,e);if(!d)return{schema:ir,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=nu(u,"markPx",ke(m.markPx)),h=nu(u,"oraclePx",ke(m.oraclePx)),g=ke(m.midPx),w=ke(m.premium),x=nu(u,"fundingRate",ke(m.funding)),b=nu(u,"openInterestCoin",ke(m.openInterest)),y=ke(m.dayNtlVlm),S=Array.isArray(m.impactPxs)?m.impactPxs:[],E=ke(S[0]),v=ke(S[1]),k=x==null?null:x*(Oq/Cq)*100,A=b==null||f==null?null:b*f,T=i==null||i===0||b==null?null:(b-i)/i*100;T==null&&u.push("oiDeltaPct");let C=r?.levels,_=Array.isArray(C)?C[0]:[],$=Array.isArray(C)?C[1]:[],M=ke(_?.[0]?.px),O=ke($?.[0]?.px);M==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let F=sI($,Number(t)||0,"buy"),L=sI(_,Number(t)||0,"sell");F.fillable||u.push("book.buyFillable"),L.fillable||u.push("book.sellFillable");let D=g??f,Q=F.avgFillPx==null||D==null?null:es(F.avgFillPx,D),Y=L.avgFillPx==null||D==null?null:es(D,L.avgFillPx),Le=Fq(o,e);for(let ne of Le.unknown||[])u.push(ne);let bt=ke(m.prevDayPx),H=f==null||bt==null||bt===0?null:(f-bt)/bt*100;H==null&&u.push("change24hPct");let j=Uq({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return j.fundingPath.unknown&&u.push("overlays.fundingPath"),j.llamaStables.unknown&&u.push("overlays.llamaStables"),j.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:ir,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:es(f,h),fundingRate:x,fundingAprPct:k,openInterestCoin:b,openInterestUsd:A,oiDeltaPct:T,dayNtlVolumeUsd:y,change24hPct:H,impactBidPx:E,impactAskPx:v,maxLeverage:p.maxLeverage??null,book:{bidPx:M,askPx:O,spreadBps:M==null||O==null?null:es(O,M),notionalUsd:Number(t)||0,buy:F,sell:L,buySlipBps:Q,sellSlipBps:Y},position:Le,overlays:j,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function lI(e,t){let n=String(t||"").toLowerCase();if(n!=="long"&&n!=="short")return{side:null,verdict:"no",factors:[{key:"side",status:"unverifiable",note:"side must be long or short"}]};if(!e?.coin||e.verdict==="no")return{side:n,verdict:"no",factors:[{key:"market",status:"unverifiable",note:"no live market"}]};let r=[],o=e.fundingRate;o==null?r.push({key:"funding",status:"unverifiable",note:"fundingRate unknown"}):n==="long"?r.push({key:"funding",status:o>0?"counter":(o<0,"aligned"),note:o>0?"longs pay":"shorts pay / flat",fundingAprPct:e.fundingAprPct}):r.push({key:"funding",status:o<0?"counter":"aligned",note:o<0?"shorts pay":"longs pay / flat",fundingAprPct:e.fundingAprPct});let i=e.premium??(e.markOracleBps==null?null:e.markOracleBps/1e4);i==null?r.push({key:"premium",status:"unverifiable",note:"mark vs oracle unknown"}):n==="long"?r.push({key:"premium",status:i>0?"counter":"aligned",note:i>0?"mark rich to oracle":"mark cheap / flat"}):r.push({key:"premium",status:i<0?"counter":"aligned",note:i<0?"mark cheap to oracle":"mark rich / flat"});let a=n==="long"?e.book?.buy:e.book?.sell;if(!a)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!a.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${a.requestedNotionalUsd} usd`});else{let f=n==="long"?e.book.buySlipBps:e.book.sellSlipBps;r.push({key:"book",status:f!=null&&f>20?"counter":"aligned",note:f==null?"fillable, slip unknown":`slip ${f.toFixed(1)} bps`})}let s=e.position?.liqDistancePct;e.position?.present?s==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:s<5?"counter":"aligned",note:`${s.toFixed(2)}% to liq`}):r.push({key:"liqDistancePct",status:"unverifiable",note:"no position / no user"}),e.oiDeltaPct==null&&r.push({key:"oiDeltaPct",status:"unverifiable",note:"no prior OI \u2014 HL /info has no 24h OI"});let c=e.overlays?.fundingPath;!c||c.unknown?r.push({key:"fundingPath",status:"unverifiable",note:c?.reason||"funding history unknown"}):r.push({key:"fundingPath",status:c.signFlips>0?"unverifiable":"aligned",note:c.signFlips>0?`${c.signFlips} funding sign flip(s) in window`:`carry stable n=${c.samples}`});let l=e.overlays?.gmxTicker;!l||l.unknown?r.push({key:"gmxBasis",status:"unverifiable",note:l?.reason||"gmx ticker unknown"}):l.basisBps!=null&&Math.abs(l.basisBps)>80?r.push({key:"gmxBasis",status:"counter",note:`HL vs GMX ${l.basisBps.toFixed(1)} bps`}):r.push({key:"gmxBasis",status:"aligned",note:l.basisBps==null?"gmx print, no HL mark":`HL vs GMX ${l.basisBps.toFixed(1)} bps`});let u=r.some(f=>f.key==="book"&&f.status==="counter"&&/cannot fill/.test(f.note)),d=r.some(f=>f.status==="counter"),p=r.some(f=>f.status==="unverifiable");return{side:n,verdict:u?"no":d||p?"wait":"go",factors:r,seeUnknown:e.unknown||[]}}function qq(e){let t=String(e?.hash||e?.txHash||"").trim(),n=e?.oid,r=e?.tid;if(t)return{kind:e.kind||"hl-fill",hash:t};if(n!=null&&r!=null)return{kind:e.kind||"hl-fill",oid:n,tid:r,time:e.time??null};throw new Error("entry snapshot refused: no receipt (need hash or oid+tid)")}function Hq({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==ir||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=qq(n),a=lI(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:ir,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Za.ALERT_ONLY},c=cI({...o,configDir:r||o.configDir});Iq(c,{recursive:!0,mode:448});let l=ru(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return Tq(u,`${JSON.stringify(s,null,2)}
150
150
  `,{mode:384}),Pq(u,l),s}function yh(e={}){let t=cI(e),n=[];try{n=_q(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(Aq(ru(t,r),"utf8")))}function jq(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Za.ALERT_ONLY};let r=e.see,o=t;Jo(r.fundingRate)!==Jo(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Jo(r.premium)!==Jo(o.premium)&&r.premium!=null&&o.premium!=null&&n.push({key:"premiumSign",level:"hold",from:r.premium,to:o.premium});let i=r.position?.liqDistancePct,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="long"?o.book?.buy:o.book?.sell;c?.fillable&&l&&!l.fillable&&n.push({key:"bookFillable",level:"thesis-broke",from:!0,to:!1});let u=o.oiDeltaPct;return u!=null&&Math.abs(u)>=15&&n.push({key:"oiDeltaPct",level:"hold",from:0,to:u}),{schema:ir,id:e.id,coin:e.see.coin,side:e.side,actionMode:Za.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function uI(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await mt(e))?.[0]?.universe?.length,venue:"hyperliquid",latencyMs:Date.now()-t}}catch(n){return{provider:"hl-entry-state",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}async function ts(e={},t={}){let n=e.coin,r=ke(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([mt(t),n?Io(n,t).catch(()=>null):Promise.resolve(null),e.user?_o(e.user,t).catch(()=>null):Promise.resolve(null),n?el({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Oc({},t).catch(()=>null),or({chainId:42161},t).catch(()=>null)]);return Dq({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:ke(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function dI(e={},t={}){let n=e.see&&e.see.schema===ir?e.see:await ts(e,t);return{see:n,...lI(n,e.side)}}async function pI(e={},t={}){let n=e.see&&e.see.schema===ir?e.see:await ts(e,t);return Hq({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function mI(e={},t={}){let n=e.locked||yh(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Za.ALERT_ONLY};let r=await ts({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return jq(n,r)}ft();sl();ya();async function fI(e={}){let t=await sa(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function hI(e={},t={}){let n=e.coin,r=e.outcome==null?null:Wn(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=yI(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=bh(i)));let a=n==null?null:Gn(n);if(n!=null&&!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??a?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await sa(t))?.outcomes||[]).find(f=>{try{return Wn(f.outcome,0).outcome===l}catch{return!1}}),p=Array.isArray(d?.sideSpecs)?d.sideSpecs.findIndex(f=>f?.name===e.sideName):-1;if(p<0)throw new Error("hl-outcome: unknown sideName for outcome");let m=bh(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(a&&a.side!==m)throw new Error("hl-outcome: sideName does not match outcome coin side");i=m}if(!n){if(r==null||i==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=Wn(r,i).coin}if(a=Gn(n),!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&a.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&a.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let s=e.orderSide??o??(typeof e.isBuy=="boolean"?null:"buy"),c={...e,coin:n,outcome:void 0,outcomeSide:i};return delete c.orderSide,delete c.sideName,s==null?delete c.side:c.side=s,Jn(c,t)}async function gI(e={},t={}){let n=e.coin,r=e.outcome==null?null:Wn(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=yI(e.outcomeSide):(o=e.side,o!=null&&(o=bh(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Wn(r,o).coin}let i=Gn(n);if(!i)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&i.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(o!=null&&i.side!==o)throw new Error("hl-outcome: coin does not match outcome side");let a={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete a.side,ga(a,t)}function yI(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function bh(e){if(e===0||e===1)return e;if(typeof e=="string"){let t=e.trim().toLowerCase();if(t==="0"||t==="yes")return 0;if(t==="1"||t==="no")return 1}throw new Error("hl-outcome: outcome side must be 0, 1, yes, or no")}ee();Po();var sQ="0x"+"00".repeat(32);function Wq(e){let t=typeof e=="bigint"?e:Ot(e,"poly: atomicUsdc");if(t<=0n)throw new Error("poly: order amounts must be positive integer micro-units");let n=t/1000000n,r=(t%1000000n).toString().padStart(6,"0").replace(/0+$/,"");return r?`${n.toString()}.${r}`:n.toString()}function bI(e,t){let n=Ot(e.makerAmount,"poly: makerAmount"),r=Ot(e.takerAmount,"poly: takerAmount");return Wq(t==="BUY"?n:r)}Po();var Gq=new Set(["https://clob.polymarket.com/order"]),ns=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),dQ=Object.freeze(ns.map(e=>e[0])),Kq=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),Yq="0xe111180000d2663c0091e4f400237545b87b996b",Jq="0xe2222d279d744050d28e00520010520000310f59",wI=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function xI(e){let t=String(e||"").replace(/\/$/,"");if(!Gq.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function vI(e){let t=Ct(e,"poly: exchange").toLowerCase();if(!Kq.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function kI(e,t){if(e?.surface!=="poly")throw new Error("poly: surface poly required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("poly: structured artifact required");let r=wI(n.kind,"kind",48);if(r!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(Ct(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(xI(n.submitTo),n.chainId!==137)throw new Error("poly: chainId must be Polygon 137");let o=n.domain;if(!o||typeof o!="object")throw new Error("poly: EIP-712 domain required");if(o.name!=="Polymarket CTF Exchange"||o.version!=="2"||o.chainId!==137)throw new Error("poly: EIP-712 domain must be official CTF Exchange v2 on Polygon");if(vI(o.verifyingContract),vI(n.exchange),Ct(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==Ct(n.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof n.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=n.negRisk?Jq:Yq;if(Ct(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==ns.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let v=0;v<ns.length;v+=1)if(s[v]?.name!==ns[v][0]||s[v]?.type!==ns[v][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(Ct(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(Ct(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=wI(n.tokenId,"tokenId",80);if(Ct(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Ot(a.makerAmount,"poly: makerAmount"),m=Ot(a.takerAmount,"poly: takerAmount"),f=Ot(n.makerAmount,"poly: prepared makerAmount"),h=Ot(n.takerAmount,"poly: prepared takerAmount");if(p!==f)throw new Error("poly: signed makerAmount differs from prepared envelope");if(m!==h)throw new Error("poly: signed takerAmount differs from prepared envelope");let g=d==="BUY"?p:m,w=d==="BUY"?m:p,x=De(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let b=De(n.price,6,"poly: price");if(b<=0n||b>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*b!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(De(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let S=bI(a,d);if(De(S,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let E=t.maxNotionalUsd??t.maxNotionalUsdc;if(E!=null){let v=De(E,6,"poly: maxNotionalUsd");if(g>v)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:S,submitTo:xI(n.submitTo)})}function Xq(e){let t=e.owner||e.maker||e.signer||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("poly: owner/maker address required for local-signer envelope");return String(t).toLowerCase()}function SI(e,t={},n={}){if(String(e?.kind)!=="poly-order")throw new Error("poly: prepared kind is not a local-signer surface");if(!e?.domain||!e?.types||!e?.value)throw new Error("poly: prepared EIP-712 order required");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a={version:1,surface:"poly",action:"order",owner:Xq({...t,maker:e.value?.maker,signer:e.value?.signer}),destination:"polymarket",tradeId:String(t.tradeId||`poly:${e.value?.tokenId}:${e.value?.salt}`),expiresAtMs:r+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"poly-clob",artifact:{kind:"poly-order",tokenId:String(e.tokenId||e.value.tokenId),side:e.side,makerAmount:String(e.value.makerAmount),takerAmount:String(e.value.takerAmount),price:e.price,quantity:e.quantity,notionalUsdc:e.notionalUsdc,exchange:e.exchange,negRisk:e.negRisk,chainId:137,submitTo:"https://clob.polymarket.com/order",orderType:e.orderType||"GTC",signatureType:e.signatureType??0,domain:e.domain,types:e.types,message:e.value}};return kI(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as bQ,randomInt as Qq}from"node:crypto";import{keccak256 as xQ,concat as vQ,zeroPadValue as kQ,getCreate2Address as SQ,AbiCoder as EQ}from"ethers";var PI=137;var Zq="0xE111180000d2663C0091e4f400237545B87B996B",e4="0xe2222d279d744050d28e00520010520000310F59",EI="0x0000000000000000000000000000000000000000000000000000000000000000",wh=6;var t4={name:"Polymarket CTF Exchange",version:"2",chainId:PI},n4={Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"signer",type:"address"},{name:"tokenId",type:"uint256"},{name:"makerAmount",type:"uint256"},{name:"takerAmount",type:"uint256"},{name:"side",type:"uint8"},{name:"signatureType",type:"uint8"},{name:"timestamp",type:"uint256"},{name:"metadata",type:"bytes32"},{name:"builder",type:"bytes32"}]},II={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}};function ou(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function iu(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function AI(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function TI(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function r4(e,t,n,r){let o=TI(Number(n),r.price);if(e==="BUY"){let c=iu(Number(t),r.size),l=c*o;return ou(l)>r.amount&&(l=AI(l,r.amount+4),ou(l)>r.amount&&(l=iu(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=iu(Number(t),r.size),s=a*o;return ou(s)>r.amount&&(s=AI(s,r.amount+4),ou(s)>r.amount&&(s=iu(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function _I(e){let t=Number(e).toFixed(wh),[n,r=""]=t.split(".");return(n+r.padEnd(wh,"0").slice(0,wh)).replace(/^0+/,"")||"0"}function o4(e={}){if(Object.prototype.hasOwnProperty.call(e,"negRisk")&&typeof e.negRisk!="boolean")throw new Error("negRisk must be a boolean");let{tokenId:t,side:n,price:r,size:o,maker:i,signer:a,negRisk:s=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=EI,builder:p=EI}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!a)throw new Error("maker and signer required");let m=Number(r),f=Number(o);if(!(m>0&&m<1))throw new Error(`price out of (0,1): ${r}`);if(!(f>0))throw new Error(`size must be > 0: ${o}`);if(u!==0&&u!==3)throw new Error(`Desk poly supports signatureType 0 (EOA) or 3 (deposit wallet), got ${u}`);if(typeof p!="string"||!/^0x[0-9a-fA-F]{64}$/.test(p))throw new Error("poly: builder must be a 32-byte hex string");if(typeof d!="string"||!/^0x[0-9a-fA-F]{64}$/.test(d))throw new Error("poly: metadata must be a 32-byte hex string");let h=II[String(c)]||II["0.01"],g=TI(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=r4(n,f,g,h),b=_I(w),y=_I(x),S=String(Qq(1,2**31-1)),E=Date.now().toString(),v=n==="BUY"?0:1,k=s?e4:Zq,A={salt:S,maker:i,signer:a,tokenId:String(t),makerAmount:b,takerAmount:y,side:v,signatureType:u,timestamp:E,metadata:d,builder:p},T={...t4,verifyingContract:k},C=n==="BUY"?w:x;return{domain:T,types:n4,value:A,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:C,exchange:k,negRisk:s}}function NI(){return{ok:!0,provider:"poly-clob",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Hosted/keyless remains prepare-only."}}function CI(e={},t={}){let n=o4(e),r={provider:"poly-clob",kind:"poly-order",chainId:PI,tokenId:String(e.tokenId),side:n.side,orderType:n.orderType,price:n.price,quantity:n.quantity,notionalUsdc:n.notionalUsdc,exchange:n.exchange,domain:n.domain,types:n.types,value:n.value,tickSize:e.tickSize||"0.01",negRisk:n.negRisk,signatureType:e.signatureType??0,maxNotionalUsdc:e.maxNotionalUsdc??null};try{r.localSignerEnvelope=SI(r,e,t)}catch{r.oraclePrepared=!1}return R(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as m4,keccak256 as zI}from"ethers";ee();fu();uu();var f4=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function h4(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=An(e);for(let o of Object.keys(n))if(!f4.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function VI(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=UI(n,o),a=jI(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new m4(a.abi,s).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...h4(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return R({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:a.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:a.abi,sourceHash:a.gate.sourceHash,bytecodeHash:zI(s),authorityReport:FI(i),simulationReceipt:p,verificationManifest:{contractName:a.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:a.gate.sourceHash,creationBytecodeHash:zI(s),constructorData:`0x${u.slice(s.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${a.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:a.gate.forgeBuild,forgeTests:a.gate.forgeTests,staticAnalysis:{tool:a.gate.staticAnalysis.tool,ok:a.gate.staticAnalysis.ok,skipped:a.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:pu},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}fu();Ih();ya();q();var _4="https://api.geckoterminal.com/api/v2",yu=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||_4).replace(/\/$/,""),Qo=e=>encodeURIComponent(String(e));async function Ah(e={},t={}){let n=Math.max(1,Number(e.page||1));return I(`${yu(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ZI(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return I(`${yu(t)}/networks/${Qo(e.network)}/pools/${Qo(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function eA(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return I(`${yu(t)}/networks/${Qo(e.network)}/tokens/${Qo(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function tA(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),I(`${yu(t)}/networks/${Qo(e.network)}/pools/${Qo(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function nA(e={}){let t=await Ah({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}q();ve();tt();ee();import{Interface as aA,getAddress as sA,isAddress as T4}from"ethers";var N4="https://api.curve.finance/v1",cA=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||N4).replace(/\/$/,""),C4=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),lA="0x0000000000000000000000000000000000000000",_h=new aA(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),rA=new aA(["function coins(uint256) view returns (address)"]);function uA(e){let t=C4[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function us(e,t){if(!T4(e))throw new Error(`${t} must be a valid EVM address`);return sA(e)}function O4(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function oA(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function dA(e,t,n){return[e,t,n,...Array(8).fill(lA)]}function pA(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function mA(e){return[e,...Array(4).fill(lA)]}async function R4({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){return(await Promise.all(Array.from({length:n},(a,s)=>{let c=rA.encodeFunctionData("coins",[s]);return r(e,"eth_call",[{to:t,data:c},o.blockTag||"latest"],o)}))).map(a=>sA(rA.decodeFunctionResult("coins",a)[0]))}function iA(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function fA(e={}){return I(`${cA(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ph(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return I(`${cA(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function hA(e={}){let t=await Ph({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Th(e={},t={}){let n=Number(e.chainId??8453),r=uA(n),o=us(e.pool,"curve pool"),i=us(e.tokenIn,"curve tokenIn"),a=us(e.tokenOut,"curve tokenOut"),s=O4(e.amountIn,"curve amountIn"),c=oA(e.nCoins??2,"curve nCoins",2,8),l=oA(e.poolType,"curve poolType",1,4),u=t.rpcCall||W,d=await R4({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=iA(d,i,"tokenIn"),m=iA(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=dA(i,o,a),h=pA(p,m,l,c),g=mA(o),w=_h.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),b=_h.decodeFunctionResult("get_dy",x),y=BigInt(b[0]);if(y<=0n)throw new Error("curve quote returned zero output");return pe({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:y.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(S=>S.map(E=>E.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function gA(e={},t={}){let n=Number(e.chainId??8453),r=uA(n),o=us(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=us(e.receiver||e.recipient||o,"curve receiver"),a=await Th({...e,sender:o},t),s=dA(a.tokenIn,a.pool,a.tokenOut),c=pA(a.i,a.j,a.poolType,a.nCoins),l=mA(a.pool),u=_h.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return R({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,autoSlippage:a.autoSlippage,requiresApproval:{token:a.tokenIn,spender:r,amount:a.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:Pe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}q();ve();ee();import{Interface as $4,getAddress as B4,isAddress as M4,keccak256 as yA,toUtf8Bytes as bA}from"ethers";var U4="https://api.morpho.org/graphql",bu=new $4(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),F4=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||U4;async function Ch(e,t,n={}){return I(F4(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var D4="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",q4="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function ds(e,t){let n=String(e||"").trim();if(!M4(n))throw new Error(`morpho: ${t} must be an address`);return B4(n).toLowerCase()}function H4(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function Nh(e){return Array.isArray(e)?`[${e.map(Nh).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Nh(e[t])}`).join(",")}}`:JSON.stringify(e)}async function ps(e,t,n,r,o={}){let i=bu.encodeFunctionData(n,r),s=await(o.rpcCall||W)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return bu.decodeFunctionResult(n,s)}function j4(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function wA(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ch(D4,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Oh(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ch(q4,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function xA(e={}){return{ok:(await Ch("query { __typename }",{},e))?.data?.__typename==="Query"}}async function vA(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=ds(e.vault||e.vaultAddress,"vault"),i=ds(e.owner||e.from||e.sender,"owner"),a=ds(e.receiver||i,"receiver"),s=H4(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),[l,[u]]=await Promise.all([Oh({chainId:n,first:100},t),ps(n,o,"asset",[],t)]),d=j4(l?.data?.vaults?.items,o);if(!d)throw new Error("morpho: vault not found in public Morpho vault registry");if(d.listed===!1)throw new Error("morpho: vault is not listed");let p=Number(d?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&p<c)throw new Error(`morpho: vault totalAssetsUsd ${p} below minimum ${c}`);let m=ds(u,"vault asset");if((d?.asset?.address?ds(d.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[[x],[b]]=await Promise.all([ps(n,o,"maxDeposit",[i],t),ps(n,o,"previewDeposit",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");if(BigInt(b.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:b.toString()},h=bu.encodeFunctionData("deposit",[s,a])}else{let[[x],[b]]=await Promise.all([ps(n,o,"maxWithdraw",[i],t),ps(n,o,"previewWithdraw",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");if(BigInt(b.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:b.toString()},h=bu.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:p,...g,calldataHash:yA(bA(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=yA(bA(Nh(w))),R({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,vaultInfo:d,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}q();ve();tt();ee();import{Interface as V4,getAddress as Rh,isAddress as W4}from"ethers";var G4="https://api-v3.balancer.fi/",K4=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||G4;async function EA(e,t,n={}){return I(K4(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var Y4="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",kA=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),J4="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",X4="0x0000000000000000000000000000000000000000",Lh=new V4(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"]);function IA(e){let t=Number(e??8453),n=kA[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(kA).join(", ")})`);return{chainId:t,...n}}function AA(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===X4||t===J4.toLowerCase()}function wu(e,t){if(!W4(e))throw new Error(`${t} must be a valid EVM address`);return Rh(e)}function SA(e,t,n){let r=String(e||"");return AA(r)||/^weth$/i.test(r)?Rh(t.weth):/^usdc$/i.test(r)?Rh(t.usdc):wu(r,n)}function Q4(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function _A(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function PA(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return EA(Y4,{first:n,chains:r,where:{chainIn:r}},t)}async function TA(e={}){return{ok:(await EA("query { __typename }",{},e))?.data?.__typename==="Query"}}async function $h(e={},t={}){let n=IA(e.chainId),r=wu(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=SA(o,n,"balancer tokenIn"),a=SA(e.tokenOut||"USDC",n,"balancer tokenOut"),s=Q4(e.amountIn,"balancer amountIn"),c=wu(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Lh.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,_A(e.userData)]),d=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Lh.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return pe({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:m.toString()},{chainId:n.chainId,venue:n.router,amountOut:m.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function NA(e={},t={}){let n=IA(e.chainId),r=wu(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=AA(o),a=await $h({...e,sender:r},t),s=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+s),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=Lh.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,_A(e.userData)]);return R({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:Pe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}q();tt();ee();import{getAddress as e6}from"ethers";var t6="https://api-v2.pendle.finance/core",n6=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),r6="0x0000000000000000000000000000000000000000",o6="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",CA=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||t6).replace(/\/$/,"");function xu(e,t){try{return e6(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Zo(e,t){return xu(e,t).toLowerCase()}function i6(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===o6||t===r6}function Bh(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function a6(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:xu(t.token,`pendle input ${n} token`),amount:Bh(t.amount,`pendle input ${n} amount`)}))}function s6(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>xu(t,`pendle output ${n} token`))}function c6(e){let t=n6[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function l6(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return Bh(t,"pendle output amount")}function u6(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!i6(r.token)).map(r=>({token:Zo(r.token,"pendle approval token"),spender:Zo(t,"pendle approval spender"),amount:Bh(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Mh(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),I(`${CA(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function OA(e={}){let t=await Mh({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Uh(e={},t={}){let n=Number(e.chainId??42161),r=c6(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=xu(e.receiver||o,"pendle receiver"),a=a6(e.inputs),s=s6(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=dt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await I(`${CA(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(Zo(p.to,"pendle tx target")!==Zo(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Zo(p.from,"pendle tx sender")!==Zo(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=l6(u),f=pe(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return R({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:u6(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:Pe(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function RA(e={},t={}){let n=await Uh(e,t),{transaction:r,...o}=n;return o}q();tt();ee();import{isAddress as p6}from"ethers";var m6="https://api.odos.xyz",Fh=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||m6).replace(/\/$/,"");async function Dh(e={}){return I(`${Fh(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function f6(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!p6(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function LA(e={},t={}){let n=f6(e),r=dt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await I(`${Fh(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),a=i?.outAmounts?.[0];if(!i?.pathId||!a)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:a}}async function $A(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await LA(e,t);return{...pe(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function BA(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await LA(e,t),i=await I(`${Fh(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),a=i?.transaction;if(!a?.to||!a?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(a.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(a.from&&String(a.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let s=pe(r,{chainId:n,venue:a.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(s.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:a.to,amount:String(p.amount)}));return R({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,simulation:i.simulation,requiresApproval:d,autoSlippage:s.autoSlippage,transaction:{chainId:n,from:a.from||e.userAddr,to:a.to,data:a.data,value:a.value??"0x0",...a.gas!=null?{gasLimit:a.gas}:{},...a.nonce!=null?{nonce:a.nonce}:{},slippageGuard:Pe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function MA(e={}){let t=await Dh(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}q();var UA=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,g6=/[<>&`*_~[\]()|\\]/g,y6=/[\u0000-\u001F\u007F]/g;function qh(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(UA,"").replace(y6,"").replace(g6,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Hh(e){if(e==null)return!1;let t=String(e);return UA.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var FA=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});function vu(e,t={}){let n=Number(e),r=t.baseUrl||FA[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function DA(e){return!!FA[Number(e)]}async function jh(e={},t={}){return I(`${vu(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function qA(e={},t={}){if(!e.address)throw new Error("address required");return I(`${vu(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function HA(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return I(`${vu(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function jA(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${vu(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await I(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function zA(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let a=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!a||typeof a!="string")continue;let s=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(s)||s==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=qh(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=qh(o.name,{max:80,fallback:""})||null;n.push({address:a.toLowerCase().startsWith("0x")?a:`0x${a}`,symbol:l,name:u,decimals:c,amountRaw:s,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:Hh(o.symbol)||Hh(o.name)||void 0})}return n}async function VA(e={}){let t=await jh({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}Lr();q();ve();import{getAddress as w6}from"ethers";ft();Ar();var x6="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",GA=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function ar(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ku(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function WA(e){if(!e)return null;try{return w6(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Kr(e={},t=process.env){let n=e.addresses||{},r=WA(n.evm||e.evmAddress||ku(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ku(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ku(t,"ORACLE_BITCOIN_ADDRESS"),a=WA(n.hyperliquid||e.hyperliquidAddress||ku(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?Ee(o,"portfolio Solana address"):null,bitcoin:i?jt(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function ms(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,a=10n**BigInt(r),s=i/a,c=String(i%a).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${c?`.${c}`:""}`}function ei(e){let t=Number(e);return Number.isFinite(t)?t:null}function Su(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function sr(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function KA(e,t){let n=GA[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function v6(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,a=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};a.amountRaw+=o,a.accounts+=1,n.program&&a.programs.add(n.program),t.set(i,a)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:ms(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function zh(e,t){return{family:e,status:"unsupported",reason:t}}function Vh(e,t){if(!e||e.status!=="ok")return e;let n=KA(t,e.symbol),r=ei(e.amount),o=r!=null&&n.priceUsd!=null?Su(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function YA(e={}){let t=Kr({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Eu(e={},t={}){let n=new Date().toISOString(),r=Kr(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Rr.map(H=>[H.chainId,H])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(GA))],u=o?Be(()=>xt(l,ar(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ce(c,e.concurrency||5,async H=>{let j=s.get(H);if(!j)return{family:"evm",chainId:H,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:H,name:j.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let ne={...ar(t,"evm"),rpcUrl:e.rpcUrls?.[H]||t.evm?.rpcUrls?.[H]},be=await Be(()=>Sr(H,r.evm,ne));if(!be.ok)return{family:"evm",chainId:H,name:j.name,address:r.evm,status:"unavailable",latencyMs:be.ms,error:be.error};let We=j.nativeCurrency?.decimals??18,Xe=j.nativeCurrency?.symbol||"NATIVE",Z=be.data.balanceWei,Ie={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&DA(H)){let Ft=await Be(()=>jA({chainId:H,address:r.evm},{...ar(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Ft.ok?Ie={status:"ok",assets:zA(Ft.data,{fungibleOnly:!0}).map(dn=>{let vr=ms(dn.amountRaw,dn.decimals);return{...dn,amount:vr,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Ft.ms}:Ie={status:"unavailable",assets:[],reason:Ft.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Ft.ms}}return{family:"evm",chainId:H,name:j.name,address:r.evm,status:"ok",latencyMs:be.ms,native:{status:"ok",symbol:Xe,amountRaw:Z,decimals:We,amount:ms(Z,We)},fungibleTokens:Ie,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:Ie.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let H=ar(t,"solana"),j=await Be(()=>dl({address:r.solana},H)),ne=i||a?await Promise.all([Be(()=>va({owner:r.solana,programId:df},H)).then(Ie=>({...Ie,program:"spl-token"})),Be(()=>va({owner:r.solana,programId:x6},H)).then(Ie=>({...Ie,program:"token-2022"}))]):[],be=v6(ne),We=be.filter(Ie=>Ie.classification==="collectible-candidate"),Xe=be.filter(Ie=>Ie.classification!=="collectible-candidate"),Z=ne.filter(Ie=>!Ie.ok).map(Ie=>Ie.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:j.ok||ne.some(Ie=>Ie.ok)?"ok":"unavailable",native:j.ok?{status:"ok",symbol:"SOL",amountRaw:j.data.lamports,decimals:9,amount:ms(j.data.lamports,9),slot:j.data.slot}:{status:"unavailable",symbol:"SOL",error:j.error},fungibleTokens:{status:i?Z.length===ne.length?"unavailable":Z.length?"partial":"ok":"not-requested",assets:i?Xe:[],errors:Z,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?Z.length===ne.length?"unavailable":"partial":"not-requested",assets:a?We:[],errors:Z,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),m=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let H=ar(t,"bitcoin"),j=ar(t,"bitcoinMeta"),[ne,be,We]=await Promise.all([Be(()=>ml({address:r.bitcoin},H)),i?Be(()=>hl({address:r.bitcoin},j)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Be(()=>Ro({address:r.bitcoin},j)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),Xe=be.ok?be.data:null,Z=We.ok?We.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:ne.ok||Xe?.ok||Z?.ok?"ok":"unavailable",native:ne.ok?{status:"ok",symbol:"BTC",amountRaw:ne.data.balanceSats,decimals:8,amount:ms(ne.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:ne.error},fungibleTokens:{status:i?Xe?.ok?"ok":"unavailable":"not-requested",assets:Xe?.balances||[],error:Xe?.ok?null:Xe?.error||be.error,verification:"indexer-reported"},collectibles:{status:a?Z?.ok?"ok":"unavailable":"not-requested",assets:Z?.inscriptions||[],error:Z?.ok?null:Z?.error||We.error,unknownNotEmpty:!!Z?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),f=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let H=ar(t,"hyperliquid"),[j,ne,be]=await Promise.all([Be(()=>Qc(r.hyperliquid,H)),Be(()=>_o(r.hyperliquid,H)),Be(()=>Ht(H))]),We=(j.ok&&Array.isArray(j.data?.balances)?j.data.balances:[]).filter(Z=>sr(Z.total)||sr(Z.hold)).map(Z=>({coin:Z.coin||null,total:String(Z.total??"0"),hold:String(Z.hold??"0"),priceUsd:null,usdValue:null})),Xe=(ne.ok&&Array.isArray(ne.data?.assetPositions)?ne.data.assetPositions:[]).map(Z=>Z.position||Z).filter(Z=>sr(Z.szi)).map(Z=>({coin:Z.coin||null,size:String(Z.szi??"0"),entryPrice:Z.entryPx??null,positionValueUsd:Z.positionValue??null,unrealizedPnlUsd:Z.unrealizedPnl??null,liquidationPrice:Z.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:j.ok||ne.ok?"ok":"unavailable",spot:{status:j.ok?"ok":"unavailable",balances:We,error:j.ok?null:j.error},perps:{status:ne.ok?"ok":"unavailable",accountValueUsd:ne.data?.marginSummary?.accountValue??null,withdrawableUsd:ne.data?.withdrawable??null,positions:Xe,error:ne.ok?null:ne.error},mids:be.ok?be.data:{},source:"hyperliquid-info"}})(),[h,g,w,x,b]=await Promise.all([d,p,m,f,u]),y=b.ok?b.data:null,S=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),E=[];for(let H of h){if(H.family!=="evm"||H.fungibleTokens?.status!=="ok")continue;let j=S[H.chainId];if(j)for(let ne of H.fungibleTokens.assets||[])ne.address&&E.push(`${j}:${String(ne.address).toLowerCase()}`)}let v=null;if(o&&E.length){let H=[...new Set(E)],j=await Be(()=>xt(H,ar(t,"prices")));j.ok&&(v=j.data)}let k=h.map(H=>{let j=H.native?{...H,native:Vh(H.native,y)}:H;if(j.fungibleTokens?.status==="ok"&&Array.isArray(j.fungibleTokens.assets)){let ne=S[j.chainId],be=j.fungibleTokens.assets.map(We=>{let Xe=String(We.symbol||"").toUpperCase(),Z=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(Xe)&&(Z=1),Z==null&&ne&&We.address&&v?.coins){let lo=`${ne}:${String(We.address).toLowerCase()}`,dn=v.coins[lo],vr=Number(dn?.price);Number.isFinite(vr)&&vr>0&&(Z=vr)}let Ie=ei(We.amount),Ft=Ie!=null&&Z!=null?Su(Ie*Z):null;return{...We,priceUsd:Z,usdValue:Ft}});j={...j,fungibleTokens:{...j.fungibleTokens,assets:be}}}return j});g.native&&(g.native=Vh(g.native,y)),w.native&&(w.native=Vh(w.native,y));let A=0,T=0,C=0;for(let H of[...k,g,w]){H.native?.status==="ok"&&sr(H.native.amount)&&(H.native.usdValue!=null?(A+=H.native.usdValue,T+=1):C+=1);for(let j of H.fungibleTokens?.assets||[])!sr(j.amount)&&!sr(j.amountRaw)||(j.usdValue!=null?(A+=j.usdValue,T+=1):C+=1)}let _=KA(y,"HYPE");for(let H of x.spot?.balances||[]){let j=String(H.coin||"").toUpperCase(),ne=j==="USDC"||j==="USDT"||j==="USDT0"?1:j==="HYPE"?_.priceUsd||ei(x.mids?.HYPE):ei(x.mids?.[H.coin]),be=ei(H.total);H.priceUsd=ne,H.usdValue=be!=null&&ne!=null?Su(be*ne):null,sr(H.total)&&(H.usdValue!=null?(A+=H.usdValue,T+=1):C+=1)}let $=ei(x.perps?.accountValueUsd);$!=null&&$!==0&&(A+=$,T+=1);let M=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(H=>sr(H.amount)).length,O=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;C+=M+O;let F=[...k,g,w,x],L=H=>F.filter(j=>j.status===H).length,D=[],Q=k.filter(H=>H.fungibleTokens?.status==="unavailable"),Y=k.filter(H=>H.fungibleTokens?.status==="ok");Q.length&&!Y.length?D.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):Q.length&&D.push(`EVM token discovery partial: Blockscout covered ${Y.length} chain(s); ${Q.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&D.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&D.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),b.ok||D.push(`Price provider unavailable: ${b.error}`);let Le=[zh("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),zh("sui","Sui balance adapter is not installed"),zh("aptos","Aptos balance adapter is not installed")],bt=F.some(H=>["unavailable","partial","not-configured"].includes(H.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(H.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:F.length,ok:L("ok"),unavailable:L("unavailable"),notConfigured:L("not-configured"),unsupported:L("unsupported")+Le.length,evmChainsRequested:c.length,evmChainsOk:k.filter(H=>H.status==="ok").length},valuation:{knownUsd:Su(A),label:"known priced value, not a complete portfolio total",pricedItems:T,unpricedNonzeroItems:C,complete:C===0&&!bt&&L("unavailable")===0&&L("not-configured")===0&&Le.length===0,priceSource:o?"DefiLlama":null,priceStatus:b.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...k,g,w,x],unsupportedFamilies:Le,warnings:D}}import{constants as Au}from"node:fs";import{chmod as W6,mkdir as G6,open as K6,readFile as Y6}from"node:fs/promises";import{createHash as J6,randomUUID as X6}from"node:crypto";import Q6 from"node:os";import ni from"node:path";q();q();var S6=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),E6=new Set(["image/jpeg","image/png","image/webp"]);function I6(e){let t=String(e||"").toLowerCase();return S6.some(n=>t===n||t.endsWith(`.${n}`))}function A6(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function JA(e){let t=A6(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!I6(n.hostname)?null:n}async function _6(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=JA(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let a=await Be(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!a.ok)throw new Error(a.error);let s=a.data;if(s.status>=300&&s.status<400){let d=s.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=JA(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!s.ok)throw new Error(`image HTTP ${s.status}`);let c=String(s.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!E6.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function Wh(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function P6(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function XA(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let a=n.slice((o-1)*r,o*r),s=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let b of a){if(c>=l){s.push({item:b,image:null,error:"gallery page byte cap reached"});continue}try{let y=await _6(b.imageUrl||b.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:b,image:y,error:null})}catch(y){s.push({item:b,image:null,error:String(y?.message||y).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(a.length/u),h=u*d,g=m+f*p,w=s.map(({item:b,image:y,error:S},E)=>{let v=E%u,k=Math.floor(E/u),A=v*d,T=m+k*p,C=y?`<image x="${A+14}" y="${T+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${A+14}" y="${T+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${A+170}" y="${T+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,_=Wh(P6(b,E).slice(0,34)),$=Wh(b.chain||"unknown chain");return`${C}<text x="${A+16}" y="${T+350}" fill="#f3f5f7" font-size="17" font-weight="600">${_}</text><text x="${A+16}" y="${T+376}" fill="#8d98a8" font-size="13">${$}${S?" \xB7 placeholder":""}</text>`}).join(""),x=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${Wh(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(b=>b.image).length,placeholders:s.filter(b=>!b.image).map(b=>({assetKey:b.item.assetKey||null,name:b.item.name||null,sourceUrl:b.item.imageUrl||null,error:b.error})),rasterOnly:!0,externalScripts:!1}}var T6=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],N6=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,C6=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function O6(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;N6.test(n)&&t.push("url-in-name");let i=T6.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),C6.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let a=e.estimatedValueUsd==null&&e.estimatedValueSats==null,s=!Array.isArray(e.traits)||e.traits.length===0;a&&s&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function QA(e={}){let t=O6(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}ee();var R6=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),L6=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function Yr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function fs(e,t){let n=await Be(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function $6(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function B6(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function M6(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function t1(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function U6(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function F6(e,t){let n=t1(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function D6(e){let t=new Map;for(let n of e){let r=t1(n);t.has(r)||t.set(r,n)}return[...t.values()]}function q6(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function n1(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function ti(e={},t={}){let n=new Date().toISOString(),r=Kr(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=R6.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=Yr(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Ce(l,4,async y=>({row:y,result:await fs(`opensea-${y.chain}`,()=>na({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:S}of u)if(S.ok){let E=S.data.nfts.map(v=>({...v,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:S.data.complete?"ok":"partial",count:E.length,complete:S.data.complete,next:S.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:S.error,source:"opensea"});if(!r.evm)for(let y of i.filter(S=>S.family!=="solana"))a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let y=await fs("opensea-solana",()=>na({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let S=y.data.nfts.map(E=>({...E,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...S),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:S.length,complete:y.data.complete,next:y.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:y.error,source:"opensea"})}else(!o||o.has("solana"))&&a.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let y=await fs("satflow-wallet-contents",()=>yl({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Yr(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let S=$6(y.data.contents).map(v=>B6(v,r.bitcoin));s.push(...S);let E=S.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:E?"ok":"partial",count:S.length,complete:E,source:"satflow"})}else{let S=await fs("bitcoin-meta-inscriptions",()=>Ro({address:r.bitcoin},Yr(t,"bitcoinMeta")),t.timeoutMs??35e3),E=S.ok&&S.data?.ok&&Array.isArray(S.data.inscriptions)?S.data.inscriptions:[];s.push(...E.map(v=>M6(v,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:E.length?"partial":"unavailable",count:E.length,complete:!1,source:E.length?"bitcoin-meta":"satflow",error:E.length?"Satflow unavailable; fallback has IDs only":y.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let y of[...new Set([r.evm,r.solana].filter(Boolean))]){let S=await fs(`opensea-pnl-${y}`,()=>Hc({address:y},c),t.timeoutMs??35e3);d.push(S.ok?{status:"ok",...S.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:S.error})}let p=U6(e.costBasis),m=D6(s).map(y=>F6(y,p)).map(y=>QA(y)),f=m.filter(y=>!y.spam),h=m.filter(y=>y.spam),g=f.filter(y=>y.estimatedValueUsd!=null&&Number.isFinite(Number(y.estimatedValueUsd))),w=Math.round(g.reduce((y,S)=>y+Number(S.estimatedValueUsd),0)*100)/100,x=f.length-g.length,b=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:L6,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:g.length,unvaluedItems:x,complete:x===0&&b.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:q6(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function ZA(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function H6(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function r1(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return Kc(e,Yr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=ZA(e.expiry??e.endTime,"Solana NFT listing expiry");return Xl({...e,expiry:r},Yr(t,"magiceden"))}if(n==="satflow"){let r=ZA(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return bl({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:H6(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Yr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Gh(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function Kh(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Iu(e){return String(e??"").trim().toLowerCase()}function j6(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Iu(t),i=Iu(n);return!o||!i?!1:r.some(a=>Iu(a.trait_type??a.traitType??a.type)===o&&Iu(a.value??a.trait_value??a.traitValue)===i)}function z6(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function e1(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function Yh(e){return Math.round(Number(e)*1e6)/1e6}function cr(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function o1(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return cr(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(v=>e[v]==null||e[v]==="");if(o.length)return cr(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Gh(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Gh(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Gh(e.traitFloorEth,"traitFloorEth"),d=Kh(e.collectionFloorEth),p=Kh(e.maxListingAgeMs),m=Kh(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return cr(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return cr(e,"invalid-min-trait-sales");if(u<=0)return cr(e,"trait-floor-unavailable");let f=v=>j6(v,e.traitType,e.traitValue)&&z6(v,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(v=>{if(!m)return!0;let k=e1(v,["timestamp","soldAt","createdAt"]);return k!=null&&i-k<=m}),g=Yh(h.reduce((v,k)=>v+Number(k.priceEth??k.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return cr(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(v=>{let k=Number(v.priceEth??v.price);if(!Number.isFinite(k)||k<=0||k>a)return!1;if(!p)return!0;let A=e1(v,["listedAt","createdAt","timestamp"]);return A!=null&&i-A<=p}).map(v=>{let k=Number(v.priceEth??v.price),A=Math.round((u-k)/u*1e4);return{...v,priceEth:k,discountBps:A}}).filter(v=>v.discountBps>=s).sort((v,k)=>v.priceEth-k.priceEth||k.discountBps-v.discountBps),b={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return cr(e,"invalid-min-trait-listings",b);if(x.length<y)return cr(e,"trait-listing-depth-insufficient",b);let S=x[0],E=R({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Yh(S.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:b,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Yh(S.priceEth),discountBps:S.discountBps},evidence:b,prepareIntent:E}}async function i1(e={},t={}){let n=await ti({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function a1(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await ti({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await XA({...e,items:n},Yr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var s1=10*1024*1024,u1=1e3;function lr(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ri(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function c1(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function d1(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function Z6(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function p1(e={}){return`portfolio_${J6("sha256").update(Z6(e)).digest("hex").slice(0,20)}`}function m1(e={}){if(e.historyFile)return ni.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return ni.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||ni.join(Q6.homedir(),".hermes");return ni.join(ni.resolve(n),"state","oracle","portfolio-history.jsonl")}function e5(e){let t=lr(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?ri(t):null}function t5(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=lr(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?ri(t):null}function n5(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=lr(c.usdValue);return l==null?s:s+l},0),i=lr(n.perps?.accountValueUsd),a=ri(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>lr(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=lr(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:ri(r)})}return t}function r5(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function o5(e,t){let n=m1(t),r=`${JSON.stringify(e)}