@oracle-agent/oracle 0.35.41 → 0.35.42

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.
Files changed (43) hide show
  1. package/dist/agent-sessions.mjs +16 -16
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +28 -28
  4. package/dist/bin/oracle-data-mcp.mjs +1 -1
  5. package/dist/bin/oracle-gateway.mjs +45 -45
  6. package/dist/bin/oracle-public-server.mjs +5 -5
  7. package/dist/bin/oracle-route.mjs +31 -31
  8. package/dist/bin/oracle.mjs +1 -1
  9. package/dist/cli/commands/agent-session.mjs +17 -17
  10. package/dist/cli/commands/auth.mjs +5 -5
  11. package/dist/cli/commands/chat.mjs +216 -215
  12. package/dist/cli/commands/doctor.mjs +5 -5
  13. package/dist/cli/commands/eval.mjs +175 -138
  14. package/dist/cli/commands/extension-policy.mjs +3 -3
  15. package/dist/cli/commands/harness.mjs +7 -7
  16. package/dist/cli/commands/model.mjs +220 -219
  17. package/dist/cli/commands/portfolio-risk.mjs +1 -1
  18. package/dist/cli/commands/project.mjs +7 -7
  19. package/dist/cli/commands/quickstart.mjs +4 -4
  20. package/dist/cli/commands/setup.mjs +13 -13
  21. package/dist/cli/commands/venues.mjs +2 -2
  22. package/dist/cli/project-access.mjs +3 -0
  23. package/dist/data/desk-data.mjs +26 -26
  24. package/dist/index.mjs +44 -44
  25. package/dist/notifications/index.mjs +8 -8
  26. package/dist/portfolio-risk.mjs +1 -1
  27. package/dist/tui/standalone-client.mjs +86 -85
  28. package/package.json +2 -1
  29. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  30. package/public/oracle-splash/docs/connectors/index.html +2 -2
  31. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  32. package/public/oracle-splash/docs/index.html +3 -3
  33. package/public/oracle-splash/docs/reference/index.html +2 -2
  34. package/public/oracle-splash/docs/security/index.html +2 -2
  35. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  36. package/public/oracle-splash/download/index.html +4 -4
  37. package/public/oracle-splash/downloads/index.html +1 -1
  38. package/public/oracle-splash/eval/archive/oracle-0.35.40.json +101 -0
  39. package/public/oracle-splash/eval/archive/oracle-0.35.41-blocked-attempt.json +672 -0
  40. package/public/oracle-splash/eval/index.html +34 -26
  41. package/public/oracle-splash/eval/releases/oracle-0.35.41.json +788 -0
  42. package/public/oracle-splash/index.html +7 -7
  43. package/server.json +2 -2
@@ -20,7 +20,7 @@ ${JSON.stringify(n??[])}`}async function oO(e,t,n){return L(e,{method:"POST",bod
20
20
  CREATE TABLE IF NOT EXISTS action_receipts (
21
21
  artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
22
22
  );
23
- `);let s=!1,a=Promise.resolve();function c(){if(n)return Promise.resolve();let u=async()=>{let d=`${t}.tmp-${process.pid}`;await FU(d,Buffer.from(i.export()),{mode:384}),await Cl(d,384),await qU(d,t),await Cl(t,384)};return a=a.then(u,u),a}r?n||await Cl(t,384):n||await c();function l(){if(s)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(l(),!u||typeof u!="object")throw new TypeError("artifact object required");let d=Pv(String(u.type)),p=String(u.id||"").trim();if(!p)throw new TypeError("artifact id required");let f=ie(u.data??{}),m=String(u.createdAt||new Date().toISOString());return i.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[p,d,m,Ll(f)]),await c(),{id:p,type:d,createdAt:m,data:f}},getArtifact(u){l();let d=i.prepare("SELECT * FROM artifacts WHERE id=?");d.bind([String(u)]);let p=d.step()?Pl(d.getAsObject()):null;return d.free(),p},listArtifacts(u){l();let d=u===void 0?i.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Pv(String(u)),i.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),Rl(d).map(Pl)},async link(u,d){l();let p=i.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");p.bind([String(u),String(d)]);let f=Rl(p),m=f.find(g=>g.id===String(u)),h=f.find(g=>g.id===String(d));if(!m||!h)throw new TypeError("edge endpoints must exist");if(!VU.has(`${m.type}:${h.type}`))throw new TypeError(`invalid artifact edge: ${m.type} -> ${h.type}`);return i.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[m.id,h.id]),await c(),{parentId:m.id,childId:h.id}},children(u){l();let d=i.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),Rl(d).map(Pl)},parents(u){l();let d=i.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),Rl(d).map(Pl)},async putReceipt(u,d){l();let p=this.getArtifact(u);if(!p||p.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let f=ie(d);return i.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Ll(f)]),await c(),f},getReceipt(u){l();let d=i.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");d.bind([String(u)]);let p=d.step()?JSON.parse(d.getAsObject().receipt_json):null;return d.free(),p},async close(){s||(await c(),i.close(),s=!0)}}}var fm,zU,VU,WU,GU,$v=R(()=>{$i();fm=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),zU=new Set(fm),VU=new Set(fm.slice(0,-1).map((e,t)=>`${e}:${fm[t+1]}`)),WU=pm(process.env.ORACLE_CONFIG_DIR||pm(jU(),".config","oracle"),"workspace"),GU=pm(WU,"artifacts.sqlite")});import{createHash as Dv}from"node:crypto";function YU(e){return KU.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function mm(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(mm).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${mm(e[t])}`).join(",")}}`}function JU(e){return Dv("sha256").update(String(e)).digest("hex")}function Mv(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(YU(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Bv(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function XU(e={}){let t=Mv(e.url??e.sourceUrl),n=Bv(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(ie({url:t,fetchedAt:n,contentHash:r}))}function Uv(e={}){let t=Mv(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Bv(e.fetchedAt),s=JU(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(XU),c=ie({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Dv("sha256").update(mm(c)).digest("hex")}`,...c})}var KU,qv=R(()=>{$i();KU=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Fv(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function ca(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function gm(e,t){return t>0?ca(e/t*100):null}function ym(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function eq(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function To(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Fv(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||ZU.has(r.toUpperCase())})}function tq(e){let t=[],n=ym(e);for(let r of e.assets||e.holdings||[])To(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&To(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])To(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])To(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])To(t,a,{...i,venue:"Hyperliquid spot"});let s=Fv(r.perps?.accountValueUsd);s!=null&&To(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])To(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function nq(e,t){let n=ym(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function hm(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:ca(i),percentOfKnown:gm(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function $l(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=eq(t.labels??t.addressBook??e.labels??e.addressBook),o={...QU,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((S,N)=>{if(!S||typeof S!="object")return;let I=nq(S,N);s.has(I)?a+=1:(s.add(I),i.push(S))});let c=i.flatMap(tq),l=c.filter(S=>S.usdValue!=null),u=c.filter(S=>S.usdValue==null),d=i.reduce((S,N)=>S+Number(N.valuation?.unpricedNonzeroItems||N.unpricedNonzeroItems||0),0),p=ca(l.reduce((S,N)=>S+N.usdValue,0)),f=u.length+d,m=hm(l,"chain",p),h=hm(l,"venue",p),g=hm(l,"symbol",p);for(let S of m)S.chain=S.name;for(let S of h)S.venue=S.name;for(let S of g)S.asset=S.name,S.symbol=S.name;let b=ca(l.filter(S=>S.stablecoin).reduce((S,N)=>S+N.usdValue,0)),y=c.filter(S=>S.kind==="nft"),v=i.reduce((S,N)=>S+Number(N.valuation?.nftUnvaluedItems||0),0),A=y.filter(S=>S.usdValue==null).length+v,x=y.filter(S=>S.usdValue!=null).length,O=g[0]||null,E=O?O.percentOfKnown>=o.assetHighPct?"high":O.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",_=[];f&&_.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),A&&_.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&_.push(`${a} duplicate address/chain snapshot(s) were ignored.`),O&&E!=="low"&&_.push(`Asset concentration is ${E}: ${O.name} is ${O.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&_.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&_.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let w=i.map(ym).filter(Boolean).map(S=>{let N=r.get(String(S).toLowerCase());return{address:S,label:N?.label??null,who:N?.who??null,role:N?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1),label:f===0&&i.length&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:l.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:E,topAsset:O?.name??null,topAssetPercent:O?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:b,percentOfKnown:gm(b,p),high:p>0&&gm(b,p)>=o.stablecoinHighPct},nftCoverage:{status:y.length||v?A?"partial":"valued":"not-observed",valuedItems:x,unvaluedItems:A,knownUsd:ca(y.filter(S=>S.usdValue!=null).reduce((S,N)=>S+N.usdValue,0))},addresses:w,warnings:[...new Set(_)]}}var QU,ZU,bm=R(()=>{QU=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),ZU=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function jv(e){return ft(e.asOf??e.updatedAt??e.timestamp,0)}function Vv(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function rq(e){return Number.isFinite(Number(Vv(e)))}function Hv(e){return ft(Vv(e),0)}function oq(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!On(o))return;let s=Wv(o);t.has(s)||(t.add(s),n.push({row:o,seq:i}))}),n.every(({row:o})=>rq(o))?n.sort((o,i)=>Hv(o.row)-Hv(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function Wv(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Ml(e),et(t),et(e.side),ft(e.quantity??e.amount??e.size),ft(e.price??e.priceUsd)].join("|")}function Dl(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!On(o))continue;let i=t==="fill"?Wv(o):Ml(o);n.has(i)?(r+=1,t!=="fill"&&jv(o)>jv(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function iq(e){let t=new Map;for(let n of e){let r=[Ml(n),`${et(n.chain??n.chainId)}|${et(On(n))}`,`*|${et(On(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function sq(e,t){return t.get(Ml(e))??t.get(`${et(e.chain??e.chainId)}|${et(On(e))}`)??t.get(`*|${et(On(e))}`)??null}function aq(e){let t=new Map,n=0;for(let r of e){let o=[et(r.chain??r.chainId),et(zv(r)),et(On(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(ft(r.quantity??r.amount??r.size)),a=ft(r.price??r.priceUsd),c=ft(r.feeUsd);if(et(r.side)==="sell"){let l=Math.min(s,i.quantity),u=i.quantity?i.cost/i.quantity:ft(r.costBasisUsd)/(s||1);n+=l*(a-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:kn(n),lots:t}}function Gv(e={},t={}){let n=ft(t.asOf??e.asOf,0),r=Math.max(0,ft(t.priceTtlMs??e.priceTtlMs,6e4)),o=Dl(e.balances||[],"balance"),i=Dl(e.positions||[],"position"),s=Dl(e.fills||[],"fill"),a=Dl(e.prices||[],"price"),c=iq(a.rows),l=[],u=0,d=0;for(let w of[...o.rows,...i.rows]){let S=sq(w,c),N=ft(w.quantity??w.amount??w.size),I=S?ft(S.priceUsd??S.price,NaN):ft(w.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let U=N*I,j=ft(S?.asOf??w.priceAsOf,0),B=n-j>r;B&&(u+=Math.abs(U)),l.push({...w,quantity:N,priceUsd:I,valueUsd:U,stale:B,kind:i.rows.includes(w)?"position":"balance"})}let p=l.filter(w=>w.kind==="balance").reduce((w,S)=>w+S.valueUsd,0),f=l.filter(w=>w.kind==="position"),m=f.reduce((w,S)=>w+S.valueUsd,0),h=f.reduce((w,S)=>w+Math.abs(S.valueUsd),0),g=p+m,b=ft(e.equityUsd,g),y=aq(oq(e.fills||[])).realizedPnlUsd,v=f.reduce((w,S)=>{let N=ft(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return w+S.quantity*(S.priceUsd-N)},0),A=new Map;for(let w of l)A.set(et(On(w)),(A.get(et(On(w)))||0)+Math.abs(w.valueUsd));let x=[...A.values()].reduce((w,S)=>w+S,0),O=[...A].map(([w,S])=>({asset:w,exposureUsd:kn(S),percent:x?kn(S/x*100):null})).sort((w,S)=>S.exposureUsd-w.exposureUsd||w.asset.localeCompare(S.asset)),E=l.reduce((w,S)=>w+Math.abs(S.valueUsd),0),_=$l({snapshots:[{assets:l.map(w=>({symbol:On(w),usdValue:Math.abs(w.valueUsd),chain:w.chain,venue:w.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:y,unrealizedUsd:kn(v),totalUsd:kn(y+v)},exposure:{grossUsd:kn(h),netUsd:kn(g),leverage:b>0?kn(h/b):null,equityUsd:kn(b)},concentration:O,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(w=>w.stale).length,staleValueUsd:kn(u),stalePercent:E?kn(u/E*100):null,ttlMs:r},risk:_})}var ft,kn,et,On,zv,Ml,Kv=R(()=>{bm();ft=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,kn=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,et=(e,t="unknown")=>String(e??t).trim().toLowerCase(),On=e=>e.asset??e.symbol??e.coin,zv=e=>e.address??e.owner??e.account,Ml=e=>[et(e.chain??e.chainId),et(zv(e)),et(On(e)),et(e.source)].join("|")});function Le(e,t){throw new Em(e,t)}function wr(e,t){return e<t?-1:e>t?1:0}function tt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))tt(t);Object.freeze(e)}return e}function Er(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Le(`${t} must be a plain object`),e}function vt(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Le(`${t} must be a string`);let o=e.trim();return o||Le(`${t} is required`),fq.test(o)&&Le(`${t} contains control characters`),o.length>512&&Le(`${t} is too long`),r?o.toLowerCase():o}function Hn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Le(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:Le(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Le(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Le(`${t} must be positive`),i.toString()}function Di(e){return e==null?null:e.toString()}function la(e,t){let n=Er(e,t);return tt({chain:vt(n.chain??n.chainId,`${t}.chain`,{lower:!0}),account:vt(n.account??n.address??n.owner,`${t}.account`)})}function to(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function Qv(e,t="evidence"){if(e==null)return tt({status:"unknown",references:[]});let n=Er(e,t),r=vt(n.status??"unknown",`${t}.status`,{lower:!0});pq.has(r)||Le(`${t}.status must be complete, incomplete, or unknown`),n.references!=null&&!Array.isArray(n.references)&&Le(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=Er(s,`${t}.references[${a}]`);return{kind:vt(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:vt(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>wr(s.kind,a.kind)||wr(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return tt({status:r,references:i})}function Yv(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&Le(`${t} must be a non-empty array`);let n=new Set;return e.map((r,o)=>{let i=Er(r,`${t}[${o}]`),s=vt(i.lotId,`${t}[${o}].lotId`);return n.has(s)&&Le(`${t} repeats lotId ${JSON.stringify(s)}`),n.add(s),tt({lotId:s,quantity:Hn(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function mq(e){ie(e);let t=Er(e,"event"),n=vt(t.type,"event.type",{lower:!0});dq.has(n)||Le("event.type must be acquisition, disposal, or transfer");let r=vt(t.id??t.eventId,"event.id"),o=Hn(t.occurredAt??t.timestamp,"event.occurredAt"),i=vt(t.asset??t.symbol??t.coin,"event.asset"),s=Hn(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=Hn(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=Qv(t.evidence),l=t.source==null?null:vt(t.source,"event.source"),u={id:r,type:n,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:l,evidence:c};if(n==="acquisition"){let d={...u,location:la(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Hn(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:vt(t.lotId??r,"event.lotId"),specificLots:[]};return tt(d)}return tt(n==="disposal"?{...u,location:la(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Hn(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:Yv(t.specificLots??t.lotSelections,"event.specificLots")}:{...u,from:la(t.from,"event.from"),to:la(t.to,"event.to"),grossAmountMinor:null,specificLots:Yv(t.specificLots??t.lotSelections,"event.specificLots")})}function hq(e,t){let n=BigInt(e.occurredAt)-BigInt(t.occurredAt);return n<0n?-1:n>0n?1:wr(e.id,t.id)}function gq(e=[]){Array.isArray(e)||Le("events must be an array");let t=new Map,n=0;for(let r of e){let o=mq(r),i=aa(o),s=t.get(o.id);if(s){s.canonical!==i&&Le(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1;continue}t.set(o.id,{event:o,canonical:i})}return tt({events:[...t.values()].map(({event:r})=>r).sort(hq),duplicatesIgnored:n})}function yq(e){let t=vt(e??"fifo","method",{lower:!0});return lq.includes(t)||Le("method must be fifo, lifo, hifo, or specific"),t}function bq(e){e!=null&&Er(e,"treatment");let t=e||{},n={};for(let r of Object.keys(Jv))n[r]=vt(t[r]??"unresolved",`treatment.${r}`,{lower:!0}),Jv[r].has(n[r])||Le(`treatment.${r} has an unsupported value`);return tt(n)}function wq(e,t){ie(e);let n=Er(e,`marketValues[${t}]`);return tt({id:vt(n.id??n.valuationId,`marketValues[${t}].id`),asset:vt(n.asset??n.symbol??n.coin,`marketValues[${t}].asset`),location:la(n.location??{chain:n.chain??n.chainId,account:n.account??n.address??n.owner},`marketValues[${t}].location`),quantity:Hn(n.quantity,`marketValues[${t}].quantity`),valueMinor:Hn(n.valueMinor??n.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:Hn(n.asOf,`marketValues[${t}].asOf`),evidence:Qv(n.evidence,`marketValues[${t}].evidence`)})}function Zv(e,t){return t==null||BigInt(e)<=BigInt(t)}function Eq(e=[],t=null){Array.isArray(e)||Le("marketValues must be an array");let n=new Map,r=0;e.forEach((s,a)=>{let c=wq(s,a),l=aa(c),u=n.get(c.id);u?(u.canonical!==l&&Le(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1):n.set(c.id,{row:c,canonical:l})});let o=[...n.values()].map(({row:s})=>s).filter(s=>Zv(s.asOf,t)),i=new Map;for(let s of o){let a=to(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&wr(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>wr(s.id,a.id)),byHolding:i,duplicatesIgnored:r}}function St(e,t,n,r){e.push(tt({code:t,eventId:n??null,detail:r}))}function Aq(e,t,n){if(e.grossAmountMinor==null)return St(n,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.acquisitionFees==="include-in-basis"?r+o:t.acquisitionFees==="exclude"?r:(St(n,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function Sq(e,t,n){if(e.grossAmountMinor==null)return St(n,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.disposalFees==="reduce-proceeds"?r-o:t.disposalFees==="exclude"?r:(St(n,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function vq(e,t){let n=(r,o)=>{let i=BigInt(r.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:wr(r.lotId,o.lotId)};return e==="fifo"?[...t].sort(n):e==="lifo"?[...t].sort((r,o)=>-n(r,o)):e==="hifo"?[...t].sort((r,o)=>{let i=r.basisRemaining*o.quantityRemaining,s=o.basisRemaining*r.quantityRemaining;return i>s?-1:i<s?1:n(r,o)}):[...t]}function Xv(e,t){let n=e.quantityRemaining,r=e.basisRemaining,o=null;return r!=null&&(o=t===n?r:r*t/n,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function xq(e,t,n){let r=to(t,n);return e.filter(o=>o.key===r&&o.quantityRemaining>0n)}function Iq({event:e,lots:t,method:n,issues:r,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=to(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return St(r,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=xq(t,e.asset,i);if(n==="hifo"&&c.some(d=>d.basisRemaining==null))return St(r,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let l=[],u=a;if(n==="specific"){if(e.specificLots.length===0)return St(r,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};if(e.specificLots.reduce((p,f)=>p+BigInt(f.quantity),0n)!==a)return St(r,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};for(let p of e.specificLots){let f=c.find(h=>h.lotId===p.lotId),m=BigInt(p.quantity);if(!f||f.quantityRemaining<m){St(r,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(p.lotId)} is absent or too small`);continue}l.push(Xv(f,m)),u-=m}}else{e.specificLots.length&&Le(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${n}`);for(let d of vq(n,c)){if(u===0n)break;let p=u<d.quantityRemaining?u:d.quantityRemaining;l.push(Xv(d,p)),u-=p}}return u>0n&&(St(r,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:l,missing:u,key:s,indeterminate:u>0n}}function wm(e,t,n){if(e==null)return t.map(()=>null);let r=e,o=n;return t.map(i=>{if(o===0n)return 0n;let s=i===o?r:r*i/o;return r-=s,o-=i,s})}function kq(e,t){let n=[...e.map(r=>r.evidence.status),...t.map(r=>r.evidence.status)];return n.length===0||n.every(r=>r==="complete")?"complete":n.some(r=>r==="incomplete")?"incomplete":"unknown"}function Mi(e,t){let n=e.map(o=>o[t]),r=n.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:n.every(o=>o!=null)?r.toString():null,known:r.toString()}}function Oq(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:to(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function ex(e={},t={}){ie(e),ie(t),Er(e,"input"),Er(t,"options");let n=Hn(t.asOf??e.asOf,"asOf",{optional:!0}),r=gq(e.events||[]),o=n==null?r.events:r.events.filter(w=>Zv(w.occurredAt,n)),i=yq(t.method??e.method),s=bq(t.treatment??e.treatment),a=Eq(e.marketValues||[],n),c=[],l=[],u=new Set,d=[],p=[],f=new Set;for(let w of o){if(w.type==="acquisition"){if(u.has(w.lotId)){St(c,"duplicate-lot-id",w.id,`lotId ${JSON.stringify(w.lotId)} is already in use`),f.add(to(w.asset,w.location));continue}u.add(w.lotId),l.push(Oq(w,Aq(w,s,c)));continue}let S=Iq({event:w,lots:l,method:i,issues:c,tainted:f});if(w.type==="disposal"){let D=Sq(w,s,c),T=wm(D,S.matches.map(te=>te.quantity),BigInt(w.quantity)),P=S.matches.map((te,Se)=>{let _e=T[Se];return tt({lotId:te.lot.lotId,originLotId:te.lot.originLotId,quantity:te.quantity.toString(),basisMinor:Di(te.basis),proceedsMinor:Di(_e),gainMinor:te.basis==null||_e==null?null:(_e-te.basis).toString(),acquiredAt:te.lot.acquiredAt,evidenceStatus:te.lot.evidenceStatus})}),H=P.filter(te=>te.basisMinor!=null).reduce((te,Se)=>te+BigInt(Se.basisMinor),0n),z=S.missing===0n&&P.every(te=>te.basisMinor!=null),X=S.missing===0n&&D!=null;d.push(tt({eventId:w.id,asset:w.asset,location:w.location,occurredAt:w.occurredAt,quantity:w.quantity,grossProceedsMinor:w.grossAmountMinor,feeMinor:w.feeMinor,recognizedProceedsMinor:X?D.toString():null,basisMinor:z?H.toString():null,gainMinor:z&&X?(D-H).toString():null,unknownQuantity:S.missing.toString(),status:z&&X?"complete":"incomplete",evidenceStatus:w.evidence.status,matches:P}));continue}let N=BigInt(w.feeMinor),I=N>0n&&s.transferFees==="include-in-basis",U=N>0n&&s.transferFees==="unresolved";U&&St(c,"unresolved-transfer-fee-treatment",w.id,"fee treatment was not supplied; transferred lot basis remains unknown");let j=wm(I?N:0n,S.matches.map(D=>D.quantity),BigInt(w.quantity)),B=S.matches.map((D,T)=>{let P=D.basis;U?P=null:P!=null&&I&&(P+=j[T]);let H=`${w.id}:${T+1}`;return u.has(H)?(St(c,"duplicate-lot-id",w.id,`derived transfer lotId ${JSON.stringify(H)} is already in use`),f.add(to(w.asset,w.to)),null):(u.add(H),l.push({lotId:H,originLotId:D.lot.originLotId,acquisitionEventId:D.lot.acquisitionEventId,asset:w.asset,location:w.to,key:to(w.asset,w.to),acquiredAt:D.lot.acquiredAt,quantityRemaining:D.quantity,basisRemaining:P,evidenceStatus:w.evidence.status==="complete"&&D.lot.evidenceStatus==="complete"?"complete":"unknown"}),tt({fromLotId:D.lot.lotId,toLotId:H,originLotId:D.lot.originLotId,quantity:D.quantity.toString(),basisMinor:Di(P)}))}).filter(Boolean);S.indeterminate&&f.add(to(w.asset,w.to)),p.push(tt({eventId:w.id,asset:w.asset,from:w.from,to:w.to,occurredAt:w.occurredAt,quantity:w.quantity,feeMinor:w.feeMinor,unknownQuantity:S.missing.toString(),status:S.indeterminate||B.some(D=>D.basisMinor==null)?"incomplete":"complete",moved:B}))}let m=l.filter(w=>w.quantityRemaining>0n).sort((w,S)=>wr(w.key,S.key)||wr(w.lotId,S.lotId)),h=new Map;for(let w of m)h.has(w.key)||h.set(w.key,[]),h.get(w.key).push(w);let g=[];for(let[w,S]of[...h].sort(([N],[I])=>wr(N,I))){let N=S.reduce((D,T)=>D+T.quantityRemaining,0n),I=a.byHolding.get(w)||null,U=f.has(w),j=I;I?BigInt(I.quantity)!==N&&(St(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(I.id)} does not cover the recorded holding quantity`),j=null):St(c,"missing-market-value",null,`no market value was supplied for holding ${w}`),U&&(j=null);let B=wm(j?BigInt(j.valueMinor):null,S.map(D=>D.quantityRemaining),N);S.forEach((D,T)=>{let P=B[T],H=P==null||D.basisRemaining==null?null:P-D.basisRemaining;g.push(tt({lotId:D.lotId,originLotId:D.originLotId,acquisitionEventId:D.acquisitionEventId,asset:D.asset,location:D.location,acquiredAt:D.acquiredAt,quantity:D.quantityRemaining.toString(),basisMinor:U?null:Di(D.basisRemaining),marketValueMinor:Di(P),unrealizedGainMinor:U?null:Di(H),valuationId:j?.id??null,status:U||D.basisRemaining==null||P==null?"incomplete":"complete",evidenceStatus:D.evidenceStatus}))})}let b=Mi(d,"basisMinor"),y=Mi(d,"recognizedProceedsMinor"),v=Mi(d,"gainMinor"),A=Mi(g,"basisMinor"),x=Mi(g,"marketValueMinor"),O=Mi(g,"unrealizedGainMinor"),E=o.every(w=>BigInt(w.feeMinor)>0n?w.type==="acquisition"?s.acquisitionFees!=="unresolved":w.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),_={recordVersion:cq,recordType:"cost-basis-records",label:uq,asOf:n,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:r.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:E?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:y.value,basisMinor:b.value,gainMinor:v.value,knownProceedsSubtotalMinor:y.known,knownBasisSubtotalMinor:b.known,knownGainSubtotalMinor:v.known}},transfers:p,holdings:g,unrealized:{totals:{marketValueMinor:x.value,basisMinor:A.value,gainMinor:O.value,knownMarketValueSubtotalMinor:x.known,knownBasisSubtotalMinor:A.known,knownGainSubtotalMinor:O.known}},completeness:{accounting:c.some(w=>w.code!=="missing-market-value")?"incomplete":"complete",valuation:g.every(w=>w.marketValueMinor!=null)?"complete":"incomplete",evidence:kq(o,a.values),treatment:E?"specified":"unresolved"},issues:c};return tt(_)}var cq,lq,uq,dq,pq,fq,Em,Jv,tx=R(()=>{$i();cq=1,lq=Object.freeze(["fifo","lifo","hifo","specific"]),uq="Accounting records only; not tax advice.",dq=new Set(["acquisition","disposal","transfer"]),pq=new Set(["complete","incomplete","unknown"]),fq=/[\u0000-\u001f\u007f]/,Em=class extends Error{constructor(t,n="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=n}};Jv=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function ue(e,t){throw new Sm(e,t)}function No(e,t){return e<t?-1:e>t?1:0}function Xt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Xt(t);Object.freeze(e)}return e}function Oe(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ue(`${t} must be a plain object`),e}function zn(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&ue(`${t} must be a string`);let o=e.trim();return o||ue(`${t} is required`),Rq.test(o)&&ue(`${t} contains control characters`),o.length>512&&ue(`${t} is too long`),r?o.toLowerCase():o}function Jt(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&ue(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():ue(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||ue(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&ue(`${t} must be positive`),i.toString()}function sx(e,t){e==null&&ue(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&ue(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let n=Jt(e,t),r=BigInt(n);return r>BigInt(rx)&&ue(`${t} exceeds ${rx}`),Number(r)}function da(e,t){return e==null?null:zn(e,t)}function Pq(e,t){return e==null&&ue(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&ue(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):zn(String(e),t,{lower:!0})}function ee(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function Lq(e,t="protocol"){if(e==null)return"generic";let n=zn(e,t,{lower:!0}),r=Nq[n]||n;return Tq.has(r)||ue(`${t} must be a supported lending or yield protocol`),r}function px(e){return e.protocol!=null?Lq(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function $q(e,t="evidence"){if(e==null)return Xt({status:"unknown",references:[]});let n=Oe(e,t),r=zn(n.status??"unknown",`${t}.status`,{lower:!0});Cq.has(r)||ue(`${t}.status must be complete, incomplete, unknown, or stale`),n.references!=null&&!Array.isArray(n.references)&&ue(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=Oe(s,`${t}.references[${a}]`);return{kind:zn(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:zn(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>No(s.kind,a.kind)||No(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Xt({status:r,references:i})}function fx(e,t){if(e==null)return null;if(typeof e=="number"&&ue(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=Oe(e,t);if(o.bps!=null)return fx(o.bps,`${t}.bps`);if(o.ray!=null)return Am(o.ray,`${t}.ray`);if(o.wad!=null)return ax(o.wad,`${t}.wad`);if(o.raw!=null)return Am(o.raw,`${t}.raw`);o.value!=null&&ue(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),ue(`${t} must include bps, wad, or ray`)}let n=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(n)||ue(`${t} must be a non-negative base-10 integer string`);let r=BigInt(n);return r<=10000n?r.toString():r<=Bi?ax(r,t):Am(r,t)}function ax(e,t){let r=BigInt(Jt(e,t))*10000n/Bi;return r>10000n&&ue(`${t} exceeds 100%`),r.toString()}function Am(e,t){let n=BigInt(Jt(e,t)),r=10n**27n,o=n*10000n/r;return o>10000n&&ue(`${t} exceeds 100%`),o.toString()}function cx(e,t,n){let r=`${n}[${t}]`,o=Oe(e,r),i=zn(ee(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${r}.asset`),s=da(ee(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${r}.address`),a=Jt(ee(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${r}.amount`),c=sx(ee(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${r}.decimals`),l=Jt(ee(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${r}.price`),u=sx(ee(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${r}.priceDecimals`),d=null;if(n==="collateral"){let p=ee(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;p==null&&ue(`${r}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=fx(p,`${r}.liquidationThreshold`)}return Xt({asset:i,address:s,amount:a,decimals:String(c),price:l,priceDecimals:String(u),liquidationThresholdBps:d})}function Bl(e,t){return e==null?[]:(Array.isArray(e)||ue(`${t} must be an array`),e.length>ox&&ue(`${t} exceeds ${ox} assets`),e)}function Dq(e){let t=ee(e,["chain","chainId","network"]),n=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,r=Pq(t??n,"chain"),o=zn(ee(e,["account","address","owner","user","wallet"]),"account"),i=ee(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:r,account:o,market:i==null?null:zn(String(i),"market")}}function Mq(e,t){let n=Jt(t.asOf??e.asOf,"asOf"),r=Jt(ee(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Jt(ee(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:n,observedAt:r,expiresAt:o}}function Bq(e,t,n,r){return BigInt(r)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(r)>=BigInt(n)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function ua(e,t,n,r={}){return Xt({code:e,severity:t,message:n,...r})}function mx(e){let t={critical:0,warning:1,info:2};return[...e].sort((n,r)=>{let o=(t[n.severity]??9)-(t[r.severity]??9);return o||No(n.code,r.code)||No(n.message,r.message)})}function lx(e,t,n,r,o,i){return BigInt(e)*BigInt(n)*10n**BigInt(o-t)*10n**BigInt(i-r)}function Uq(e,t){let n=[...e,...t],r=n.reduce((b,y)=>Math.max(b,Number(y.decimals)),0),o=n.reduce((b,y)=>Math.max(b,Number(y.priceDecimals)),0),i=0n,s=0n,a=0n;for(let b of e){let y=lx(b.amount,Number(b.decimals),b.price,Number(b.priceDecimals),r,o);s+=y,i+=y*BigInt(b.liquidationThresholdBps)}for(let b of t)a+=lx(b.amount,Number(b.decimals),b.price,Number(b.priceDecimals),r,o);let c=10n**BigInt(r),l={tokenDecimals:String(r),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},u=(s/c).toString(),d=(a/c).toString(),p=(i/10000n/c).toString();if(a===0n)return Xt({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:p,quote:l});let f=(i*Bi/(a*10000n)).toString(),m=i/10000n-a,h=m<0n?"-":"",g=m<0n?-m:m;return Xt({healthFactorWad:f,healthFactorStatus:BigInt(f)<Bi?"liquidatable":"priced",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:`${h}${(g/c).toString()}`,quote:l})}function xt(e,t={}){ie(e),ie(t);let n=Oe(e,"snapshot");Oe(t,"options");let r=px(n),{chain:o,account:i,market:s}=Dq(n),a=$q(n.evidence),{asOf:c,observedAt:l,expiresAt:u}=Mq(n,t),d=zn(n.id??n.positionId??`${r}:${o}:${i}:${s??"default"}`,"id"),p=da(n.tenantId,"tenantId"),f=Bl(n.collateral??n.supplies??n.deposits,"collateral").map((g,b)=>cx(g,b,"collateral")),m=Bl(n.debt??n.borrows??n.liabilities,"debt").map((g,b)=>cx(g,b,"debt")),h={id:d,protocol:r,chain:o,account:i,market:s,observedAt:l,expiresAt:u,asOf:c,evidence:a,collateral:f,debt:m};return p&&(h.tenantId=p),Xt(h)}function qq(e){return ee(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function Fq(e,t={}){return ee(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??ee(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function jq(e){return ee(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function Hq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return xt({...n,protocol:"aave-v3"},t);let r=n.userReserves??n.reserves??n.market?.reserves;if(!Array.isArray(r))return xt({...n,protocol:"aave-v3"},t);let o=[],i=[];for(let s of r){let a=Oe(s,"reserve"),c=Oe(a.underlyingToken??a.token??a,"reserve.token"),l={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:ee(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:ee(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},u=ee(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=ee(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);u!=null&&u!=="0"&&o.push({...l,amount:u}),d!=null&&d!=="0"&&i.push({...l,amount:d})}return xt({...n,protocol:"aave-v3",collateral:n.collateral??o,debt:n.debt??i},t)}function zq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return xt({...n,protocol:"morpho"},t);let r=qq(n),o=n.collateralAsset??n.market?.collateralAsset??{},i=n.loanAsset??n.market?.loanAsset??{},s=n.position??n.state??{},a=[{asset:o.symbol??n.collateralSymbol,address:o.address,decimals:o.decimals??n.collateralDecimals,amount:ee(n,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:ee(n,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:ee(n,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:r}],c=n.debt??[{asset:i.symbol??n.loanSymbol,address:i.address,decimals:i.decimals??n.loanDecimals,amount:ee(n,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:ee(n,["loanPrice","debtPrice"])??i.price,priceDecimals:ee(n,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],l=(Array.isArray(c)?c:[c]).filter(u=>u&&u.amount!=null&&u.amount!=="0"&&u.amount!==0n);return xt({...n,protocol:"morpho",market:n.marketId??n.market?.marketId??n.market,collateral:Array.isArray(a)?a:[a],debt:l},t)}function Vq(e,t={}){ie(e);let n=Oe(e,"snapshot"),r=n.markets??n.cTokens??(n.cToken||n.underlying?[n]:null);if(n.collateral||n.debt)return xt({...n,protocol:"compound"},t);let o=[],i=[];for(let s of Bl(r??[],"markets")){let a=Oe(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:Fq(n,a)},l=ee(a,["supplyBalance","balance","amount","totalSupply"]),u=ee(a,["borrowBalance","borrow","debt","totalBorrow"]);l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return xt({...n,protocol:"compound",collateral:o,debt:i},t)}function Wq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.stale===!0||n.reserve?.lastUpdate?.stale===1)return xt({...n,protocol:"solend",evidence:{...n.evidence||{},status:"stale"}},t);if(n.collateral||n.debt)return xt({...n,protocol:"solend"},t);let r=n.reserves??n.obligation?.deposits??(n.mint||n.mintDecimals!=null?[n]:[]),o=[],i=[];for(let s of Bl(r,"reserves")){let a=Oe(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:jq(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??n.liquidationThresholdBps},l=ee(a,["depositedAmount","collateral","amount","availableAmount"]),u=ee(a,["borrowedAmount","borrowBalance","debt"]);if(u==null&&a.borrowedAmountWads!=null){let d=Jt(a.borrowedAmountWads,"borrowedAmountWads");u=(BigInt(d)/10n**18n).toString()}l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return xt({...n,protocol:"solend",collateral:o,debt:i},t)}function Gq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.collateral||n.debt)return xt({...n,protocol:"spark"},t);let r=n.vault??n.savingsVault??n.data?.vault??n,o=Oe(r,"vault"),i=[{asset:o.symbol??o.asset??n.token??"savings",address:o.address??n.address,decimals:o.decimals??n.decimals,amount:ee(n,["amount","shares","balance"])??o.amount??o.shares,price:ee(n,["price","priceQuoteMinor"])??o.price,priceDecimals:ee(n,["priceDecimals"])??o.priceDecimals,liquidationThreshold:ee(n,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=ee(n,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",address:n.debtAddress,decimals:n.debtDecimals??o.decimals??n.decimals,amount:s,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals??o.priceDecimals}];return xt({...n,protocol:"spark",collateral:i,debt:a},t)}function Kq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.tvlUsd!=null&&typeof n.tvlUsd=="number"&&ue("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(n.collateral)||Array.isArray(n.debt)){let c=xt({...n,protocol:"farming"},t),l=da(n.recipe??n.farmingMethod??n.methodId,"recipe");return Xt(l?{...c,recipe:l}:c)}let r=da(n.recipe??n.farmingMethod??n.methodId,"recipe"),o=[{asset:n.symbol??n.asset??n.project??"farm",address:n.pool??n.address,decimals:n.decimals,amount:ee(n,["amount","deposited","shares","collateral"]),price:ee(n,["price","priceQuoteMinor"]),priceDecimals:n.priceDecimals,liquidationThreshold:ee(n,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=ee(n,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",decimals:n.debtDecimals??n.decimals,amount:i,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals}],a=xt({...n,protocol:"farming",collateral:o,debt:s},t);return Xt(r?{...a,recipe:r}:a)}function Jq(e,t={}){ie(e);let n=Oe(e,"snapshot"),r=px(n);return Yq[r]({...n,protocol:r},t)}function Xq(e){let t=e==null?{}:Oe(e,"thresholds"),n=Jt(t.criticalHealthFactorWad??nx.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),r=Jt(t.warningHealthFactorWad??nx.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(r)<BigInt(n)&&ue("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Jt(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return Xt({criticalHealthFactorWad:n,warningHealthFactorWad:r,minLiquidationBufferQuoteMinor:o})}function Qq(e,t,n){let r=[];if(n.status!=="complete"){let a=n.reason||"UNKNOWN_EVIDENCE";return r.push(ua(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:n.status==="stale"?"stale":"unknown",findings:r,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:r,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:r,metrics:o};let i=BigInt(e.healthFactorWad);i<Bi?r.push(ua("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?r.push(ua("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&r.push(ua("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&r.push(ua("LIQUIDATION_BUFFER_LOW",i<Bi?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return r.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":r.some(a=>a.severity==="critical")?s="critical":r.length&&(s="warning"),{healthStatus:s,findings:r,metrics:o}}function vm(e={},t={}){ie(e),ie(t),Oe(e,"input"),Oe(t,"options"),t.asOf==null&&e.asOf==null&&ue("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let n=Jq(e,t),r=Xq(t.thresholds??e.thresholds),o=Bq(n.evidence,n.observedAt,n.expiresAt,n.asOf),i=Qq(o.status==="complete"?Uq(n.collateral,n.debt):{healthFactorStatus:"unknown"},r,o),s={recordVersion:ux,recordType:"position-health",label:dx,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:n.id,protocol:n.protocol,chain:n.chain,account:n.account,market:n.market,observedAt:n.observedAt,expiresAt:n.expiresAt,asOf:n.asOf,evidence:n.evidence,collateral:n.collateral,debt:n.debt,thresholds:r,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:mx(i.findings)};return n.tenantId&&(s.tenantId=n.tenantId),n.recipe&&(s.recipe=n.recipe),Xt(s)}function hx(e={},t={}){ie(e),ie(t);let n=Array.isArray(e)?{snapshots:e}:Oe(e,"input"),r=n.snapshots??n.positions;Array.isArray(r)||ue("snapshots must be an array"),r.length>ix&&ue(`snapshots exceed ${ix}`);let o=Jt(t.asOf??n.asOf,"asOf"),i=t.thresholds??n.thresholds,s=da(n.tenantId,"tenantId"),a=r.map((p,f)=>vm(s&&p?.tenantId==null?{...p,tenantId:s}:p,{...t,asOf:o,thresholds:i,index:f})).sort((p,f)=>No(p.chain,f.chain)||No(p.account,f.account)||No(p.id,f.id)),c=mx(a.flatMap(p=>p.findings.map(f=>({...f,positionId:p.id})))),l=a.filter(p=>p.healthStatus==="unknown"||p.healthStatus==="stale").length,u=a.filter(p=>p.findings.length>0).length,d={recordVersion:ux,recordType:"position-health-book",label:dx,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(u),failClosedCount:String(l),positions:a,findings:c};return s&&(d.tenantId=s),Xt(d)}var ux,dx,_q,nx,Tq,Nq,Cq,Rq,Bi,rx,ox,ix,Sm,Yq,gx=R(()=>{$i();ux=1,dx="Alert findings only; not an execution signal and not a live oracle.",_q=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),nx=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),Tq=new Set(_q),Nq=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),Cq=new Set(["complete","incomplete","unknown","stale"]),Rq=/[\u0000-\u001f\u007f]/,Bi=10n**18n,rx=36,ox=64,ix=128,Sm=class extends Error{constructor(t,n="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=n}};Yq=Object.freeze({"aave-v3":Hq,morpho:zq,compound:Vq,solend:Wq,spark:Gq,farming:Kq,generic:xt})});function $e(e,t){throw new xm(e,t)}function Co(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Co(t);Object.freeze(e)}return e}function Ar(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&$e(`${t} must be a plain object`),e}function $t(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&$e(`${t} must be a string`);let o=e.trim();return o||$e(`${t} is required`),aF.test(o)&&$e(`${t} contains control characters`),o.length>2048&&$e(`${t} is too long`),r?o.toLowerCase():o}function Vn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&$e(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():$e(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||$e(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&$e(`${t} must be positive`),i.toString()}function Ui(e,t){return e==null?null:$t(e,t)}function ro(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function uF(e,t="action"){let n=$t(e,t,{lower:!0});return rF.has(n)||$e(`${t} must be proposal, delegation, or vote`),n}function dF(e,t="proposal.state"){e==null&&$e(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let n=$t(e,t,{lower:!0});return oF.has(n)||$e(`${t} is not a recognized proposal state`),n==="unknown"&&$e(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),n}function pF(e){let t=$t(e,"support",{lower:!0});return iF.has(t)||$e("support must be for, against, or abstain"),t}function Ul(e,{accountRequired:t=!0}={}){return Co({chain:$t(ro(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:$t(ro(e,["governor","governorAddress","governance","contract"]),"governor"),account:$t(ro(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function fa(e,t){let n=Ui(t.tenantId??e.tenantId,"tenantId");return n?{tenantId:n}:{}}function ql(e,t,n="asOf"){return Vn(t.asOf??e.asOf,n)}function fF(e,t={}){ie(e),ie(t);let n=Ar(e,"proposal");Ar(t,"options");let r=ql(n,t),o=Ul(n,{accountRequired:!1}),i=$t(ro(n,["proposalId","id"]),"proposalId"),s=dF(ro(n,["state","status","proposalState"])),a=Ui(n.title??n.name,"title"),c=Ui(n.description??n.body??n.summary,"description"),l=Ui(n.proposer,"proposer"),u=Vn(n.startBlock??n.start,"startBlock",{optional:!0}),d=Vn(n.endBlock??n.end,"endBlock",{optional:!0}),p=Vn(n.forVotes??n.votesFor,"forVotes",{optional:!0}),f=Vn(n.againstVotes??n.votesAgainst,"againstVotes",{optional:!0}),m=Vn(n.abstainVotes??n.votesAbstain,"abstainVotes",{optional:!0}),h={recordVersion:pa,recordType:"governance-proposal",label:no,asOf:r,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:cF.has(s),terminal:lF.has(s),title:a,description:c,proposer:l,startBlock:u,endBlock:d,tallies:{forVotes:p,againstVotes:f,abstainVotes:m},occurred:!1,...fa(n,t)};return Co(h)}function mF(e,t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options");let r=ql(n,t),o=Ul(n),i=n.mode??(n.action==="undelegate"?"undelegate":"delegate"),s=$t(i,"mode",{lower:!0});sF.has(s)||$e("mode must be delegate or undelegate");let a=s==="undelegate"?Ui(n.delegatee??n.to,"delegatee"):$t(n.delegatee??n.to,"delegatee"),c=Vn(ro(n,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),l={recordVersion:pa,recordType:"governance-delegation-intent",label:no,action:"delegation",mode:s,asOf:r,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...fa(n,t)};return Co(l)}function hF(e,t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options");let r=ql(n,t),o=fF(n.proposal??n,t);o.votable||$e(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=Ul({...n,chain:n.chain??o.chain,governor:n.governor??o.governor}),s=pF(n.support??n.choice??n.vote),a=Vn(ro(n,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=Ui(n.reason??n.comment,"reason"),l={recordVersion:pa,recordType:"governance-vote-intent",label:no,action:"vote",asOf:r,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...fa(n,t)};return Co(l)}function gF(e,t={}){ie(e);let n=Ar(e,"intent"),r=ql(n,t),o=Ul(n),i=$t(n.title??n.name,"title"),s=$t(n.description??n.body,"description"),a=n.targets;(!Array.isArray(a)||a.length===0)&&$e("targets must be a non-empty array");let c=(n.values??a.map(()=>"0")).map((d,p)=>Vn(d,`values[${p}]`));c.length!==a.length&&$e("values length must match targets");let l=(n.calldatas??n.data??[]).map((d,p)=>$t(String(d),`calldatas[${p}]`));l.length!==a.length&&$e("calldatas length must match targets");let u=Vn(ro(n,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return Co({recordVersion:pa,recordType:"governance-proposal-intent",label:no,action:"proposal",asOf:r,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,p)=>$t(d,`targets[${p}]`)),values:c,calldatas:l,votingPower:u,occurred:!1,...fa(n,t)})}function yF(e,t,n){return e==="vote"?hF(t,n):e==="delegation"?mF(t,n):gF(t,n)}function bF(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,no]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",no]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",no]}function yx(e={},t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options"),t.asOf==null&&n.asOf==null&&$e("explicit asOf required","GOVERNANCE_MISSING_ASOF");let r=uF(n.action??n.type??t.action??wF(n)),o=yF(r,{...n,action:r},t);return Co({recordVersion:pa,recordType:"governance-preview",label:no,action:r,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:bF(o),intent:o,...fa(n,t)})}function wF(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";$e("action is required")}var pa,no,Zq,eF,tF,nF,rF,oF,iF,sF,aF,cF,lF,xm,bx=R(()=>{$i();pa=1,no="Unsigned prepare material only; no vote, signature, or broadcast occurred.",Zq=Object.freeze(["proposal","delegation","vote"]),eF=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),tF=Object.freeze(["for","against","abstain"]),nF=Object.freeze(["delegate","undelegate"]),rF=new Set(Zq),oF=new Set(eF),iF=new Set(tF),sF=new Set(nF),aF=/[\u0000-\u001f\u007f]/,cF=new Set(["active"]),lF=new Set(["executed","defeated","canceled","expired"]),xm=class extends Error{constructor(t,n="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=n}}});import{createHash as EF}from"node:crypto";import{getAddress as AF,wordlists as SF}from"ethers";import{address as vF}from"@solana/addresses";import{base58check as xF,bech32 as wx,bech32m as IF}from"@scure/base";import{sha256 as kF}from"@noble/hashes/sha2.js";function Ix(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function GF(e){let t=Ix(e);return MF.some(n=>t.includes(n))}function KF(e){return VF.has(Ix(e))}function YF(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return FF.has(t.length)&&t.every(n=>SF.en.getWordIndex(n)>=0)}function Kn(e){let t=new WeakSet,n=0;function r(o,i,s,a=""){if(n+=1,n>RF)throw new RangeError("safety-intelligence: input is too large");if(s>PF)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>LF)throw new RangeError(`safety-intelligence: string too long at ${i}`);if(BF.test(o)||UF.test(o)||YF(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(qF.test(o)&&!KF(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>ma)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(l=>Number.isInteger(l)&&l>=0&&l<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((l,u)=>r(l,`${i}[${u}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(l=>typeof l=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let l of c){if(GF(l))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${l}`);let u=Object.getOwnPropertyDescriptor(o,l),d=u&&"get"in u&&typeof u.get=="function"?u.get.call(o):o[l];d!==void 0&&r(d,`${i}.${l}`,s+1,l)}t.delete(o)}return r(e,"$",0),e}function It(e,t,n){for(let r of Object.keys(e||{}))if(!t.has(r))throw new TypeError(`safety-intelligence: unknown ${n} field ${r}`)}function Sr(e,t,n,{required:r=!1}={}){if(e==null||e===""){if(r)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&r)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>n)throw new RangeError(`safety-intelligence: ${t} exceeds ${n} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function Fl(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let n;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);n=e}else if(typeof e=="string"){let r=e.trim();if(HF.test(r)&&r.length<=zF){if(n=Number(r),!Number.isSafeInteger(n))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(jF.test(r)){if(n=Date.parse(r),!Number.isFinite(n)||new Date(n).toISOString().replace(/\.000Z$/,"Z")!==r&&new Date(n).toISOString()!==r)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(n))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:n,iso:new Date(n).toISOString()}}function kx(e,t){return e==null||e===""?null:Fl(e,t)}function vx(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function Ox(e){Kn(e);let t,n;if(Number.isInteger(e))t="evm",n=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",n=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=vx(s[1]),n=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))It(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=vx(e.family??e.namespace??(e.chainId!=null?"evm":"")),n=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof n=="string"&&/^\d+$/.test(n)?Number(n):n;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return Ge({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let r=Sr(n,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(r))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return Ge({family:t,namespace:o,reference:r,network:r,key:`${o}:${r}`})}function JF(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function XF(e,t){let n=Sr(e,"bitcoin address",100,{required:!0}),r=JF(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(n)){if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=n.toLowerCase(),a,c;try{a=wx.decode(s,100),c="bech32"}catch{try{a=IF.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let l=a.words[0],u;try{u=wx.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(l)||l<0||l>16||u.length<2||u.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(l===0&&(c!=="bech32"||![20,32].includes(u.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(l>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=r==="mainnet"?"bc":r==="testnet"?"tb":r==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=DF.decode(n)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(r==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((r==="testnet"||r==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:n,display:n}}function QF(e,t){let n=Ox(t);Kn(e);let r=Sr(e,`${n.family} address`,128,{required:!0});if(n.family==="evm"){let o=r.startsWith("0X")?`0x${r.slice(2)}`:r,i;try{i=AF(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return Ge({canonical:i.toLowerCase(),display:i})}if(n.family==="solana"){let o;try{o=String(vF(r))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return Ge({canonical:o,display:o})}return Ge(XF(r,n))}function vr(e={}){if(Kn(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");It(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),n=Ox(t),r=QF(e.address,n);return Ge({chain:n,address:r.canonical,displayAddress:r.display,key:`${n.key}:${r.canonical}`})}function Gn(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Gn).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Gn(e[t])}`).join(",")}}`}function Om(e){return EF("sha256").update(e).digest("hex")}function Ge(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Ge(t);return Object.freeze(e)}function Im(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),r={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!r||!TF.has(r))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return r}function ZF(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let n=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),r=WF[n];if(!r)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return r}function ej(e,t){let n=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!n){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return vr(n)}function tj(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");It(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),It(t,new Set(["target","asOf"]),"evidence option");let n=ej(e,t.target?vr(t.target):null),r=Im(e.kind??e.type??e.category),o=ZF(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=Sr(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=Fl(e.fetchedAt,"evidence fetchedAt"),l=kx(e.expiresAt??e.expiry,"evidence expiresAt");if(!l&&e.ttlMs!=null){let g=Number(e.ttlMs);if(!Number.isSafeInteger(g)||g<=0||g>Ax)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${Ax}`);l={ms:c.ms+g,iso:new Date(c.ms+g).toISOString()}}if(!l)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(l.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let u=Fl(t.asOf,"asOf").ms,d=c.ms>u+$F?"FUTURE":l.ms<=u?"STALE":"CURRENT",p=Sr(e.sourceRecordId??e.recordId??e.reference,"source record id",160),f=Sr(e.summary,"evidence summary",500),m={kind:r,verdict:o,source:s,...p?{sourceRecordId:p}:{},fetchedAt:c.iso,expiresAt:l.iso,confidence:a,freshness:d,target:n.key,...f?{summary:f}:{}},h=`safety-evidence:${Om(Gn(m))}`;return Ge({id:h,...m})}function nj(e=[],t={}){if(Kn({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let n=t.maxEvidence??NF;if(!Number.isSafeInteger(n)||n<=0||n>ma)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>n)throw new RangeError(`safety-intelligence: evidence exceeds ${n} records`);It(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let r={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=tj(i,r);return[s.id,s]}));return Ge([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function rj(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${n}] must be an object`);It(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let r=vr({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=Sr(e.id,"contact id",120),i=Sr(e.label,"contact label",120);return Ge({...o?{id:o}:{},...i?{label:i}:{},target:r})}function jl(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let n=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(n)||n.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(n).toString()}function oj(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${n}] must be an object`);It(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let r=e.counterparty??e.address??e.from,o=vr({address:r,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=jl(e.amountBaseUnits,`observations[${n}].amountBaseUnits`),c=kx(e.observedAt,`observations[${n}].observedAt`)?.iso??null;return Ge({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function ij(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function sj(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function xx(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function Wn(e){return Ge({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function km(e){let t=new Map;for(let n of e){let r=Gn(n);t.set(r,n)}return[...t.values()].sort((n,r)=>(Sx[n.severity]??9)-(Sx[r.severity]??9)||n.category.localeCompare(r.category)||n.code.localeCompare(r.code)||Gn(n).localeCompare(Gn(r)))}function aj(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");It(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),It(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let n=vr(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(r))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??CF,s=t.maxObservations??ma;if(!Number.isSafeInteger(i)||i<=0||i>ma)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>ma)throw new RangeError("safety-intelligence: invalid maxObservations");if(r.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=r.map((f,m)=>rj(f,n.chain,m)).sort((f,m)=>f.target.key.localeCompare(m.target.key)||String(f.id||f.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((f,m)=>oj(f,n.chain,m)).sort((f,m)=>Gn(f).localeCompare(Gn(m))),l=a.filter(f=>f.target.chain.key===n.chain.key),u=l.filter(f=>f.target.address===n.address),d=[],p=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")p=vr({chain:n.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))It(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),p=vr({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:n.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");p.key!==n.key&&d.push(Wn({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[p.key,n.key]}))}if(u.length===0){let f=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(f)||f<3||f>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=xx(n);for(let h of l){let g=xx(h.target),b=ij(m,g),y=sj(m,g);b>=f&&y>=f&&m!==g&&d.push(Wn({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${f} leading and trailing characters with a different known contact.`,relatedTargets:[h.target.key,n.key]}))}if(e.dustThresholdBaseUnits!=null){let h=BigInt(jl(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(b=>b.target.key===n.key&&b.direction==="inbound"&&BigInt(b.amountBaseUnits)<=h).length>0&&d.push(Wn({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[n.key]}))}}return Ge({target:n,exactKnownContact:u.length>0,exactContacts:u,findings:km(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:jl(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function cj(e){let t=e??_F;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let n=t.map((o,i)=>{if(typeof o=="string")return{kind:Im(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return It(o,new Set(["kind","source"]),"required check"),{kind:Im(o.kind),source:Sr(o.source,"required check source",120,{required:!0})}}),r=new Map(n.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return Ge([...r.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function lj(e,t){return e.filter(n=>n.kind===t.kind&&(!t.source||n.source===t.source))}function uj(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function _x(e){return Kn(e),`sha256:${Om(Gn(e))}`}function _m(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(It(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),It(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let n=Fl(t.asOf,"asOf").iso,r=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=vr(r),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[g,b]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(b)||b<0||b>1)throw new TypeError(`safety-intelligence: ${g} must be between 0 and 1`);let a=nj(e.evidence??[],{target:o,asOf:n,maxEvidence:t.maxEvidence}),c=a.filter(g=>g.target===o.key),l=cj(e.requiredChecks),u=[];for(let g of c)g.freshness==="CURRENT"&&g.verdict==="BLOCK"?u.push(Wn({code:g.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:g.confidence>=s?"BLOCK":"REVIEW",category:g.kind,basis:"explicit-evidence",message:g.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[g.id]})):g.freshness==="CURRENT"&&g.verdict==="REVIEW"?u.push(Wn({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[g.id]})):g.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(g.verdict)?u.push(Wn({code:g.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[g.id]})):g.freshness==="CURRENT"&&g.verdict==="UNKNOWN"&&u.push(Wn({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:g.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[g.id]}));for(let g of l){let b=lj(c,g),y=b.filter(x=>x.freshness==="CURRENT"),v=y.filter(x=>x.verdict==="CLEAR"&&x.confidence>=i),A=y.filter(x=>x.verdict==="BLOCK");if(v.length>0&&A.length>0&&u.push(Wn({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[...v,...A].map(x=>x.id)})),v.length===0){let x=y.filter(_=>_.verdict==="CLEAR"),O=b.filter(_=>_.verdict==="CLEAR"&&_.freshness!=="CURRENT"),E=g.source?`${g.kind} from ${g.source}`:g.kind;u.push(Wn({code:x.length>0?"CLEAR_CONFIDENCE_TOO_LOW":O.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:g.kind,basis:"coverage",message:`Required check ${E} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...x,...O].map(_=>_.id)}))}}let d=aj({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});u.push(...d.findings);let p=km(u),f=uj(p);f==="CLEAR"&&(p=km([Wn({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(g=>g.freshness==="CURRENT"&&g.verdict==="CLEAR").map(g=>g.id)})]),f="CLEAR");let m={version:Ex,target:o.key,evaluatedAt:n,decision:f,gate:f==="CLEAR"?"CONTINUE":f==="BLOCK"?"BLOCK":"HOLD",requiredChecks:l,evidenceIds:c.map(g=>g.id).sort(),findings:p},h=Ge({...m,hash:_x(m)});return Ge({version:Ex,target:o,evaluatedAt:n,status:f,evidence:a,requiredChecks:l,poisoning:d,policy:h})}function dj(e={}){if(Kn(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");It(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=vr(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.amountBaseUnits??e.valueBaseUnits,r=n==null?null:jl(n,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:r};return Ge({id:`safety-transaction:${Om(Gn(o))}`,...o})}function Tx(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");It(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let n=dj(e.transaction),r=_m({target:n.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=r.policy,s={...i,transactionId:n.id},a=Ge({...s,hash:_x(s)});return Ge({...r,transaction:n,policy:a})}var Ex,$G,OF,_F,TF,NF,CF,ma,RF,PF,LF,Ax,$F,DF,MF,BF,UF,qF,FF,jF,HF,zF,VF,WF,Sx,Nx=R(()=>{Ex=1,$G=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),OF=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),_F=Object.freeze(["sanctions","phishing","scam"]),TF=new Set(OF),NF=128,CF=256,ma=512,RF=4096,PF=8,LF=2048,Ax=366*24*60*60*1e3,$F=6e4,DF=xF(kF),MF=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],BF=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,UF=/\bxprv[0-9A-Za-z]{50,}\b/,qF=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,FF=new Set([12,15,18,21,24]),jF=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,HF=/^\d+$/,zF=String(Number.MAX_SAFE_INTEGER).length,VF=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),WF=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),Sx=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var MG,BG,UG,Tm=R(()=>{MG=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),BG=Object.freeze(["read","simulate"]),UG=1440*60});function Cx(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return fj.test(t)||mj.includes(n)}function xr(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=gj.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of hj)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Ro(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Cx(o))throw new Ro(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");xr(o,`${t}[key]`,n),xr(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())xr(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>xr(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(Cx(o))throw new Ro(`${t}.${o}`,"forbidden-key-name");xr(i,`${t}.${o}`,n,o)}return e}var Ro,fj,mj,hj,gj,Nm=R(()=>{Tm();Ro=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},fj=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,mj=Object.freeze(["privkey","wif","xprv","seed"]);hj=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),gj=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as yj}from"node:crypto";function Rm(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Rm).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Rm(e[t])}`).join(",")}}`}function bj(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Hl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Hl(t)}return e}function Pm(e,t="fact"){try{xr(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Lx(e){return yj("sha256").update(Rm(e)).digest("hex")}function $x({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:bj(n)};return Hl({...s,hash:Lx(s)})}function zl({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Pm(t,"intent");let r=$x({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return Hl({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function Dx(e,t,n,r={}){if(Lm(e),!(Rx[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Pm(n,t);let i=r.external===!0||r.externallySupplied===!0;if(Px.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=r.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=$x({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return Hl({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Lm(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(Lx(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Pm(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Rx[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(Px.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Cm,Rx,Px,$m=R(()=>{Nm();Cm=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Rx=Object.freeze(Object.fromEntries(Cm.map((e,t)=>[e,Object.freeze(t+1<Cm.length?[Cm[t+1]]:[])]))),Px=new Set(["signed","broadcast"])});function Mx(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return wj[t]??t}function Ej(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Mx(e)}:${t}`)}function un(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:Vl(n)})}function Aj(e,t){let n=Dt(e.repeatBuys??e.repeat_buys??e.buyCount),r=Dt(e.walletWinRate??e.winRate);un(t,"repeat_buys",n===null?null:mt((n-1)/4)*.38),un(t,"wallet_win_rate",r===null?null:(mt(r)-.5)*.5)}function Sj(e,t){let n=Dt(e.ageHours??e.poolAgeHours),r=Dt(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;un(t,"pool_age",n===null?null:n<24?-.42:mt(n/720)*.12),un(t,"liquidity",r===null?null:(mt(Math.log10(Math.max(1,r))/7)-.5)*.28),un(t,"liquidity_lock",o==null?null:o?.12:-.28)}function vj(e,t){let n=Dt(e.floorChange??e.floorChangePct),r=Dt(e.sales??e.saleCount);un(t,"floor_change",n===null?null:mt(n,-1,1)*.35),un(t,"sales_depth",r===null?null:mt(r/50)*.18)}function xj(e,t){let n=Dt(e.flowImbalance??e.imbalance),r=Dt(e.fundingRate??e.funding);un(t,"flow_imbalance",n===null?null:mt(n,-1,1)*.42),un(t,"funding",r===null?null:-mt(r*100,-1,1)*.12)}function Ij(e,t){let n=Dt(e.marketProbability??e.marketPrice??e.probability),r=Dt(e.fairProbability??e.referenceProbability??e.fairValue);un(t,"probability_mispricing",n===null||r===null?null:mt(r-n,-1,1)*.65);let o=Dt(e.liquidityUsd??e.liquidity);un(t,"market_liquidity",o===null?null:mt(Math.log10(Math.max(1,o))/6)*.12)}function Oj(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>Dt(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function Wl(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=mt(Dt(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=Mx(o),a=Ej(o,i),c=kj[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=Vl(mt(l.length/u)),p=l.reduce((v,A)=>v+A.value,0),f=Oj(o,a,t),m=f===null?0:mt(f,-1,1)*.35;f!==null&&un(l,"shadow_markout",m);let h=Vl(mt(.5+p+m)),g=f===null?.8:mt(.85+f*.3,.35,1),b=Vl(mt(d*g)),y=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||y.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&y.push("LOW_COVERAGE","NO_TRADE"),b<.5&&y.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Dt(o.ageHours??o.poolAgeHours)??1/0)<24&&y.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&y.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:b,coverage:d,contributions:l,flags:[...new Set(y)],noTrade:y.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var XG,wj,mt,Dt,Vl,kj,Dm=R(()=>{XG=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),wj=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),mt=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),Dt=e=>Number.isFinite(Number(e))?Number(e):null,Vl=e=>Math.round(e*1e4)/1e4;kj=Object.freeze({wallet:Aj,pool:Sj,nft_floor:vj,hl_flow:xj,prediction_market:Ij})});function _j(e=[],t=[],n={}){let r=Wl(e,t,n),o=r.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=r.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(n.promoteMinConfidence??.55)&&(a.score??0)>=(n.promoteMinScore??.55));return{scored:r,candidates:s,blocked:i}}function Tj(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let n=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),r={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=zl({tradeId:n,intent:r,asOf:t.asOf??Date.now()});return{tradeId:n,intent:r,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function Bx(e=[],t=[],n={}){let{scored:r,candidates:o,blocked:i}=_j(e,t,n),s=Math.min(Math.max(Number(n.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(Tj(c,{asOf:n.asOf,tradeId:n.tradeIdPrefix?`${n.tradeIdPrefix}-${c.id}`:void 0,intentExtra:n.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:r.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Ux=R(()=>{Dm();$m()});function Nj(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function qx(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=Nj(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}var Fx=R(()=>{});import{createHash as Cj,timingSafeEqual as Rj}from"node:crypto";function r6(e){if(e==null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Hm(e,t){if(!r6(e))throw new TypeError(`${t} must be a plain object`);for(let n of Reflect.ownKeys(e)){if(typeof n!="string")throw new TypeError(`${t} may contain only string keys`);let r=Object.getOwnPropertyDescriptor(e,n);if(!r?.enumerable||!("value"in r))throw new TypeError(`${t}.${n} must be an enumerable data field`)}return e}function Ot(e,t,n){Hm(e,n);let r=Object.keys(e).sort(),o=[...t].sort();if(r.length!==o.length||r.some((i,s)=>i!==o[s])){let i=o.filter(a=>!r.includes(a)),s=r.filter(a=>!o.includes(a));throw new TypeError(`${n} keys must be exact (missing: ${i.join(",")||"none"}; unknown: ${s.join(",")||"none"})`)}}function Ir(e,t,{min:n=0,max:r=1e3}={}){if(!Array.isArray(e)||e.length<n||e.length>r)throw new TypeError(`${t} must be an array with ${n}..${r} entries`);return e}function ht(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(typeof e!="number"||!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be a safe integer from ${n} through ${r}`);return e}function ji(e,t){return e===null?null:ht(e,t,{min:1})}function _n(e,t,n=256){if(typeof e!="string"||e.length<1||e.length>n||e!==e.trim()||!zj.test(e))throw new TypeError(`${t} must be non-empty printable text up to ${n} characters`);return e}function Yn(e,t){if(typeof e!="string"||!Fm.test(e))throw new TypeError(`${t} must be lowercase sha256 hex`);return e}function kt(e,t){if(typeof e!="string"||!jj.test(e.toLowerCase()))throw new TypeError(`${t} must be a 20-byte EVM address`);return e.toLowerCase()}function De(e,t,{positive:n=!1}={}){if(typeof e=="string"&&!/^(0|[1-9][0-9]*)$/.test(e))throw new TypeError(`${t} must be an unsigned decimal integer`);let r=qx(e,t);if(r<0n||r>Dj||n&&r===0n)throw new RangeError(`${t} is outside uint256 bounds`);return r.toString(10)}function Gl(e,t){return De(e,t,{positive:!0})}function jx(e,t){if(typeof e!="string"||!Hj.test(e.toLowerCase()))throw new TypeError(`${t} must be complete, even-length 0x calldata`);return e.toLowerCase()}function Kx(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Kx(t);Object.freeze(e)}return e}function jm(e,t=new WeakMap){if(e==null||typeof e!="object")return e;if(t.has(e))return t.get(e);if(Array.isArray(e)){let r=[];t.set(e,r);for(let o of e)r.push(jm(o,t));return r}let n={};t.set(e,n);for(let[r,o]of Object.entries(e)){let i=String(r).toLowerCase().replace(/[_-]/g,"");if(!(o6.has(r)||r==="storageKeys")){if(Uj.test(i))throw new Ro(`$.${r}`,"forbidden-key-name");if(typeof o=="string"&&/^(?:0x)?[0-9a-f]{64}$/i.test(o)&&qj.test(i)){n[r]="public-digest";continue}n[r]=jm(o,t)}}return n}function Kl(e,t){xr(jm(e),t)}function Yx(e,t){let n=_n(e,t,128);if(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(n))throw new TypeError(`${t} must be a bounded tenant identifier`);return n}function i6(e,t){if(typeof e!="string"||!/^0x[0-9a-f]{64}$/.test(e.toLowerCase()))throw new TypeError(`${t} must be a 32-byte storage key`);return e.toLowerCase()}function s6(e,t){return Ir(e,t,{min:0,max:128}).map((n,r)=>{let o=`${t}[${r}]`;Ot(n,n6,o);let i=[...new Set(Ir(n.storageKeys,`${o}.storageKeys`,{min:0,max:256}).map((s,a)=>i6(s,`${o}.storageKeys[${a}]`)))].sort();return{address:kt(n.address,`${o}.address`),storageKeys:i}}).sort((n,r)=>n.address<r.address?-1:n.address>r.address?1:0)}function a6(e,t){let n=Bj[typeof e=="string"?e.trim().toLowerCase():e];if(n==null)throw new TypeError(`${t} must be a closed EVM transaction type`);if($j.includes(n))throw new TypeError(`${t} ${n} is unsupported; blob and EIP-7702 fields are refused rather than partially bound`);if(!Mj.has(n))throw new TypeError(`${t} is unsupported`);return n}function c6(e){let t=new Set;function n(r,o,i){if(i>256)throw new TypeError(`canonical JSON nesting exceeds 256 at ${o}`);if(r===null)return"null";if(typeof r=="string"||typeof r=="boolean")return JSON.stringify(r);if(typeof r=="number"){if(!Number.isSafeInteger(r))throw new TypeError(`canonical JSON number at ${o} must be a safe integer`);return JSON.stringify(r)}if(typeof r!="object")throw new TypeError(`canonical JSON does not allow ${typeof r} at ${o}`);if(t.has(r))throw new TypeError(`canonical JSON does not allow cycles at ${o}`);t.add(r);let s;return Array.isArray(r)?s=`[${r.map((a,c)=>n(a,`${o}[${c}]`,i+1)).join(",")}]`:(Hm(r,o),s=`{${Object.keys(r).sort().map(c=>`${JSON.stringify(c)}:${n(r[c],`${o}.${c}`,i+1)}`).join(",")}}`),t.delete(r),s}return n(e,"$",0)}function Yl(e){return Cj("sha256").update(c6(e),"utf8").digest("hex")}function l6(e,t,n){let r=Ir(e,n,{min:1,max:1e3}).map((o,i)=>{let s=`${n}[${i}]`;Ot(o,Wj,s);let a=Gl(o.chainId,`${s}.chainId`),c=[...new Set(Ir(o.destinations,`${s}.destinations`,{min:1,max:2e3}).map((l,u)=>kt(l,`${s}.destinations[${u}]`)))].sort();return{chainId:a,destinations:c}}).sort((o,i)=>BigInt(o.chainId)<BigInt(i.chainId)?-1:BigInt(o.chainId)>BigInt(i.chainId)?1:0);if(new Set(r.map(o=>o.chainId)).size!==r.length)throw new TypeError(`${n} has duplicate chainId rows`);if(r.some(o=>!t.includes(o.chainId))||t.some(o=>!r.some(i=>i.chainId===o)))throw new TypeError(`${n} must contain exactly one row for every allowed chain`);return r}function Jx(e){Kl(e,"resolved policy"),Ot(e,Vj,"resolved policy");let t=e.grantId===null?null:Yn(e.grantId,"resolved policy.grantId"),n=ji(e.grantExpiresAtMs,"resolved policy.grantExpiresAtMs");if(t===null!=(n===null))throw new TypeError("resolved policy grant id and expiry must both be null or present");let r=[...new Set(Ir(e.allowedChainIds,"resolved policy.allowedChainIds",{min:1,max:1e3}).map((i,s)=>Gl(i,`resolved policy.allowedChainIds[${s}]`)))].sort((i,s)=>BigInt(i)<BigInt(s)?-1:BigInt(i)>BigInt(s)?1:0),o={policyVersion:e.policyVersion,allowedChainIds:r,destinationAllowlist:l6(e.destinationAllowlist,r,"resolved policy.destinationAllowlist"),maxValuePerTxWei:De(e.maxValuePerTxWei,"resolved policy.maxValuePerTxWei"),maxDailyValueWei:De(e.maxDailyValueWei,"resolved policy.maxDailyValueWei"),maxGasLimit:De(e.maxGasLimit,"resolved policy.maxGasLimit",{positive:!0}),maxFeePerGasWei:De(e.maxFeePerGasWei,"resolved policy.maxFeePerGasWei"),maxPriorityFeePerGasWei:De(e.maxPriorityFeePerGasWei,"resolved policy.maxPriorityFeePerGasWei"),maxSlippageBps:ht(e.maxSlippageBps,"resolved policy.maxSlippageBps",{min:0,max:1e4}),expiresAtMs:ht(e.expiresAtMs,"resolved policy.expiresAtMs",{min:1}),grantId:t,grantExpiresAtMs:n};if(o.policyVersion!==1)throw new TypeError("resolved policy.policyVersion must be 1");if(BigInt(o.maxValuePerTxWei)>BigInt(o.maxDailyValueWei))throw new RangeError("resolved policy per-transaction value cap exceeds daily cap");if(BigInt(o.maxPriorityFeePerGasWei)>BigInt(o.maxFeePerGasWei))throw new RangeError("resolved policy priority fee cap exceeds total fee cap");return o}function u6(e){return Yl(Jx(e))}function Xx(e,t){let n=`calls[${t}]`;Ot(e,Gj,n);let r=a6(e.type,`${n}.type`),o=kt(e.from,`${n}.from`),i=s6(e.accessList,`${n}.accessList`);if(r==="legacy"){if(e.maxFeePerGas!==null||e.maxPriorityFeePerGas!==null)throw new TypeError(`${n} legacy transactions bind gasPrice and leave eip1559 fees null`);if(i.length!==0)throw new TypeError(`${n} legacy transactions must use an empty accessList`);return{type:r,chainId:Gl(e.chainId,`${n}.chainId`),from:o,to:kt(e.to,`${n}.to`),value:De(e.value,`${n}.value`),data:jx(e.data,`${n}.data`),gasLimit:De(e.gasLimit,`${n}.gasLimit`,{positive:!0}),gasPrice:De(e.gasPrice,`${n}.gasPrice`),maxFeePerGas:null,maxPriorityFeePerGas:null,accessList:i,nonce:De(e.nonce,`${n}.nonce`)}}if(e.gasPrice!==null)throw new TypeError(`${n} typed transactions bind eip1559 fees and leave gasPrice null`);if(r==="eip1559"&&i.length!==0)throw new TypeError(`${n} eip1559 transactions must use an empty accessList; use eip2930 to bind accessList`);let s=De(e.maxFeePerGas,`${n}.maxFeePerGas`),a=De(e.maxPriorityFeePerGas,`${n}.maxPriorityFeePerGas`);if(BigInt(a)>BigInt(s))throw new RangeError(`${n} priority fee exceeds max fee`);return{type:r,chainId:Gl(e.chainId,`${n}.chainId`),from:o,to:kt(e.to,`${n}.to`),value:De(e.value,`${n}.value`),data:jx(e.data,`${n}.data`),gasLimit:De(e.gasLimit,`${n}.gasLimit`,{positive:!0}),gasPrice:null,maxFeePerGas:s,maxPriorityFeePerGas:a,accessList:i,nonce:De(e.nonce,`${n}.nonce`)}}function zm(e,t,n){let r=kt(t,n);for(let[o,i]of e.entries())if(i.from!==r)throw new Error(`${n} does not match calls[${o}].from`);return r}function Qx(e){Ot(e,Kj,"route");let t={provider:_n(e.provider,"route.provider",128),venue:kt(e.venue,"route.venue"),routeId:_n(e.routeId,"route.routeId",512)};return{...t,routeDigest:Yl(t)}}function Zx(e){Ot(e,Yj,"route");let{routeDigest:t,...n}=e,r=Qx(n);if(Yn(t,"route.routeDigest")!==r.routeDigest)throw new Error("route digest mismatch");return r}function d6(e){return{quoteId:e.quoteId===null?null:_n(e.quoteId,"quote.quoteId",512),account:kt(e.account,"quote.account"),recipient:kt(e.recipient,"quote.recipient"),assetIn:kt(e.assetIn,"quote.assetIn"),assetOut:kt(e.assetOut,"quote.assetOut"),amountIn:De(e.amountIn,"quote.amountIn"),amountOut:De(e.amountOut,"quote.amountOut"),minAmountOut:De(e.minAmountOut,"quote.minAmountOut"),slippageBps:ht(e.slippageBps,"quote.slippageBps",{min:0,max:1e4}),slippageGuardDigest:Yn(e.slippageGuardDigest,"quote.slippageGuardDigest")}}function eI(e){Ot(e,Wx,"quote");let t=d6(e);if(BigInt(t.minAmountOut)>BigInt(t.amountOut))throw new RangeError("quote.minAmountOut exceeds quote.amountOut");return{...t,quoteDigest:Yl(t)}}function tI(e){Ot(e,Jj,"quote");let{quoteDigest:t,...n}=e,r=eI(n);if(Yn(t,"quote.quoteDigest")!==r.quoteDigest)throw new Error("quote digest mismatch");return r}function nI(e){if(Ot(e,Xj,"simulation"),_n(e.status,"simulation.status",32).toLowerCase()!=="success")throw new Error(`simulation status ${JSON.stringify(e.status)} is not successful`);if(e.stateOverridesDigest!==null)throw new Error("mainnet approval refuses simulation state overrides");if(typeof e.blockHash!="string"||!Fj.test(e.blockHash.toLowerCase()))throw new TypeError("simulation.blockHash must be a 32-byte block hash");return{engine:_n(e.engine,"simulation.engine",128),status:"success",blockNumber:De(e.blockNumber,"simulation.blockNumber",{positive:!0}),blockHash:e.blockHash.toLowerCase(),stateOverridesDigest:null,balanceDeltasDigest:Yn(e.balanceDeltasDigest,"simulation.balanceDeltasDigest"),logsDigest:Yn(e.logsDigest,"simulation.logsDigest")}}function p6(e,t,n){let o={balanceAtLeast:["account","asset"],balanceAtMost:["account","asset"],allowanceEquals:["account","asset","spender"],ownerOf:["collection","tokenId"],positionSizeAtMost:["account","asset"],noNewApproval:["account","allowedSpender"]}[e];if(!o)throw new TypeError(`${n} kind is unsupported`);Ot(t,o,`${n}.subject`);let i={};for(let s of o)i[s]=s==="tokenId"?De(t[s],`${n}.subject.${s}`):kt(t[s],`${n}.subject.${s}`);return i}function rI(e,t){let n=`postconditions[${t}]`;Ot(e,["comparator","kind","subject","value"],n);let r=_n(e.kind,`${n}.kind`,64),o={balanceAtLeast:"gte",balanceAtMost:"lte",allowanceEquals:"eq",ownerOf:"eq",positionSizeAtMost:"lte",noNewApproval:"eq"};if(!(r in o))throw new TypeError(`${n}.kind is unsupported`);if(e.comparator!==o[r])throw new TypeError(`${n}.comparator must be ${o[r]} for ${r}`);let i;if(r==="ownerOf")i=kt(e.value,`${n}.value`);else if(r==="noNewApproval"){if(e.value!=="true")throw new TypeError(`${n}.value must be the string "true"`);i="true"}else i=De(e.value,`${n}.value`);return{kind:r,subject:p6(r,e.subject,n),comparator:o[r],value:i}}function qi(e,t){return e.some(t)}function oI(e,t,n,r){let o=(i,s)=>i===s;if(e==="evm-swap"){if(!qi(t,i=>i.kind==="balanceAtLeast"&&o(i.subject.account,n.recipient)&&o(i.subject.asset,n.assetOut)&&BigInt(i.value)>=BigInt(n.minAmountOut)))throw new Error("evm-swap requires balanceAtLeast(recipient, assetOut, minAmountOut)");if(!qi(t,i=>i.kind==="noNewApproval"&&o(i.subject.account,n.account)&&o(i.subject.allowedSpender,r.venue)))throw new Error("evm-swap requires noNewApproval(account, route venue)")}else if(e==="evm-approval"){if(!qi(t,i=>i.kind==="allowanceEquals"&&o(i.subject.account,n.account)))throw new Error("evm-approval requires allowanceEquals(account, spender, exactAmount)")}else if(e==="evm-transfer"){if(!qi(t,i=>i.kind==="balanceAtLeast"&&o(i.subject.account,n.recipient)&&o(i.subject.asset,n.assetOut)))throw new Error("evm-transfer requires balanceAtLeast(recipient, asset, amount)")}else if(e==="evm-bridge"){if(!qi(t,i=>i.kind==="balanceAtMost"&&o(i.subject.account,n.account)&&o(i.subject.asset,n.assetIn)))throw new Error("evm-bridge requires source balanceAtMost(account, assetIn, bound)")}else if(e==="nft-mint"&&!qi(t,i=>i.kind==="ownerOf"||i.kind==="balanceAtLeast"&&o(i.subject.account,n.account)&&o(i.subject.asset,n.assetOut)))throw new Error("nft-mint requires ownerOf or balanceAtLeast ownership evidence")}function f6(e,t){if(Hm(e,"prepare"),e.requiresUserSignature!==!0||e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.oraclePrepared!==!0)throw new Error("prepare must be custody-none, user-signature-required, and prepare-only");if(!Number.isSafeInteger(e.preparedAt)||!Number.isSafeInteger(e.expiresAt))throw new TypeError("prepare timestamps must be safe integers");if(Ra(e)!==e.prepareHash)throw new Error("prepareHash mismatch");return xu(e,{nowMs:t,maxAgeMs:Ca(co),label:"approval binding"}),e}function iI(e,{input:t=!1,nowMs:n}={}){if(Ot(e,t?Gx:Qj,"preview"),e.previewVersion!==Mm)throw new TypeError(`preview.previewVersion must be ${Mm}`);let r=ht(n,"nowMs",{min:1}),o=ht(e.builtAtMs,"preview.builtAtMs",{min:1}),i=ht(e.expiresAtMs,"preview.expiresAtMs",{min:1});if(o>r+5e3)throw new Error("preview was built in the future");yu({issuedAtMs:o,expiresAtMs:i},r,"approval preview");let s=f6(e.prepare,r);if(i>s.expiresAt)throw new Error("preview expiry cannot exceed prepare expiry");let a=_n(e.surface,"preview.surface",64);if(!Vx.has(a))throw new TypeError(`preview.surface ${JSON.stringify(a)} is unsupported`);let c=Ir(e.calls,"preview.calls",{min:1,max:256}).map(Xx);zm(c,c[0].from,"preview.calls[0].from");let l=t?Qx(e.route):Zx(e.route),u=t?eI(e.quote):tI(e.quote),d=nI(e.simulation),p=Ir(e.postconditions,"preview.postconditions",{min:1,max:256}).map(rI);if(oI(a,p,u,l),l.provider!==s.provider)throw new Error("preview route provider does not match prepare provider");let f={previewVersion:Mm,previewId:_n(e.previewId,"preview.previewId",512),builtAtMs:o,expiresAtMs:i,surface:a,calls:c,route:l,quote:u,simulation:d,postconditions:p,prepare:s,policyDigest:Yn(e.policyDigest,"preview.policyDigest"),custody:e.custody,execution:e.execution};if(f.custody!=="none"||f.execution!=="prepare-only")throw new Error("preview must declare custody none and execution prepare-only");return f}function m6(e,{nowMs:t}={}){Kl(e,"preview");let n=iI(e,{nowMs:t});return Yl(n)}function h6(e,{nowMs:t}={}){let n=m6(e,{nowMs:t});if(!cI(e.previewHash,n))throw new Error("previewHash mismatch");return!0}function g6(e,t){let n=new Map(t.destinationAllowlist.map(r=>[r.chainId,new Set(r.destinations)]));for(let r of e.calls){if(!t.allowedChainIds.includes(r.chainId))throw new Error(`policy mismatch: chain ${r.chainId} is not allowed`);if(!n.get(r.chainId)?.has(r.to))throw new Error(`policy mismatch: destination ${r.to} is not allowed on chain ${r.chainId}`);if(BigInt(r.value)>BigInt(t.maxValuePerTxWei))throw new Error("policy mismatch: transaction value exceeds cap");if(BigInt(r.gasLimit)>BigInt(t.maxGasLimit))throw new Error("policy mismatch: gas limit exceeds cap");let o=r.type==="legacy"?r.gasPrice:r.maxFeePerGas,i=r.type==="legacy"?"0":r.maxPriorityFeePerGas;if(BigInt(o)>BigInt(t.maxFeePerGasWei))throw new Error("policy mismatch: max fee exceeds cap");if(BigInt(i)>BigInt(t.maxPriorityFeePerGasWei))throw new Error("policy mismatch: priority fee exceeds cap")}if(!e.calls.some(r=>n.get(r.chainId)?.has(e.route.venue)))throw new Error("policy mismatch: route venue was not in the consulted destination allowlist");if(e.quote.slippageBps>t.maxSlippageBps)throw new Error("policy mismatch: quote slippage exceeds ceiling")}function y6(e){return Ot(e,e6,"binding.expiryBounds"),{issuedAtMs:ht(e.issuedAtMs,"binding.expiryBounds.issuedAtMs",{min:1}),previewExpiresAtMs:ht(e.previewExpiresAtMs,"binding.expiryBounds.previewExpiresAtMs",{min:1}),prepareExpiresAtMs:ht(e.prepareExpiresAtMs,"binding.expiryBounds.prepareExpiresAtMs",{min:1}),grantExpiresAtMs:ji(e.grantExpiresAtMs,"binding.expiryBounds.grantExpiresAtMs"),sessionExpiresAtMs:ji(e.sessionExpiresAtMs,"binding.expiryBounds.sessionExpiresAtMs"),policyExpiresAtMs:ht(e.policyExpiresAtMs,"binding.expiryBounds.policyExpiresAtMs",{min:1}),approvalTtlMs:ht(e.approvalTtlMs,"binding.expiryBounds.approvalTtlMs",{min:1,max:zx}),requestedExpiresAtMs:ji(e.requestedExpiresAtMs,"binding.expiryBounds.requestedExpiresAtMs")}}function sI(e){let t=[e.previewExpiresAtMs,e.prepareExpiresAtMs,e.grantExpiresAtMs,e.sessionExpiresAtMs,e.policyExpiresAtMs,e.issuedAtMs+e.approvalTtlMs,e.requestedExpiresAtMs].filter(n=>n!==null);return Math.min(...t)}function b6(e){if(Kl(e,"approval binding"),Ot(e,t6,"approval binding"),e.bindingVersion!==Fi)throw new TypeError(`approval binding.bindingVersion must be ${Fi}`);if(e.custody!=="none"||e.execution!=="prepare-only")throw new Error("approval binding must be custody-none and prepare-only");if(e.maxExecutions!==1||e.oneShot!==!0)throw new Error("approval binding must be one-shot with maxExecutions 1");if(e.schemaVersion!==Bm)throw new TypeError("approval binding.schemaVersion mismatch");if(e.buildVersion!==Um)throw new TypeError("approval binding.buildVersion mismatch");if(e.domainSeparator!==qm)throw new TypeError("approval binding.domainSeparator mismatch");let t=_n(e.surface,"approval binding.surface",64);if(!Vx.has(t))throw new TypeError("approval binding surface is unsupported");let n=Yx(e.tenantId,"approval binding.tenantId"),r=Ir(e.calls,"approval binding.calls",{min:1,max:256}).map(Xx),o=zm(r,e.expectedFrom,"approval binding.expectedFrom"),i=kt(e.expectedSigner,"approval binding.expectedSigner");if(i!==o)throw new Error("approval binding expectedSigner must equal expectedFrom");let s=Zx(e.route),a=tI(e.quote),c=nI(e.simulation),l=Ir(e.postconditions,"approval binding.postconditions",{min:1,max:256}).map(rI);oI(t,l,a,s);let u=y6(e.expiryBounds),d=ht(e.expiresAtMs,"approval binding.expiresAtMs",{min:1});if(d!==sI(u))throw new Error("approval binding expiry does not equal composed minimum ceiling");return{bindingVersion:Fi,schemaVersion:Bm,buildVersion:Um,domainSeparator:qm,tenantId:n,previewId:_n(e.previewId,"approval binding.previewId",512),previewHash:Yn(e.previewHash,"approval binding.previewHash"),prepareHash:Yn(e.prepareHash,"approval binding.prepareHash"),custody:"none",execution:"prepare-only",surface:t,expectedFrom:o,expectedSigner:i,calls:r,route:s,quote:a,simulation:c,policyDigest:Yn(e.policyDigest,"approval binding.policyDigest"),postconditions:l,expiryBounds:u,expiresAtMs:d,oneShot:!0,maxExecutions:1}}function aI(e){if(Kl(e,"approval binding input"),Ot(e,Zj,"approval binding input"),e.bindingVersion!==Fi)throw new TypeError(`approval binding input.bindingVersion must be ${Fi}`);let t=ht(e.nowMs,"approval binding input.nowMs",{min:1}),n=ht(e.issuedAtMs,"approval binding input.issuedAtMs",{min:1});if(n>t+5e3)throw new Error("approval binding issuance is in the future");h6(e.preview,{nowMs:t});let r=iI(e.preview,{nowMs:t}),o=Jx(e.resolvedPolicy),i=u6(o);if(!cI(r.policyDigest,i))throw new Error("policy mismatch: preview policy digest is stale");if(o.expiresAtMs<=t||o.grantExpiresAtMs!==null&&o.grantExpiresAtMs<=t)throw new Error("resolved policy or grant is expired");let s=ji(e.sessionExpiresAtMs,"approval binding input.sessionExpiresAtMs");if(s!==null&&s<=t)throw new Error("approval session is expired");g6(r,o);let a=Yx(e.tenantId,"approval binding input.tenantId"),c=kt(e.expectedSigner,"approval binding input.expectedSigner"),l=zm(r.calls,c,"approval binding input.expectedSigner"),u=e.approvalTtlMs===null?Hx:ht(e.approvalTtlMs,"approval binding input.approvalTtlMs",{min:1});u=Math.min(u,zx,Ca(u));let d={issuedAtMs:n,previewExpiresAtMs:r.expiresAtMs,prepareExpiresAtMs:r.prepare.expiresAt,grantExpiresAtMs:o.grantExpiresAtMs,sessionExpiresAtMs:s,policyExpiresAtMs:o.expiresAtMs,approvalTtlMs:u,requestedExpiresAtMs:ji(e.requestedExpiresAtMs,"approval binding input.requestedExpiresAtMs")},p=sI(d);if(p<=t||p<=n)throw new Error("approval binding inputs are expired or leave no execution window");let f={bindingVersion:Fi,schemaVersion:Bm,buildVersion:Um,domainSeparator:qm,tenantId:a,previewId:r.previewId,previewHash:e.preview.previewHash,prepareHash:r.prepare.prepareHash,custody:"none",execution:"prepare-only",surface:r.surface,expectedFrom:l,expectedSigner:c,calls:r.calls,route:r.route,quote:r.quote,simulation:r.simulation,policyDigest:i,postconditions:r.postconditions,expiryBounds:d,expiresAtMs:p,oneShot:!0,maxExecutions:1};return Kx(b6(f))}function cI(e,t){if(typeof e!="string"||typeof t!="string"||!Fm.test(e)||!Fm.test(t))return!1;let n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return n.length!==r.length?!1:Rj(n,r)}var Fi,Mm,Bm,Um,qm,Hx,zx,Pj,Lj,$j,lK,Dj,Vx,Mj,Bj,Uj,qj,Fm,Fj,jj,Hj,zj,uK,Vj,Wj,Gj,Kj,Yj,Wx,Jj,Xj,Gx,Qj,Zj,e6,t6,dK,pK,fK,mK,n6,o6,lI=R(()=>{nt();Fx();bu();Tm();Nm();Fi=1,Mm=1,Bm="oracle.approval-binding/1",Um="0.28.26+approval-binding.1",qm="oracle.approval-binding.v1",Hx=2e4,zx=Hx,Pj=Object.freeze(["evm-swap","evm-approval","evm-transfer","evm-bridge","nft-mint"]),Lj=Object.freeze(["legacy","eip2930","eip1559"]),$j=Object.freeze(["eip4844","eip7702"]),lK=Object.freeze({custody:"none",execution:"prepare-only",authenticatesApprover:!1,maxExecutions:1,networkIo:!1,signer:!1}),Dj=(1n<<256n)-1n,Vx=new Set(Pj),Mj=new Set(Lj),Bj=Object.freeze({legacy:"legacy","0x0":"legacy",0:"legacy",0:"legacy",eip2930:"eip2930","0x1":"eip2930",1:"eip2930",1:"eip2930",eip1559:"eip1559","0x2":"eip1559",2:"eip1559",2:"eip1559",eip4844:"eip4844","0x3":"eip4844",3:"eip4844",3:"eip4844",eip7702:"eip7702","0x4":"eip7702",4:"eip7702",4:"eip7702"}),Uj=/^(signhash|signature|sig|privatekey|privkey|secret|secretkey|mnemonic|seed|seedphrase|passphrase|password|apikey|authorization|bearer|keystore|wif|xprv)$/i,qj=/(?:hash|digest|checksum|mac|id)$/i,Fm=/^[0-9a-f]{64}$/,Fj=/^0x[0-9a-f]{64}$/,jj=/^0x[0-9a-f]{40}$/,Hj=/^0x(?:[0-9a-f]{2})*$/,zj=/^[^\u0000-\u001f\u007f]+$/,uK=Object.freeze(["allowedChainIds","destinationAllowlist","expiresAtMs","grant","maxDailyValueWei","maxFeePerGasWei","maxGasLimit","maxPriorityFeePerGasWei","maxSlippageBps","maxValuePerTxWei","policyVersion"]),Vj=Object.freeze(["allowedChainIds","destinationAllowlist","expiresAtMs","grantExpiresAtMs","grantId","maxDailyValueWei","maxFeePerGasWei","maxGasLimit","maxPriorityFeePerGasWei","maxSlippageBps","maxValuePerTxWei","policyVersion"]),Wj=Object.freeze(["chainId","destinations"]),Gj=Object.freeze(["accessList","chainId","data","from","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","nonce","to","type","value"]),Kj=Object.freeze(["provider","routeId","venue"]),Yj=Object.freeze(["provider","routeDigest","routeId","venue"]),Wx=Object.freeze(["account","amountIn","amountOut","assetIn","assetOut","minAmountOut","quoteId","recipient","slippageBps","slippageGuardDigest"]),Jj=Object.freeze([...Wx,"quoteDigest"]),Xj=Object.freeze(["balanceDeltasDigest","blockHash","blockNumber","engine","logsDigest","stateOverridesDigest","status"]),Gx=Object.freeze(["builtAtMs","calls","custody","execution","expiresAtMs","policyDigest","postconditions","prepare","previewId","previewVersion","quote","route","simulation","surface"]),Qj=Object.freeze([...Gx,"previewHash"]),Zj=Object.freeze(["approvalTtlMs","bindingVersion","expectedSigner","issuedAtMs","nowMs","preview","requestedExpiresAtMs","resolvedPolicy","sessionExpiresAtMs","tenantId"]),e6=Object.freeze(["approvalTtlMs","grantExpiresAtMs","issuedAtMs","policyExpiresAtMs","prepareExpiresAtMs","previewExpiresAtMs","requestedExpiresAtMs","sessionExpiresAtMs"]),t6=Object.freeze(["bindingVersion","buildVersion","calls","custody","domainSeparator","execution","expectedFrom","expectedSigner","expiresAtMs","expiryBounds","maxExecutions","oneShot","policyDigest","postconditions","prepareHash","previewHash","previewId","quote","route","schemaVersion","simulation","surface","tenantId"]),dK=Object.freeze(["approvalVersion","approver","binding","issuedAtMs","maxExecutions","oneShot"]),pK=Object.freeze(["approvalDigest","approvalId","approvalVersion","approver","binding","custody","execution","expiresAtMs","issuedAtMs","maxExecutions","oneShot","previewId"]),fK=Object.freeze(["kind","ref"]),mK=Object.freeze(["executionCount","expectedApprovalDigest","expectedFrom","nowMs","preview","resolvedPolicy","tenantId"]),n6=Object.freeze(["address","storageKeys"]);o6=new Set(["requiresUserSignature","signingReady","broadcastReady","executionReady","oraclePrepared","prepareHash","prepareMac","prepareVersion","preparedAt","expiresAt","provider","kind","note"])});function w6(e){let t=e instanceof Error?e.message:String(e||"approval preview refused"),n=bt(t,{force:!0}).slice(0,300)||"approval preview refused";return Object.freeze({ok:!0,verdict:"DENY",reasons:Object.freeze([n]),authorization:!1,approvalRequired:!0,queued:!1,signed:!1,broadcast:!1})}function uI(e,t={}){try{if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("approval preview arguments must be an object");let n=Object.keys(e);if(n.length!==1||n[0]!=="bindingInput")throw new TypeError("approval preview requires only bindingInput");if(!e.bindingInput||typeof e.bindingInput!="object"||Array.isArray(e.bindingInput))throw new TypeError("bindingInput must be an object");let o=(t.createApprovalBinding||aI)(e.bindingInput);return Object.freeze({ok:!0,verdict:"ALLOW",reasons:Object.freeze(["exact preview, policy, caps, expiry, and signer binding validated"]),previewHash:o.previewHash,prepareHash:o.prepareHash,policyDigest:o.policyDigest,expiresAtMs:o.expiresAtMs,surface:o.surface,expectedSigner:o.expectedSigner,custody:o.custody,execution:o.execution,oneShot:o.oneShot,maxExecutions:o.maxExecutions,authorization:!1,approvalRequired:!0,queued:!1,signed:!1,broadcast:!1})}catch(n){return w6(n)}}var dI=R(()=>{lI();Yi()});function pI(e){let t=A6[Number(e)]||[];return new Set([...t,...E6].map(n=>String(n).trim().toLowerCase()).filter(Boolean))}var E6,A6,fI=R(()=>{E6=["0x000000000022d473030f116ddee9f6b43ac78ba3"],A6={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Jl(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Vm(e){e&&(e.prepareAttempted=!0)}function Wm(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function I6(e,t=process.env){let n=t&&typeof t=="object"?t:process.env,r=String(n.ORACLE_DEST_ALLOWLIST||n.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...pI(o)]:[];return new Set([...r,...i])}function k6(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function O6(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function _6(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function T6(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function N6(e,t={}){let n=[],r={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:r,errors:["prepared fact must be an object"]};e.signed===!0&&n.push("prepared fact is signed"),e.broadcast===!0&&n.push("prepared fact claims broadcast");for(let o of S6)e[o]&&n.push(`prepared fact carries ${o}`);for(let o of v6)e[o]&&n.push(`prepared fact claims executed ${o}`);if(r.unsigned=n.length===0,O6(e)){let o=_6(e),i=o.to==null?"":String(o.to).trim();if(!i)n.push("prepared transaction is missing destination"),r.destination="missing";else{let s=x6.test(i);if(i.startsWith("0x")&&!s)n.push("prepared destination is not a 20-byte address"),r.destination="malformed";else{let a=I6(o.chainId,t.env),c=i.toLowerCase(),l=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!l?(n.push(`destination ${c} not allowlisted`),r.destination="blocked"):r.destination=a.size===0?"unset":"allowlisted"}}}if(k6(e)){let o=T6(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):Zn;!Number.isInteger(o)||o<0?(n.push("swap prepare is missing integer slippage bps"),r.slippage="missing"):o>Zn||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>Zn?(n.push(`slippage ${o} exceeds cap ${Math.min(i,Zn)}`),r.slippage="blocked"):r.slippage="ok"}return{ok:n.length===0,checks:r,errors:n}}function Gm(e,t){let n=[];e?.execution!=="prepare-only"&&n.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&n.push("lifecycle custody must be none");let r=N6(t);return{ok:n.length===0&&r.ok,checks:r.checks,errors:[...n,...r.errors]}}var S6,v6,x6,mI=R(()=>{fI();fn();S6=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),v6=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),x6=/^0x[a-fA-F0-9]{40}$/});var gI={};Z(gI,{DESK_TOOLS:()=>R6,runDeskTool:()=>L6});function P6(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>C6)throw new TypeError("tool arguments exceed size limit")}function gt(e,t,n=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let r=new Set([...t,...n]);for(let o of Object.keys(e))if(!r.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function L6(e,t,n={}){if(P6(t),e==="approval_preview")return gt(t,["bindingInput"]),(n.evaluateApprovalPreview||uI)(t,n);if(e==="research_artifact"){if(gt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>hI)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(n.createResearchArtifact||Uv)(t)}}if(e==="portfolio_analyze")return gt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(n.summarizePortfolioLedger||Gv)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return gt(t,["input"],["method","asOf"]),{ok:!0,records:(n.createCostBasisRecords||ex)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){gt(t,["action","input","asOf"],["thresholds"]);let r={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(n.evaluatePositionHealth||vm)(t.input,r)};if(t.action==="book")return{ok:!0,analysis:(n.evaluatePositionBook||hx)(t.input,r)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return gt(t,["input","asOf"]),{ok:!0,preview:(n.previewGovernanceAction||yx)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){gt(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let r={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(n.evaluateAddressSafety||_m)(t.input,r)};if(t.action==="transaction")return{ok:!0,analysis:(n.evaluateTransactionSafety||Tx)(t.input,r)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return gt(t,["input"]),{ok:!0,analysis:(n.summarizePortfolioRisk||$l)(t.input)};if(e==="trade_lifecycle"){let r=n.createTradeLifecycle||zl,o=n.advanceTradeLifecycle||Dx,i=n.assertTradeLifecycle||Lm;if(t.action==="create")return gt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:r({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(gt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Vm(n.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Gm(t.lifecycle,s?.fact||{});if(!a.ok)return Wm(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Jl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Jl(n.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(gt(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Vm(n.loopVerifier);let a=Gm(t.lifecycle,t.fact);if(!a.ok)return Wm(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Jl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(gt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let r=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(n.signalsToPrepareIntents||Bx)(t.events,r,{limit:t.limit});let i=(n.scoreSignals||Wl)(t.events,r);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let r=n.openArtifactStore||Lv,o=!n.artifactStore,i=n.artifactStore||await r(n.artifactStoreOptions||{});try{if(t.action==="get")return gt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return gt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return gt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return gt(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var C6,hI,Xl,Mt,Tn,R6,yI=R(()=>{$v();qv();Kv();bm();tx();gx();bx();Nx();$m();Dm();Ux();dI();mI();C6=128*1024,hI=5e4,Xl={type:"string",minLength:1,maxLength:256},Mt={type:"object",additionalProperties:!0},Tn=(e,t,n)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:n})}),R6=Object.freeze([Tn("approval_preview","Validate an exact prepared approval binding and return ALLOW or DENY. Never grants approval, queues, signs, or broadcasts.",{type:"object",properties:{bindingInput:Mt},required:["bindingInput"],additionalProperties:!1}),Tn("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Xl,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Mt,parentId:Xl,childId:Xl},required:["action"],additionalProperties:!1}),Tn("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:hI},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Tn("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Mt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Tn("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:Mt,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),Tn("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:Mt,asOf:{type:"string",minLength:1},thresholds:Mt},required:["action","input","asOf"],additionalProperties:!1}),Tn("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:Mt,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),Tn("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:Mt,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),Tn("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:Mt},required:["input"],additionalProperties:!1}),Tn("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Xl,intent:Mt,lifecycle:Mt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Mt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Tn("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Mt},markouts:{type:"array",maxItems:100,items:Mt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var bI={};Z(bI,{deployGloballyEnabled:()=>D6,executeGloballyEnabled:()=>$6,mevExecuteEnabled:()=>M6});function $6(){return ha("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function D6(){return ha("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function M6(){return ha("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var wI=R(()=>{ga()});ga();import EI from"node:fs";import Km from"node:process";import{fileURLToPath as B6}from"node:url";import{createInterface as RI}from"node:readline";var Rn=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),PI=/^[A-Za-z0-9_-]{1,64}$/;function ya(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function st(e,t,n){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:n}}}function LI(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function $I(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(t.length>=Rn.maxTools)break;if(!r||typeof r!="object"||Array.isArray(r))continue;let o=typeof r.name=="string"?r.name.trim():"";if(!PI.test(o)||n.has(o))continue;n.add(o);let i=r.inputSchema&&typeof r.inputSchema=="object"&&!Array.isArray(r.inputSchema)?{...r.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...r,name:o,inputSchema:i})}return t}function DI(e){let t=Number(e)||Rn.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Rn.maxCallTimeoutMs)}async function MI(e,t,n){let r;try{return await Promise.race([e,new Promise((o,i)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{n?.()}catch{}},t)})])}finally{clearTimeout(r)}}function BI(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function Wi(e,t,n="arguments",r=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(r>12)return`${n} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>Wi(e,i,n,r+1)===null))return`${n} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>Wi(e,i,n,r+1)===null))return`${n} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${n} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${n} must equal the required constant`;if(t.type){let o=BI(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${n} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${n} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${n} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${n} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${n} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=Wi(e[i],t.items,`${n}[${i}]`,r+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${n} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${n}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${n}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=Wi(e[s],i[s],`${n}.${s}`,r+1);if(a)return a}}return null}function ba(e,t={}){let n=$I(e?.tools),r=new Set(n.map(l=>l.name)),o=new Map(n.map(l=>[l.name,l])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=DI(t.callTimeoutMs),c=!1;return async function(u){let d=u?.id??null;if(!LI(u))return st(d,-32600,"invalid request");if(u.method==="initialize")return c=!0,ya(d,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return ya(d,{});if(!c)return st(d,-32002,"server not initialized");if(u.method==="tools/list")return ya(d,{tools:n});if(u.method==="tools/call"){let p=u.params?.name,f=u.params?.arguments??{};if(typeof p!="string"||!r.has(p))return st(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return st(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return st(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>Rn.maxArgumentBytes)return st(d,-32602,"tool arguments exceeded the size limit");let h=Wi(f,o.get(p)?.inputSchema);if(h)return st(d,-32602,h);try{let g=new AbortController,b=await MI(Promise.resolve(e.call(p,f,{signal:g.signal})),a,()=>g.abort(new Error("tool call timed out")));return ya(d,b)}catch(g){if(g?.code==="ORACLE_MCP_TIMEOUT")return st(d,-32001,"tool call timed out");let b=typeof g?.message=="string"?g.message.replace(/\s+/g," ").trim():"",y=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(b),v=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(b.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return y&&!v&&b.length<=200?st(d,-32e3,`tool call failed: ${b}`):st(d,-32e3,"tool call failed")}}return st(d,-32601,"method not found")}}function nu(e,t={}){let n=t.input||process.stdin,r=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Rn.maxRequestBytes,64),Rn.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||Rn.maxResponseBytes,256),Rn.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||Rn.maxConcurrentCalls,1),Rn.maxConcurrentCalls),a=s*8,c=ba(e,t),l={closed:!1,inflight:0},u=RI({input:n,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function h(){if(l.closed||l.readerClosed)return;let A=l.inflight>=s||p.length>0||m;A&&!f?(f=!0,u.pause(),typeof n.pause=="function"&&n.pause()):!A&&f&&(f=!1,typeof n.resume=="function"&&n.resume(),u.resume())}function g(A){if(!A||l.closed)return;let x=JSON.stringify(A);Buffer.byteLength(x)>i&&(x=JSON.stringify(st(A.id,-32003,"response exceeded the size limit"))),r.write(`${x}
23
+ `);let s=!1,a=Promise.resolve();function c(){if(n)return Promise.resolve();let u=async()=>{let d=`${t}.tmp-${process.pid}`;await FU(d,Buffer.from(i.export()),{mode:384}),await Cl(d,384),await qU(d,t),await Cl(t,384)};return a=a.then(u,u),a}r?n||await Cl(t,384):n||await c();function l(){if(s)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(l(),!u||typeof u!="object")throw new TypeError("artifact object required");let d=Pv(String(u.type)),p=String(u.id||"").trim();if(!p)throw new TypeError("artifact id required");let f=ie(u.data??{}),m=String(u.createdAt||new Date().toISOString());return i.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[p,d,m,Ll(f)]),await c(),{id:p,type:d,createdAt:m,data:f}},getArtifact(u){l();let d=i.prepare("SELECT * FROM artifacts WHERE id=?");d.bind([String(u)]);let p=d.step()?Pl(d.getAsObject()):null;return d.free(),p},listArtifacts(u){l();let d=u===void 0?i.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Pv(String(u)),i.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),Rl(d).map(Pl)},async link(u,d){l();let p=i.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");p.bind([String(u),String(d)]);let f=Rl(p),m=f.find(g=>g.id===String(u)),h=f.find(g=>g.id===String(d));if(!m||!h)throw new TypeError("edge endpoints must exist");if(!VU.has(`${m.type}:${h.type}`))throw new TypeError(`invalid artifact edge: ${m.type} -> ${h.type}`);return i.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[m.id,h.id]),await c(),{parentId:m.id,childId:h.id}},children(u){l();let d=i.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),Rl(d).map(Pl)},parents(u){l();let d=i.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return d.bind([String(u)]),Rl(d).map(Pl)},async putReceipt(u,d){l();let p=this.getArtifact(u);if(!p||p.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let f=ie(d);return i.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Ll(f)]),await c(),f},getReceipt(u){l();let d=i.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");d.bind([String(u)]);let p=d.step()?JSON.parse(d.getAsObject().receipt_json):null;return d.free(),p},async close(){s||(await c(),i.close(),s=!0)}}}var fm,zU,VU,WU,GU,$v=R(()=>{$i();fm=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),zU=new Set(fm),VU=new Set(fm.slice(0,-1).map((e,t)=>`${e}:${fm[t+1]}`)),WU=pm(process.env.ORACLE_CONFIG_DIR||pm(jU(),".config","oracle"),"workspace"),GU=pm(WU,"artifacts.sqlite")});import{createHash as Dv}from"node:crypto";function YU(e){return KU.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function mm(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(mm).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${mm(e[t])}`).join(",")}}`}function JU(e){return Dv("sha256").update(String(e)).digest("hex")}function Mv(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(YU(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Bv(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function XU(e={}){let t=Mv(e.url??e.sourceUrl),n=Bv(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(ie({url:t,fetchedAt:n,contentHash:r}))}function Uv(e={}){let t=Mv(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=Bv(e.fetchedAt),s=JU(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(XU),c=ie({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Dv("sha256").update(mm(c)).digest("hex")}`,...c})}var KU,qv=R(()=>{$i();KU=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Fv(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function ca(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function gm(e,t){return t>0?ca(e/t*100):null}function ym(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function eq(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function To(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Fv(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||ZU.has(r.toUpperCase())})}function tq(e){let t=[],n=ym(e);for(let r of e.assets||e.holdings||[])To(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&r.native.status!=="unavailable"&&(r.native.amount==null||Number(r.native.amount)!==0)&&To(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])To(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])To(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])To(t,a,{...i,venue:"Hyperliquid spot"});let s=Fv(r.perps?.accountValueUsd);s!=null&&To(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])To(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function nq(e,t){let n=ym(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function hm(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:ca(i),percentOfKnown:gm(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function $l(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=eq(t.labels??t.addressBook??e.labels??e.addressBook),o={...QU,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((S,N)=>{if(!S||typeof S!="object")return;let I=nq(S,N);s.has(I)?a+=1:(s.add(I),i.push(S))});let c=i.flatMap(tq),l=c.filter(S=>S.usdValue!=null),u=c.filter(S=>S.usdValue==null),d=i.reduce((S,N)=>S+Number(N.valuation?.unpricedNonzeroItems||N.unpricedNonzeroItems||0),0),p=ca(l.reduce((S,N)=>S+N.usdValue,0)),f=u.length+d,m=hm(l,"chain",p),h=hm(l,"venue",p),g=hm(l,"symbol",p);for(let S of m)S.chain=S.name;for(let S of h)S.venue=S.name;for(let S of g)S.asset=S.name,S.symbol=S.name;let b=ca(l.filter(S=>S.stablecoin).reduce((S,N)=>S+N.usdValue,0)),y=c.filter(S=>S.kind==="nft"),v=i.reduce((S,N)=>S+Number(N.valuation?.nftUnvaluedItems||0),0),A=y.filter(S=>S.usdValue==null).length+v,x=y.filter(S=>S.usdValue!=null).length,O=g[0]||null,E=O?O.percentOfKnown>=o.assetHighPct?"high":O.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",_=[];f&&_.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),A&&_.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&_.push(`${a} duplicate address/chain snapshot(s) were ignored.`),O&&E!=="low"&&_.push(`Asset concentration is ${E}: ${O.name} is ${O.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&_.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&_.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let w=i.map(ym).filter(Boolean).map(S=>{let N=r.get(String(S).toLowerCase());return{address:S,label:N?.label??null,who:N?.who??null,role:N?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1),label:f===0&&i.length&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:l.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:E,topAsset:O?.name??null,topAssetPercent:O?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:b,percentOfKnown:gm(b,p),high:p>0&&gm(b,p)>=o.stablecoinHighPct},nftCoverage:{status:y.length||v?A?"partial":"valued":"not-observed",valuedItems:x,unvaluedItems:A,knownUsd:ca(y.filter(S=>S.usdValue!=null).reduce((S,N)=>S+N.usdValue,0))},addresses:w,warnings:[...new Set(_)]}}var QU,ZU,bm=R(()=>{QU=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),ZU=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function jv(e){return ft(e.asOf??e.updatedAt??e.timestamp,0)}function Vv(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function rq(e){return Number.isFinite(Number(Vv(e)))}function Hv(e){return ft(Vv(e),0)}function oq(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!On(o))return;let s=Wv(o);t.has(s)||(t.add(s),n.push({row:o,seq:i}))}),n.every(({row:o})=>rq(o))?n.sort((o,i)=>Hv(o.row)-Hv(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function Wv(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Ml(e),et(t),et(e.side),ft(e.quantity??e.amount??e.size),ft(e.price??e.priceUsd)].join("|")}function Dl(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!On(o))continue;let i=t==="fill"?Wv(o):Ml(o);n.has(i)?(r+=1,t!=="fill"&&jv(o)>jv(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function iq(e){let t=new Map;for(let n of e){let r=[Ml(n),`${et(n.chain??n.chainId)}|${et(On(n))}`,`*|${et(On(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function sq(e,t){return t.get(Ml(e))??t.get(`${et(e.chain??e.chainId)}|${et(On(e))}`)??t.get(`*|${et(On(e))}`)??null}function aq(e){let t=new Map,n=0;for(let r of e){let o=[et(r.chain??r.chainId),et(zv(r)),et(On(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(ft(r.quantity??r.amount??r.size)),a=ft(r.price??r.priceUsd),c=ft(r.feeUsd);if(et(r.side)==="sell"){let l=Math.min(s,i.quantity),u=i.quantity?i.cost/i.quantity:ft(r.costBasisUsd)/(s||1);n+=l*(a-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:kn(n),lots:t}}function Gv(e={},t={}){let n=ft(t.asOf??e.asOf,0),r=Math.max(0,ft(t.priceTtlMs??e.priceTtlMs,6e4)),o=Dl(e.balances||[],"balance"),i=Dl(e.positions||[],"position"),s=Dl(e.fills||[],"fill"),a=Dl(e.prices||[],"price"),c=iq(a.rows),l=[],u=0,d=0;for(let w of[...o.rows,...i.rows]){let S=sq(w,c),N=ft(w.quantity??w.amount??w.size),I=S?ft(S.priceUsd??S.price,NaN):ft(w.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let U=N*I,j=ft(S?.asOf??w.priceAsOf,0),B=n-j>r;B&&(u+=Math.abs(U)),l.push({...w,quantity:N,priceUsd:I,valueUsd:U,stale:B,kind:i.rows.includes(w)?"position":"balance"})}let p=l.filter(w=>w.kind==="balance").reduce((w,S)=>w+S.valueUsd,0),f=l.filter(w=>w.kind==="position"),m=f.reduce((w,S)=>w+S.valueUsd,0),h=f.reduce((w,S)=>w+Math.abs(S.valueUsd),0),g=p+m,b=ft(e.equityUsd,g),y=aq(oq(e.fills||[])).realizedPnlUsd,v=f.reduce((w,S)=>{let N=ft(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return w+S.quantity*(S.priceUsd-N)},0),A=new Map;for(let w of l)A.set(et(On(w)),(A.get(et(On(w)))||0)+Math.abs(w.valueUsd));let x=[...A.values()].reduce((w,S)=>w+S,0),O=[...A].map(([w,S])=>({asset:w,exposureUsd:kn(S),percent:x?kn(S/x*100):null})).sort((w,S)=>S.exposureUsd-w.exposureUsd||w.asset.localeCompare(S.asset)),E=l.reduce((w,S)=>w+Math.abs(S.valueUsd),0),_=$l({snapshots:[{assets:l.map(w=>({symbol:On(w),usdValue:Math.abs(w.valueUsd),chain:w.chain,venue:w.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:y,unrealizedUsd:kn(v),totalUsd:kn(y+v)},exposure:{grossUsd:kn(h),netUsd:kn(g),leverage:b>0?kn(h/b):null,equityUsd:kn(b)},concentration:O,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(w=>w.stale).length,staleValueUsd:kn(u),stalePercent:E?kn(u/E*100):null,ttlMs:r},risk:_})}var ft,kn,et,On,zv,Ml,Kv=R(()=>{bm();ft=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,kn=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,et=(e,t="unknown")=>String(e??t).trim().toLowerCase(),On=e=>e.asset??e.symbol??e.coin,zv=e=>e.address??e.owner??e.account,Ml=e=>[et(e.chain??e.chainId),et(zv(e)),et(On(e)),et(e.source)].join("|")});function Le(e,t){throw new Em(e,t)}function wr(e,t){return e<t?-1:e>t?1:0}function tt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))tt(t);Object.freeze(e)}return e}function Er(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Le(`${t} must be a plain object`),e}function vt(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Le(`${t} must be a string`);let o=e.trim();return o||Le(`${t} is required`),fq.test(o)&&Le(`${t} contains control characters`),o.length>512&&Le(`${t} is too long`),r?o.toLowerCase():o}function Hn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Le(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:Le(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Le(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Le(`${t} must be positive`),i.toString()}function Di(e){return e==null?null:e.toString()}function la(e,t){let n=Er(e,t);return tt({chain:vt(n.chain??n.chainId,`${t}.chain`,{lower:!0}),account:vt(n.account??n.address??n.owner,`${t}.account`)})}function to(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function Qv(e,t="evidence"){if(e==null)return tt({status:"unknown",references:[]});let n=Er(e,t),r=vt(n.status??"unknown",`${t}.status`,{lower:!0});pq.has(r)||Le(`${t}.status must be complete, incomplete, or unknown`),n.references!=null&&!Array.isArray(n.references)&&Le(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=Er(s,`${t}.references[${a}]`);return{kind:vt(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:vt(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>wr(s.kind,a.kind)||wr(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return tt({status:r,references:i})}function Yv(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&Le(`${t} must be a non-empty array`);let n=new Set;return e.map((r,o)=>{let i=Er(r,`${t}[${o}]`),s=vt(i.lotId,`${t}[${o}].lotId`);return n.has(s)&&Le(`${t} repeats lotId ${JSON.stringify(s)}`),n.add(s),tt({lotId:s,quantity:Hn(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function mq(e){ie(e);let t=Er(e,"event"),n=vt(t.type,"event.type",{lower:!0});dq.has(n)||Le("event.type must be acquisition, disposal, or transfer");let r=vt(t.id??t.eventId,"event.id"),o=Hn(t.occurredAt??t.timestamp,"event.occurredAt"),i=vt(t.asset??t.symbol??t.coin,"event.asset"),s=Hn(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=Hn(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=Qv(t.evidence),l=t.source==null?null:vt(t.source,"event.source"),u={id:r,type:n,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:l,evidence:c};if(n==="acquisition"){let d={...u,location:la(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Hn(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:vt(t.lotId??r,"event.lotId"),specificLots:[]};return tt(d)}return tt(n==="disposal"?{...u,location:la(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Hn(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:Yv(t.specificLots??t.lotSelections,"event.specificLots")}:{...u,from:la(t.from,"event.from"),to:la(t.to,"event.to"),grossAmountMinor:null,specificLots:Yv(t.specificLots??t.lotSelections,"event.specificLots")})}function hq(e,t){let n=BigInt(e.occurredAt)-BigInt(t.occurredAt);return n<0n?-1:n>0n?1:wr(e.id,t.id)}function gq(e=[]){Array.isArray(e)||Le("events must be an array");let t=new Map,n=0;for(let r of e){let o=mq(r),i=aa(o),s=t.get(o.id);if(s){s.canonical!==i&&Le(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1;continue}t.set(o.id,{event:o,canonical:i})}return tt({events:[...t.values()].map(({event:r})=>r).sort(hq),duplicatesIgnored:n})}function yq(e){let t=vt(e??"fifo","method",{lower:!0});return lq.includes(t)||Le("method must be fifo, lifo, hifo, or specific"),t}function bq(e){e!=null&&Er(e,"treatment");let t=e||{},n={};for(let r of Object.keys(Jv))n[r]=vt(t[r]??"unresolved",`treatment.${r}`,{lower:!0}),Jv[r].has(n[r])||Le(`treatment.${r} has an unsupported value`);return tt(n)}function wq(e,t){ie(e);let n=Er(e,`marketValues[${t}]`);return tt({id:vt(n.id??n.valuationId,`marketValues[${t}].id`),asset:vt(n.asset??n.symbol??n.coin,`marketValues[${t}].asset`),location:la(n.location??{chain:n.chain??n.chainId,account:n.account??n.address??n.owner},`marketValues[${t}].location`),quantity:Hn(n.quantity,`marketValues[${t}].quantity`),valueMinor:Hn(n.valueMinor??n.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:Hn(n.asOf,`marketValues[${t}].asOf`),evidence:Qv(n.evidence,`marketValues[${t}].evidence`)})}function Zv(e,t){return t==null||BigInt(e)<=BigInt(t)}function Eq(e=[],t=null){Array.isArray(e)||Le("marketValues must be an array");let n=new Map,r=0;e.forEach((s,a)=>{let c=wq(s,a),l=aa(c),u=n.get(c.id);u?(u.canonical!==l&&Le(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1):n.set(c.id,{row:c,canonical:l})});let o=[...n.values()].map(({row:s})=>s).filter(s=>Zv(s.asOf,t)),i=new Map;for(let s of o){let a=to(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&wr(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>wr(s.id,a.id)),byHolding:i,duplicatesIgnored:r}}function St(e,t,n,r){e.push(tt({code:t,eventId:n??null,detail:r}))}function Aq(e,t,n){if(e.grossAmountMinor==null)return St(n,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.acquisitionFees==="include-in-basis"?r+o:t.acquisitionFees==="exclude"?r:(St(n,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function Sq(e,t,n){if(e.grossAmountMinor==null)return St(n,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.disposalFees==="reduce-proceeds"?r-o:t.disposalFees==="exclude"?r:(St(n,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function vq(e,t){let n=(r,o)=>{let i=BigInt(r.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:wr(r.lotId,o.lotId)};return e==="fifo"?[...t].sort(n):e==="lifo"?[...t].sort((r,o)=>-n(r,o)):e==="hifo"?[...t].sort((r,o)=>{let i=r.basisRemaining*o.quantityRemaining,s=o.basisRemaining*r.quantityRemaining;return i>s?-1:i<s?1:n(r,o)}):[...t]}function Xv(e,t){let n=e.quantityRemaining,r=e.basisRemaining,o=null;return r!=null&&(o=t===n?r:r*t/n,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function xq(e,t,n){let r=to(t,n);return e.filter(o=>o.key===r&&o.quantityRemaining>0n)}function Iq({event:e,lots:t,method:n,issues:r,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=to(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return St(r,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=xq(t,e.asset,i);if(n==="hifo"&&c.some(d=>d.basisRemaining==null))return St(r,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let l=[],u=a;if(n==="specific"){if(e.specificLots.length===0)return St(r,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};if(e.specificLots.reduce((p,f)=>p+BigInt(f.quantity),0n)!==a)return St(r,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};for(let p of e.specificLots){let f=c.find(h=>h.lotId===p.lotId),m=BigInt(p.quantity);if(!f||f.quantityRemaining<m){St(r,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(p.lotId)} is absent or too small`);continue}l.push(Xv(f,m)),u-=m}}else{e.specificLots.length&&Le(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${n}`);for(let d of vq(n,c)){if(u===0n)break;let p=u<d.quantityRemaining?u:d.quantityRemaining;l.push(Xv(d,p)),u-=p}}return u>0n&&(St(r,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:l,missing:u,key:s,indeterminate:u>0n}}function wm(e,t,n){if(e==null)return t.map(()=>null);let r=e,o=n;return t.map(i=>{if(o===0n)return 0n;let s=i===o?r:r*i/o;return r-=s,o-=i,s})}function kq(e,t){let n=[...e.map(r=>r.evidence.status),...t.map(r=>r.evidence.status)];return n.length===0||n.every(r=>r==="complete")?"complete":n.some(r=>r==="incomplete")?"incomplete":"unknown"}function Mi(e,t){let n=e.map(o=>o[t]),r=n.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:n.every(o=>o!=null)?r.toString():null,known:r.toString()}}function Oq(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:to(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function ex(e={},t={}){ie(e),ie(t),Er(e,"input"),Er(t,"options");let n=Hn(t.asOf??e.asOf,"asOf",{optional:!0}),r=gq(e.events||[]),o=n==null?r.events:r.events.filter(w=>Zv(w.occurredAt,n)),i=yq(t.method??e.method),s=bq(t.treatment??e.treatment),a=Eq(e.marketValues||[],n),c=[],l=[],u=new Set,d=[],p=[],f=new Set;for(let w of o){if(w.type==="acquisition"){if(u.has(w.lotId)){St(c,"duplicate-lot-id",w.id,`lotId ${JSON.stringify(w.lotId)} is already in use`),f.add(to(w.asset,w.location));continue}u.add(w.lotId),l.push(Oq(w,Aq(w,s,c)));continue}let S=Iq({event:w,lots:l,method:i,issues:c,tainted:f});if(w.type==="disposal"){let D=Sq(w,s,c),T=wm(D,S.matches.map(te=>te.quantity),BigInt(w.quantity)),P=S.matches.map((te,Se)=>{let _e=T[Se];return tt({lotId:te.lot.lotId,originLotId:te.lot.originLotId,quantity:te.quantity.toString(),basisMinor:Di(te.basis),proceedsMinor:Di(_e),gainMinor:te.basis==null||_e==null?null:(_e-te.basis).toString(),acquiredAt:te.lot.acquiredAt,evidenceStatus:te.lot.evidenceStatus})}),H=P.filter(te=>te.basisMinor!=null).reduce((te,Se)=>te+BigInt(Se.basisMinor),0n),z=S.missing===0n&&P.every(te=>te.basisMinor!=null),X=S.missing===0n&&D!=null;d.push(tt({eventId:w.id,asset:w.asset,location:w.location,occurredAt:w.occurredAt,quantity:w.quantity,grossProceedsMinor:w.grossAmountMinor,feeMinor:w.feeMinor,recognizedProceedsMinor:X?D.toString():null,basisMinor:z?H.toString():null,gainMinor:z&&X?(D-H).toString():null,unknownQuantity:S.missing.toString(),status:z&&X?"complete":"incomplete",evidenceStatus:w.evidence.status,matches:P}));continue}let N=BigInt(w.feeMinor),I=N>0n&&s.transferFees==="include-in-basis",U=N>0n&&s.transferFees==="unresolved";U&&St(c,"unresolved-transfer-fee-treatment",w.id,"fee treatment was not supplied; transferred lot basis remains unknown");let j=wm(I?N:0n,S.matches.map(D=>D.quantity),BigInt(w.quantity)),B=S.matches.map((D,T)=>{let P=D.basis;U?P=null:P!=null&&I&&(P+=j[T]);let H=`${w.id}:${T+1}`;return u.has(H)?(St(c,"duplicate-lot-id",w.id,`derived transfer lotId ${JSON.stringify(H)} is already in use`),f.add(to(w.asset,w.to)),null):(u.add(H),l.push({lotId:H,originLotId:D.lot.originLotId,acquisitionEventId:D.lot.acquisitionEventId,asset:w.asset,location:w.to,key:to(w.asset,w.to),acquiredAt:D.lot.acquiredAt,quantityRemaining:D.quantity,basisRemaining:P,evidenceStatus:w.evidence.status==="complete"&&D.lot.evidenceStatus==="complete"?"complete":"unknown"}),tt({fromLotId:D.lot.lotId,toLotId:H,originLotId:D.lot.originLotId,quantity:D.quantity.toString(),basisMinor:Di(P)}))}).filter(Boolean);S.indeterminate&&f.add(to(w.asset,w.to)),p.push(tt({eventId:w.id,asset:w.asset,from:w.from,to:w.to,occurredAt:w.occurredAt,quantity:w.quantity,feeMinor:w.feeMinor,unknownQuantity:S.missing.toString(),status:S.indeterminate||B.some(D=>D.basisMinor==null)?"incomplete":"complete",moved:B}))}let m=l.filter(w=>w.quantityRemaining>0n).sort((w,S)=>wr(w.key,S.key)||wr(w.lotId,S.lotId)),h=new Map;for(let w of m)h.has(w.key)||h.set(w.key,[]),h.get(w.key).push(w);let g=[];for(let[w,S]of[...h].sort(([N],[I])=>wr(N,I))){let N=S.reduce((D,T)=>D+T.quantityRemaining,0n),I=a.byHolding.get(w)||null,U=f.has(w),j=I;I?BigInt(I.quantity)!==N&&(St(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(I.id)} does not cover the recorded holding quantity`),j=null):St(c,"missing-market-value",null,`no market value was supplied for holding ${w}`),U&&(j=null);let B=wm(j?BigInt(j.valueMinor):null,S.map(D=>D.quantityRemaining),N);S.forEach((D,T)=>{let P=B[T],H=P==null||D.basisRemaining==null?null:P-D.basisRemaining;g.push(tt({lotId:D.lotId,originLotId:D.originLotId,acquisitionEventId:D.acquisitionEventId,asset:D.asset,location:D.location,acquiredAt:D.acquiredAt,quantity:D.quantityRemaining.toString(),basisMinor:U?null:Di(D.basisRemaining),marketValueMinor:Di(P),unrealizedGainMinor:U?null:Di(H),valuationId:j?.id??null,status:U||D.basisRemaining==null||P==null?"incomplete":"complete",evidenceStatus:D.evidenceStatus}))})}let b=Mi(d,"basisMinor"),y=Mi(d,"recognizedProceedsMinor"),v=Mi(d,"gainMinor"),A=Mi(g,"basisMinor"),x=Mi(g,"marketValueMinor"),O=Mi(g,"unrealizedGainMinor"),E=o.every(w=>BigInt(w.feeMinor)>0n?w.type==="acquisition"?s.acquisitionFees!=="unresolved":w.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),_={recordVersion:cq,recordType:"cost-basis-records",label:uq,asOf:n,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:r.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:E?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:y.value,basisMinor:b.value,gainMinor:v.value,knownProceedsSubtotalMinor:y.known,knownBasisSubtotalMinor:b.known,knownGainSubtotalMinor:v.known}},transfers:p,holdings:g,unrealized:{totals:{marketValueMinor:x.value,basisMinor:A.value,gainMinor:O.value,knownMarketValueSubtotalMinor:x.known,knownBasisSubtotalMinor:A.known,knownGainSubtotalMinor:O.known}},completeness:{accounting:c.some(w=>w.code!=="missing-market-value")?"incomplete":"complete",valuation:g.every(w=>w.marketValueMinor!=null)?"complete":"incomplete",evidence:kq(o,a.values),treatment:E?"specified":"unresolved"},issues:c};return tt(_)}var cq,lq,uq,dq,pq,fq,Em,Jv,tx=R(()=>{$i();cq=1,lq=Object.freeze(["fifo","lifo","hifo","specific"]),uq="Accounting records only; not tax advice.",dq=new Set(["acquisition","disposal","transfer"]),pq=new Set(["complete","incomplete","unknown"]),fq=/[\u0000-\u001f\u007f]/,Em=class extends Error{constructor(t,n="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=n}};Jv=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function ue(e,t){throw new Sm(e,t)}function No(e,t){return e<t?-1:e>t?1:0}function Xt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Xt(t);Object.freeze(e)}return e}function Oe(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ue(`${t} must be a plain object`),e}function zn(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&ue(`${t} must be a string`);let o=e.trim();return o||ue(`${t} is required`),Rq.test(o)&&ue(`${t} contains control characters`),o.length>512&&ue(`${t} is too long`),r?o.toLowerCase():o}function Jt(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&ue(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():ue(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||ue(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&ue(`${t} must be positive`),i.toString()}function sx(e,t){e==null&&ue(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&ue(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let n=Jt(e,t),r=BigInt(n);return r>BigInt(rx)&&ue(`${t} exceeds ${rx}`),Number(r)}function da(e,t){return e==null?null:zn(e,t)}function Pq(e,t){return e==null&&ue(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&ue(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):zn(String(e),t,{lower:!0})}function ee(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function Lq(e,t="protocol"){if(e==null)return"generic";let n=zn(e,t,{lower:!0}),r=Nq[n]||n;return Tq.has(r)||ue(`${t} must be a supported lending or yield protocol`),r}function px(e){return e.protocol!=null?Lq(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function $q(e,t="evidence"){if(e==null)return Xt({status:"unknown",references:[]});let n=Oe(e,t),r=zn(n.status??"unknown",`${t}.status`,{lower:!0});Cq.has(r)||ue(`${t}.status must be complete, incomplete, unknown, or stale`),n.references!=null&&!Array.isArray(n.references)&&ue(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=Oe(s,`${t}.references[${a}]`);return{kind:zn(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:zn(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>No(s.kind,a.kind)||No(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Xt({status:r,references:i})}function fx(e,t){if(e==null)return null;if(typeof e=="number"&&ue(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=Oe(e,t);if(o.bps!=null)return fx(o.bps,`${t}.bps`);if(o.ray!=null)return Am(o.ray,`${t}.ray`);if(o.wad!=null)return ax(o.wad,`${t}.wad`);if(o.raw!=null)return Am(o.raw,`${t}.raw`);o.value!=null&&ue(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),ue(`${t} must include bps, wad, or ray`)}let n=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(n)||ue(`${t} must be a non-negative base-10 integer string`);let r=BigInt(n);return r<=10000n?r.toString():r<=Bi?ax(r,t):Am(r,t)}function ax(e,t){let r=BigInt(Jt(e,t))*10000n/Bi;return r>10000n&&ue(`${t} exceeds 100%`),r.toString()}function Am(e,t){let n=BigInt(Jt(e,t)),r=10n**27n,o=n*10000n/r;return o>10000n&&ue(`${t} exceeds 100%`),o.toString()}function cx(e,t,n){let r=`${n}[${t}]`,o=Oe(e,r),i=zn(ee(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${r}.asset`),s=da(ee(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${r}.address`),a=Jt(ee(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${r}.amount`),c=sx(ee(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${r}.decimals`),l=Jt(ee(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${r}.price`),u=sx(ee(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${r}.priceDecimals`),d=null;if(n==="collateral"){let p=ee(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;p==null&&ue(`${r}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=fx(p,`${r}.liquidationThreshold`)}return Xt({asset:i,address:s,amount:a,decimals:String(c),price:l,priceDecimals:String(u),liquidationThresholdBps:d})}function Bl(e,t){return e==null?[]:(Array.isArray(e)||ue(`${t} must be an array`),e.length>ox&&ue(`${t} exceeds ${ox} assets`),e)}function Dq(e){let t=ee(e,["chain","chainId","network"]),n=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,r=Pq(t??n,"chain"),o=zn(ee(e,["account","address","owner","user","wallet"]),"account"),i=ee(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:r,account:o,market:i==null?null:zn(String(i),"market")}}function Mq(e,t){let n=Jt(t.asOf??e.asOf,"asOf"),r=Jt(ee(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Jt(ee(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:n,observedAt:r,expiresAt:o}}function Bq(e,t,n,r){return BigInt(r)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(r)>=BigInt(n)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function ua(e,t,n,r={}){return Xt({code:e,severity:t,message:n,...r})}function mx(e){let t={critical:0,warning:1,info:2};return[...e].sort((n,r)=>{let o=(t[n.severity]??9)-(t[r.severity]??9);return o||No(n.code,r.code)||No(n.message,r.message)})}function lx(e,t,n,r,o,i){return BigInt(e)*BigInt(n)*10n**BigInt(o-t)*10n**BigInt(i-r)}function Uq(e,t){let n=[...e,...t],r=n.reduce((b,y)=>Math.max(b,Number(y.decimals)),0),o=n.reduce((b,y)=>Math.max(b,Number(y.priceDecimals)),0),i=0n,s=0n,a=0n;for(let b of e){let y=lx(b.amount,Number(b.decimals),b.price,Number(b.priceDecimals),r,o);s+=y,i+=y*BigInt(b.liquidationThresholdBps)}for(let b of t)a+=lx(b.amount,Number(b.decimals),b.price,Number(b.priceDecimals),r,o);let c=10n**BigInt(r),l={tokenDecimals:String(r),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},u=(s/c).toString(),d=(a/c).toString(),p=(i/10000n/c).toString();if(a===0n)return Xt({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:p,quote:l});let f=(i*Bi/(a*10000n)).toString(),m=i/10000n-a,h=m<0n?"-":"",g=m<0n?-m:m;return Xt({healthFactorWad:f,healthFactorStatus:BigInt(f)<Bi?"liquidatable":"priced",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:`${h}${(g/c).toString()}`,quote:l})}function xt(e,t={}){ie(e),ie(t);let n=Oe(e,"snapshot");Oe(t,"options");let r=px(n),{chain:o,account:i,market:s}=Dq(n),a=$q(n.evidence),{asOf:c,observedAt:l,expiresAt:u}=Mq(n,t),d=zn(n.id??n.positionId??`${r}:${o}:${i}:${s??"default"}`,"id"),p=da(n.tenantId,"tenantId"),f=Bl(n.collateral??n.supplies??n.deposits,"collateral").map((g,b)=>cx(g,b,"collateral")),m=Bl(n.debt??n.borrows??n.liabilities,"debt").map((g,b)=>cx(g,b,"debt")),h={id:d,protocol:r,chain:o,account:i,market:s,observedAt:l,expiresAt:u,asOf:c,evidence:a,collateral:f,debt:m};return p&&(h.tenantId=p),Xt(h)}function qq(e){return ee(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function Fq(e,t={}){return ee(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??ee(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function jq(e){return ee(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function Hq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return xt({...n,protocol:"aave-v3"},t);let r=n.userReserves??n.reserves??n.market?.reserves;if(!Array.isArray(r))return xt({...n,protocol:"aave-v3"},t);let o=[],i=[];for(let s of r){let a=Oe(s,"reserve"),c=Oe(a.underlyingToken??a.token??a,"reserve.token"),l={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:ee(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:ee(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},u=ee(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=ee(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);u!=null&&u!=="0"&&o.push({...l,amount:u}),d!=null&&d!=="0"&&i.push({...l,amount:d})}return xt({...n,protocol:"aave-v3",collateral:n.collateral??o,debt:n.debt??i},t)}function zq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return xt({...n,protocol:"morpho"},t);let r=qq(n),o=n.collateralAsset??n.market?.collateralAsset??{},i=n.loanAsset??n.market?.loanAsset??{},s=n.position??n.state??{},a=[{asset:o.symbol??n.collateralSymbol,address:o.address,decimals:o.decimals??n.collateralDecimals,amount:ee(n,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:ee(n,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:ee(n,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:r}],c=n.debt??[{asset:i.symbol??n.loanSymbol,address:i.address,decimals:i.decimals??n.loanDecimals,amount:ee(n,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:ee(n,["loanPrice","debtPrice"])??i.price,priceDecimals:ee(n,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],l=(Array.isArray(c)?c:[c]).filter(u=>u&&u.amount!=null&&u.amount!=="0"&&u.amount!==0n);return xt({...n,protocol:"morpho",market:n.marketId??n.market?.marketId??n.market,collateral:Array.isArray(a)?a:[a],debt:l},t)}function Vq(e,t={}){ie(e);let n=Oe(e,"snapshot"),r=n.markets??n.cTokens??(n.cToken||n.underlying?[n]:null);if(n.collateral||n.debt)return xt({...n,protocol:"compound"},t);let o=[],i=[];for(let s of Bl(r??[],"markets")){let a=Oe(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:Fq(n,a)},l=ee(a,["supplyBalance","balance","amount","totalSupply"]),u=ee(a,["borrowBalance","borrow","debt","totalBorrow"]);l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return xt({...n,protocol:"compound",collateral:o,debt:i},t)}function Wq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.stale===!0||n.reserve?.lastUpdate?.stale===1)return xt({...n,protocol:"solend",evidence:{...n.evidence||{},status:"stale"}},t);if(n.collateral||n.debt)return xt({...n,protocol:"solend"},t);let r=n.reserves??n.obligation?.deposits??(n.mint||n.mintDecimals!=null?[n]:[]),o=[],i=[];for(let s of Bl(r,"reserves")){let a=Oe(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:jq(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??n.liquidationThresholdBps},l=ee(a,["depositedAmount","collateral","amount","availableAmount"]),u=ee(a,["borrowedAmount","borrowBalance","debt"]);if(u==null&&a.borrowedAmountWads!=null){let d=Jt(a.borrowedAmountWads,"borrowedAmountWads");u=(BigInt(d)/10n**18n).toString()}l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return xt({...n,protocol:"solend",collateral:o,debt:i},t)}function Gq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.collateral||n.debt)return xt({...n,protocol:"spark"},t);let r=n.vault??n.savingsVault??n.data?.vault??n,o=Oe(r,"vault"),i=[{asset:o.symbol??o.asset??n.token??"savings",address:o.address??n.address,decimals:o.decimals??n.decimals,amount:ee(n,["amount","shares","balance"])??o.amount??o.shares,price:ee(n,["price","priceQuoteMinor"])??o.price,priceDecimals:ee(n,["priceDecimals"])??o.priceDecimals,liquidationThreshold:ee(n,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=ee(n,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",address:n.debtAddress,decimals:n.debtDecimals??o.decimals??n.decimals,amount:s,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals??o.priceDecimals}];return xt({...n,protocol:"spark",collateral:i,debt:a},t)}function Kq(e,t={}){ie(e);let n=Oe(e,"snapshot");if(n.tvlUsd!=null&&typeof n.tvlUsd=="number"&&ue("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(n.collateral)||Array.isArray(n.debt)){let c=xt({...n,protocol:"farming"},t),l=da(n.recipe??n.farmingMethod??n.methodId,"recipe");return Xt(l?{...c,recipe:l}:c)}let r=da(n.recipe??n.farmingMethod??n.methodId,"recipe"),o=[{asset:n.symbol??n.asset??n.project??"farm",address:n.pool??n.address,decimals:n.decimals,amount:ee(n,["amount","deposited","shares","collateral"]),price:ee(n,["price","priceQuoteMinor"]),priceDecimals:n.priceDecimals,liquidationThreshold:ee(n,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=ee(n,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",decimals:n.debtDecimals??n.decimals,amount:i,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals}],a=xt({...n,protocol:"farming",collateral:o,debt:s},t);return Xt(r?{...a,recipe:r}:a)}function Jq(e,t={}){ie(e);let n=Oe(e,"snapshot"),r=px(n);return Yq[r]({...n,protocol:r},t)}function Xq(e){let t=e==null?{}:Oe(e,"thresholds"),n=Jt(t.criticalHealthFactorWad??nx.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),r=Jt(t.warningHealthFactorWad??nx.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(r)<BigInt(n)&&ue("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Jt(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return Xt({criticalHealthFactorWad:n,warningHealthFactorWad:r,minLiquidationBufferQuoteMinor:o})}function Qq(e,t,n){let r=[];if(n.status!=="complete"){let a=n.reason||"UNKNOWN_EVIDENCE";return r.push(ua(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:n.status==="stale"?"stale":"unknown",findings:r,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:r,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:r,metrics:o};let i=BigInt(e.healthFactorWad);i<Bi?r.push(ua("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?r.push(ua("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&r.push(ua("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&r.push(ua("LIQUIDATION_BUFFER_LOW",i<Bi?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return r.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":r.some(a=>a.severity==="critical")?s="critical":r.length&&(s="warning"),{healthStatus:s,findings:r,metrics:o}}function vm(e={},t={}){ie(e),ie(t),Oe(e,"input"),Oe(t,"options"),t.asOf==null&&e.asOf==null&&ue("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let n=Jq(e,t),r=Xq(t.thresholds??e.thresholds),o=Bq(n.evidence,n.observedAt,n.expiresAt,n.asOf),i=Qq(o.status==="complete"?Uq(n.collateral,n.debt):{healthFactorStatus:"unknown"},r,o),s={recordVersion:ux,recordType:"position-health",label:dx,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:n.id,protocol:n.protocol,chain:n.chain,account:n.account,market:n.market,observedAt:n.observedAt,expiresAt:n.expiresAt,asOf:n.asOf,evidence:n.evidence,collateral:n.collateral,debt:n.debt,thresholds:r,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:mx(i.findings)};return n.tenantId&&(s.tenantId=n.tenantId),n.recipe&&(s.recipe=n.recipe),Xt(s)}function hx(e={},t={}){ie(e),ie(t);let n=Array.isArray(e)?{snapshots:e}:Oe(e,"input"),r=n.snapshots??n.positions;Array.isArray(r)||ue("snapshots must be an array"),r.length>ix&&ue(`snapshots exceed ${ix}`);let o=Jt(t.asOf??n.asOf,"asOf"),i=t.thresholds??n.thresholds,s=da(n.tenantId,"tenantId"),a=r.map((p,f)=>vm(s&&p?.tenantId==null?{...p,tenantId:s}:p,{...t,asOf:o,thresholds:i,index:f})).sort((p,f)=>No(p.chain,f.chain)||No(p.account,f.account)||No(p.id,f.id)),c=mx(a.flatMap(p=>p.findings.map(f=>({...f,positionId:p.id})))),l=a.filter(p=>p.healthStatus==="unknown"||p.healthStatus==="stale").length,u=a.filter(p=>p.findings.length>0).length,d={recordVersion:ux,recordType:"position-health-book",label:dx,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(u),failClosedCount:String(l),positions:a,findings:c};return s&&(d.tenantId=s),Xt(d)}var ux,dx,_q,nx,Tq,Nq,Cq,Rq,Bi,rx,ox,ix,Sm,Yq,gx=R(()=>{$i();ux=1,dx="Alert findings only; not an execution signal and not a live oracle.",_q=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),nx=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),Tq=new Set(_q),Nq=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),Cq=new Set(["complete","incomplete","unknown","stale"]),Rq=/[\u0000-\u001f\u007f]/,Bi=10n**18n,rx=36,ox=64,ix=128,Sm=class extends Error{constructor(t,n="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=n}};Yq=Object.freeze({"aave-v3":Hq,morpho:zq,compound:Vq,solend:Wq,spark:Gq,farming:Kq,generic:xt})});function $e(e,t){throw new xm(e,t)}function Co(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Co(t);Object.freeze(e)}return e}function Ar(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&$e(`${t} must be a plain object`),e}function $t(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&$e(`${t} must be a string`);let o=e.trim();return o||$e(`${t} is required`),aF.test(o)&&$e(`${t} contains control characters`),o.length>2048&&$e(`${t} is too long`),r?o.toLowerCase():o}function Vn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&$e(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():$e(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||$e(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&$e(`${t} must be positive`),i.toString()}function Ui(e,t){return e==null?null:$t(e,t)}function ro(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function uF(e,t="action"){let n=$t(e,t,{lower:!0});return rF.has(n)||$e(`${t} must be proposal, delegation, or vote`),n}function dF(e,t="proposal.state"){e==null&&$e(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let n=$t(e,t,{lower:!0});return oF.has(n)||$e(`${t} is not a recognized proposal state`),n==="unknown"&&$e(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),n}function pF(e){let t=$t(e,"support",{lower:!0});return iF.has(t)||$e("support must be for, against, or abstain"),t}function Ul(e,{accountRequired:t=!0}={}){return Co({chain:$t(ro(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:$t(ro(e,["governor","governorAddress","governance","contract"]),"governor"),account:$t(ro(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function fa(e,t){let n=Ui(t.tenantId??e.tenantId,"tenantId");return n?{tenantId:n}:{}}function ql(e,t,n="asOf"){return Vn(t.asOf??e.asOf,n)}function fF(e,t={}){ie(e),ie(t);let n=Ar(e,"proposal");Ar(t,"options");let r=ql(n,t),o=Ul(n,{accountRequired:!1}),i=$t(ro(n,["proposalId","id"]),"proposalId"),s=dF(ro(n,["state","status","proposalState"])),a=Ui(n.title??n.name,"title"),c=Ui(n.description??n.body??n.summary,"description"),l=Ui(n.proposer,"proposer"),u=Vn(n.startBlock??n.start,"startBlock",{optional:!0}),d=Vn(n.endBlock??n.end,"endBlock",{optional:!0}),p=Vn(n.forVotes??n.votesFor,"forVotes",{optional:!0}),f=Vn(n.againstVotes??n.votesAgainst,"againstVotes",{optional:!0}),m=Vn(n.abstainVotes??n.votesAbstain,"abstainVotes",{optional:!0}),h={recordVersion:pa,recordType:"governance-proposal",label:no,asOf:r,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:cF.has(s),terminal:lF.has(s),title:a,description:c,proposer:l,startBlock:u,endBlock:d,tallies:{forVotes:p,againstVotes:f,abstainVotes:m},occurred:!1,...fa(n,t)};return Co(h)}function mF(e,t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options");let r=ql(n,t),o=Ul(n),i=n.mode??(n.action==="undelegate"?"undelegate":"delegate"),s=$t(i,"mode",{lower:!0});sF.has(s)||$e("mode must be delegate or undelegate");let a=s==="undelegate"?Ui(n.delegatee??n.to,"delegatee"):$t(n.delegatee??n.to,"delegatee"),c=Vn(ro(n,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),l={recordVersion:pa,recordType:"governance-delegation-intent",label:no,action:"delegation",mode:s,asOf:r,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...fa(n,t)};return Co(l)}function hF(e,t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options");let r=ql(n,t),o=fF(n.proposal??n,t);o.votable||$e(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=Ul({...n,chain:n.chain??o.chain,governor:n.governor??o.governor}),s=pF(n.support??n.choice??n.vote),a=Vn(ro(n,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=Ui(n.reason??n.comment,"reason"),l={recordVersion:pa,recordType:"governance-vote-intent",label:no,action:"vote",asOf:r,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...fa(n,t)};return Co(l)}function gF(e,t={}){ie(e);let n=Ar(e,"intent"),r=ql(n,t),o=Ul(n),i=$t(n.title??n.name,"title"),s=$t(n.description??n.body,"description"),a=n.targets;(!Array.isArray(a)||a.length===0)&&$e("targets must be a non-empty array");let c=(n.values??a.map(()=>"0")).map((d,p)=>Vn(d,`values[${p}]`));c.length!==a.length&&$e("values length must match targets");let l=(n.calldatas??n.data??[]).map((d,p)=>$t(String(d),`calldatas[${p}]`));l.length!==a.length&&$e("calldatas length must match targets");let u=Vn(ro(n,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return Co({recordVersion:pa,recordType:"governance-proposal-intent",label:no,action:"proposal",asOf:r,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,p)=>$t(d,`targets[${p}]`)),values:c,calldatas:l,votingPower:u,occurred:!1,...fa(n,t)})}function yF(e,t,n){return e==="vote"?hF(t,n):e==="delegation"?mF(t,n):gF(t,n)}function bF(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,no]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",no]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",no]}function yx(e={},t={}){ie(e),ie(t);let n=Ar(e,"intent");Ar(t,"options"),t.asOf==null&&n.asOf==null&&$e("explicit asOf required","GOVERNANCE_MISSING_ASOF");let r=uF(n.action??n.type??t.action??wF(n)),o=yF(r,{...n,action:r},t);return Co({recordVersion:pa,recordType:"governance-preview",label:no,action:r,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:bF(o),intent:o,...fa(n,t)})}function wF(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";$e("action is required")}var pa,no,Zq,eF,tF,nF,rF,oF,iF,sF,aF,cF,lF,xm,bx=R(()=>{$i();pa=1,no="Unsigned prepare material only; no vote, signature, or broadcast occurred.",Zq=Object.freeze(["proposal","delegation","vote"]),eF=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),tF=Object.freeze(["for","against","abstain"]),nF=Object.freeze(["delegate","undelegate"]),rF=new Set(Zq),oF=new Set(eF),iF=new Set(tF),sF=new Set(nF),aF=/[\u0000-\u001f\u007f]/,cF=new Set(["active"]),lF=new Set(["executed","defeated","canceled","expired"]),xm=class extends Error{constructor(t,n="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=n}}});import{createHash as EF}from"node:crypto";import{getAddress as AF,wordlists as SF}from"ethers";import{address as vF}from"@solana/addresses";import{base58check as xF,bech32 as wx,bech32m as IF}from"@scure/base";import{sha256 as kF}from"@noble/hashes/sha2.js";function Ix(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function GF(e){let t=Ix(e);return MF.some(n=>t.includes(n))}function KF(e){return VF.has(Ix(e))}function YF(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return FF.has(t.length)&&t.every(n=>SF.en.getWordIndex(n)>=0)}function Kn(e){let t=new WeakSet,n=0;function r(o,i,s,a=""){if(n+=1,n>RF)throw new RangeError("safety-intelligence: input is too large");if(s>PF)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>LF)throw new RangeError(`safety-intelligence: string too long at ${i}`);if(BF.test(o)||UF.test(o)||YF(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(qF.test(o)&&!KF(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>ma)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(l=>Number.isInteger(l)&&l>=0&&l<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((l,u)=>r(l,`${i}[${u}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(l=>typeof l=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let l of c){if(GF(l))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${l}`);let u=Object.getOwnPropertyDescriptor(o,l),d=u&&"get"in u&&typeof u.get=="function"?u.get.call(o):o[l];d!==void 0&&r(d,`${i}.${l}`,s+1,l)}t.delete(o)}return r(e,"$",0),e}function It(e,t,n){for(let r of Object.keys(e||{}))if(!t.has(r))throw new TypeError(`safety-intelligence: unknown ${n} field ${r}`)}function Sr(e,t,n,{required:r=!1}={}){if(e==null||e===""){if(r)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&r)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>n)throw new RangeError(`safety-intelligence: ${t} exceeds ${n} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function Fl(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let n;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);n=e}else if(typeof e=="string"){let r=e.trim();if(HF.test(r)&&r.length<=zF){if(n=Number(r),!Number.isSafeInteger(n))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(jF.test(r)){if(n=Date.parse(r),!Number.isFinite(n)||new Date(n).toISOString().replace(/\.000Z$/,"Z")!==r&&new Date(n).toISOString()!==r)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(n))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:n,iso:new Date(n).toISOString()}}function kx(e,t){return e==null||e===""?null:Fl(e,t)}function vx(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function Ox(e){Kn(e);let t,n;if(Number.isInteger(e))t="evm",n=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",n=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=vx(s[1]),n=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))It(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=vx(e.family??e.namespace??(e.chainId!=null?"evm":"")),n=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof n=="string"&&/^\d+$/.test(n)?Number(n):n;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return Ge({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let r=Sr(n,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(r))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return Ge({family:t,namespace:o,reference:r,network:r,key:`${o}:${r}`})}function JF(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function XF(e,t){let n=Sr(e,"bitcoin address",100,{required:!0}),r=JF(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(n)){if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=n.toLowerCase(),a,c;try{a=wx.decode(s,100),c="bech32"}catch{try{a=IF.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let l=a.words[0],u;try{u=wx.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(l)||l<0||l>16||u.length<2||u.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(l===0&&(c!=="bech32"||![20,32].includes(u.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(l>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=r==="mainnet"?"bc":r==="testnet"?"tb":r==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=DF.decode(n)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(r==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((r==="testnet"||r==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:n,display:n}}function QF(e,t){let n=Ox(t);Kn(e);let r=Sr(e,`${n.family} address`,128,{required:!0});if(n.family==="evm"){let o=r.startsWith("0X")?`0x${r.slice(2)}`:r,i;try{i=AF(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return Ge({canonical:i.toLowerCase(),display:i})}if(n.family==="solana"){let o;try{o=String(vF(r))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return Ge({canonical:o,display:o})}return Ge(XF(r,n))}function vr(e={}){if(Kn(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");It(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),n=Ox(t),r=QF(e.address,n);return Ge({chain:n,address:r.canonical,displayAddress:r.display,key:`${n.key}:${r.canonical}`})}function Gn(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Gn).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Gn(e[t])}`).join(",")}}`}function Om(e){return EF("sha256").update(e).digest("hex")}function Ge(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Ge(t);return Object.freeze(e)}function Im(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),r={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!r||!TF.has(r))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return r}function ZF(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let n=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),r=WF[n];if(!r)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return r}function ej(e,t){let n=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!n){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return vr(n)}function tj(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");It(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),It(t,new Set(["target","asOf"]),"evidence option");let n=ej(e,t.target?vr(t.target):null),r=Im(e.kind??e.type??e.category),o=ZF(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=Sr(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=Fl(e.fetchedAt,"evidence fetchedAt"),l=kx(e.expiresAt??e.expiry,"evidence expiresAt");if(!l&&e.ttlMs!=null){let g=Number(e.ttlMs);if(!Number.isSafeInteger(g)||g<=0||g>Ax)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${Ax}`);l={ms:c.ms+g,iso:new Date(c.ms+g).toISOString()}}if(!l)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(l.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let u=Fl(t.asOf,"asOf").ms,d=c.ms>u+$F?"FUTURE":l.ms<=u?"STALE":"CURRENT",p=Sr(e.sourceRecordId??e.recordId??e.reference,"source record id",160),f=Sr(e.summary,"evidence summary",500),m={kind:r,verdict:o,source:s,...p?{sourceRecordId:p}:{},fetchedAt:c.iso,expiresAt:l.iso,confidence:a,freshness:d,target:n.key,...f?{summary:f}:{}},h=`safety-evidence:${Om(Gn(m))}`;return Ge({id:h,...m})}function nj(e=[],t={}){if(Kn({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let n=t.maxEvidence??NF;if(!Number.isSafeInteger(n)||n<=0||n>ma)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>n)throw new RangeError(`safety-intelligence: evidence exceeds ${n} records`);It(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let r={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=tj(i,r);return[s.id,s]}));return Ge([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function rj(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${n}] must be an object`);It(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let r=vr({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=Sr(e.id,"contact id",120),i=Sr(e.label,"contact label",120);return Ge({...o?{id:o}:{},...i?{label:i}:{},target:r})}function jl(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let n=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(n)||n.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(n).toString()}function oj(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${n}] must be an object`);It(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let r=e.counterparty??e.address??e.from,o=vr({address:r,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=jl(e.amountBaseUnits,`observations[${n}].amountBaseUnits`),c=kx(e.observedAt,`observations[${n}].observedAt`)?.iso??null;return Ge({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function ij(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function sj(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function xx(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function Wn(e){return Ge({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function km(e){let t=new Map;for(let n of e){let r=Gn(n);t.set(r,n)}return[...t.values()].sort((n,r)=>(Sx[n.severity]??9)-(Sx[r.severity]??9)||n.category.localeCompare(r.category)||n.code.localeCompare(r.code)||Gn(n).localeCompare(Gn(r)))}function aj(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");It(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),It(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let n=vr(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(r))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??CF,s=t.maxObservations??ma;if(!Number.isSafeInteger(i)||i<=0||i>ma)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>ma)throw new RangeError("safety-intelligence: invalid maxObservations");if(r.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=r.map((f,m)=>rj(f,n.chain,m)).sort((f,m)=>f.target.key.localeCompare(m.target.key)||String(f.id||f.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((f,m)=>oj(f,n.chain,m)).sort((f,m)=>Gn(f).localeCompare(Gn(m))),l=a.filter(f=>f.target.chain.key===n.chain.key),u=l.filter(f=>f.target.address===n.address),d=[],p=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")p=vr({chain:n.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))It(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),p=vr({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:n.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");p.key!==n.key&&d.push(Wn({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[p.key,n.key]}))}if(u.length===0){let f=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(f)||f<3||f>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=xx(n);for(let h of l){let g=xx(h.target),b=ij(m,g),y=sj(m,g);b>=f&&y>=f&&m!==g&&d.push(Wn({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${f} leading and trailing characters with a different known contact.`,relatedTargets:[h.target.key,n.key]}))}if(e.dustThresholdBaseUnits!=null){let h=BigInt(jl(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(b=>b.target.key===n.key&&b.direction==="inbound"&&BigInt(b.amountBaseUnits)<=h).length>0&&d.push(Wn({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[n.key]}))}}return Ge({target:n,exactKnownContact:u.length>0,exactContacts:u,findings:km(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:jl(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function cj(e){let t=e??_F;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let n=t.map((o,i)=>{if(typeof o=="string")return{kind:Im(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return It(o,new Set(["kind","source"]),"required check"),{kind:Im(o.kind),source:Sr(o.source,"required check source",120,{required:!0})}}),r=new Map(n.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return Ge([...r.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function lj(e,t){return e.filter(n=>n.kind===t.kind&&(!t.source||n.source===t.source))}function uj(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function _x(e){return Kn(e),`sha256:${Om(Gn(e))}`}function _m(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(It(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),It(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let n=Fl(t.asOf,"asOf").iso,r=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=vr(r),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[g,b]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(b)||b<0||b>1)throw new TypeError(`safety-intelligence: ${g} must be between 0 and 1`);let a=nj(e.evidence??[],{target:o,asOf:n,maxEvidence:t.maxEvidence}),c=a.filter(g=>g.target===o.key),l=cj(e.requiredChecks),u=[];for(let g of c)g.freshness==="CURRENT"&&g.verdict==="BLOCK"?u.push(Wn({code:g.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:g.confidence>=s?"BLOCK":"REVIEW",category:g.kind,basis:"explicit-evidence",message:g.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[g.id]})):g.freshness==="CURRENT"&&g.verdict==="REVIEW"?u.push(Wn({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[g.id]})):g.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(g.verdict)?u.push(Wn({code:g.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[g.id]})):g.freshness==="CURRENT"&&g.verdict==="UNKNOWN"&&u.push(Wn({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:g.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[g.id]}));for(let g of l){let b=lj(c,g),y=b.filter(x=>x.freshness==="CURRENT"),v=y.filter(x=>x.verdict==="CLEAR"&&x.confidence>=i),A=y.filter(x=>x.verdict==="BLOCK");if(v.length>0&&A.length>0&&u.push(Wn({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:g.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[...v,...A].map(x=>x.id)})),v.length===0){let x=y.filter(_=>_.verdict==="CLEAR"),O=b.filter(_=>_.verdict==="CLEAR"&&_.freshness!=="CURRENT"),E=g.source?`${g.kind} from ${g.source}`:g.kind;u.push(Wn({code:x.length>0?"CLEAR_CONFIDENCE_TOO_LOW":O.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:g.kind,basis:"coverage",message:`Required check ${E} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...x,...O].map(_=>_.id)}))}}let d=aj({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});u.push(...d.findings);let p=km(u),f=uj(p);f==="CLEAR"&&(p=km([Wn({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(g=>g.freshness==="CURRENT"&&g.verdict==="CLEAR").map(g=>g.id)})]),f="CLEAR");let m={version:Ex,target:o.key,evaluatedAt:n,decision:f,gate:f==="CLEAR"?"CONTINUE":f==="BLOCK"?"BLOCK":"HOLD",requiredChecks:l,evidenceIds:c.map(g=>g.id).sort(),findings:p},h=Ge({...m,hash:_x(m)});return Ge({version:Ex,target:o,evaluatedAt:n,status:f,evidence:a,requiredChecks:l,poisoning:d,policy:h})}function dj(e={}){if(Kn(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");It(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=vr(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.amountBaseUnits??e.valueBaseUnits,r=n==null?null:jl(n,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:r};return Ge({id:`safety-transaction:${Om(Gn(o))}`,...o})}function Tx(e={},t={}){if(Kn({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");It(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let n=dj(e.transaction),r=_m({target:n.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=r.policy,s={...i,transactionId:n.id},a=Ge({...s,hash:_x(s)});return Ge({...r,transaction:n,policy:a})}var Ex,$G,OF,_F,TF,NF,CF,ma,RF,PF,LF,Ax,$F,DF,MF,BF,UF,qF,FF,jF,HF,zF,VF,WF,Sx,Nx=R(()=>{Ex=1,$G=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),OF=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),_F=Object.freeze(["sanctions","phishing","scam"]),TF=new Set(OF),NF=128,CF=256,ma=512,RF=4096,PF=8,LF=2048,Ax=366*24*60*60*1e3,$F=6e4,DF=xF(kF),MF=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],BF=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,UF=/\bxprv[0-9A-Za-z]{50,}\b/,qF=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,FF=new Set([12,15,18,21,24]),jF=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,HF=/^\d+$/,zF=String(Number.MAX_SAFE_INTEGER).length,VF=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),WF=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),Sx=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var MG,BG,UG,Tm=R(()=>{MG=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),BG=Object.freeze(["read","simulate"]),UG=1440*60});function Cx(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return fj.test(t)||mj.includes(n)}function xr(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=gj.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of hj)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Ro(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Cx(o))throw new Ro(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");xr(o,`${t}[key]`,n),xr(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())xr(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>xr(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(Cx(o))throw new Ro(`${t}.${o}`,"forbidden-key-name");xr(i,`${t}.${o}`,n,o)}return e}var Ro,fj,mj,hj,gj,Nm=R(()=>{Tm();Ro=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},fj=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,mj=Object.freeze(["privkey","wif","xprv","seed"]);hj=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),gj=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as yj}from"node:crypto";function Rm(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Rm).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Rm(e[t])}`).join(",")}}`}function bj(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Hl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Hl(t)}return e}function Pm(e,t="fact"){try{xr(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Lx(e){return yj("sha256").update(Rm(e)).digest("hex")}function $x({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:bj(n)};return Hl({...s,hash:Lx(s)})}function zl({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Pm(t,"intent");let r=$x({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return Hl({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function Dx(e,t,n,r={}){if(Lm(e),!(Rx[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Pm(n,t);let i=r.external===!0||r.externallySupplied===!0;if(Px.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=r.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=$x({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return Hl({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Lm(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(Lx(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Pm(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Rx[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(Px.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Cm,Rx,Px,$m=R(()=>{Nm();Cm=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Rx=Object.freeze(Object.fromEntries(Cm.map((e,t)=>[e,Object.freeze(t+1<Cm.length?[Cm[t+1]]:[])]))),Px=new Set(["signed","broadcast"])});function Mx(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return wj[t]??t}function Ej(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Mx(e)}:${t}`)}function un(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:Vl(n)})}function Aj(e,t){let n=Dt(e.repeatBuys??e.repeat_buys??e.buyCount),r=Dt(e.walletWinRate??e.winRate);un(t,"repeat_buys",n===null?null:mt((n-1)/4)*.38),un(t,"wallet_win_rate",r===null?null:(mt(r)-.5)*.5)}function Sj(e,t){let n=Dt(e.ageHours??e.poolAgeHours),r=Dt(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;un(t,"pool_age",n===null?null:n<24?-.42:mt(n/720)*.12),un(t,"liquidity",r===null?null:(mt(Math.log10(Math.max(1,r))/7)-.5)*.28),un(t,"liquidity_lock",o==null?null:o?.12:-.28)}function vj(e,t){let n=Dt(e.floorChange??e.floorChangePct),r=Dt(e.sales??e.saleCount);un(t,"floor_change",n===null?null:mt(n,-1,1)*.35),un(t,"sales_depth",r===null?null:mt(r/50)*.18)}function xj(e,t){let n=Dt(e.flowImbalance??e.imbalance),r=Dt(e.fundingRate??e.funding);un(t,"flow_imbalance",n===null?null:mt(n,-1,1)*.42),un(t,"funding",r===null?null:-mt(r*100,-1,1)*.12)}function Ij(e,t){let n=Dt(e.marketProbability??e.marketPrice??e.probability),r=Dt(e.fairProbability??e.referenceProbability??e.fairValue);un(t,"probability_mispricing",n===null||r===null?null:mt(r-n,-1,1)*.65);let o=Dt(e.liquidityUsd??e.liquidity);un(t,"market_liquidity",o===null?null:mt(Math.log10(Math.max(1,o))/6)*.12)}function Oj(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>Dt(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function Wl(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=mt(Dt(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=Mx(o),a=Ej(o,i),c=kj[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=Vl(mt(l.length/u)),p=l.reduce((v,A)=>v+A.value,0),f=Oj(o,a,t),m=f===null?0:mt(f,-1,1)*.35;f!==null&&un(l,"shadow_markout",m);let h=Vl(mt(.5+p+m)),g=f===null?.8:mt(.85+f*.3,.35,1),b=Vl(mt(d*g)),y=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||y.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&y.push("LOW_COVERAGE","NO_TRADE"),b<.5&&y.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Dt(o.ageHours??o.poolAgeHours)??1/0)<24&&y.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&y.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:b,coverage:d,contributions:l,flags:[...new Set(y)],noTrade:y.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var XG,wj,mt,Dt,Vl,kj,Dm=R(()=>{XG=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),wj=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),mt=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),Dt=e=>Number.isFinite(Number(e))?Number(e):null,Vl=e=>Math.round(e*1e4)/1e4;kj=Object.freeze({wallet:Aj,pool:Sj,nft_floor:vj,hl_flow:xj,prediction_market:Ij})});function _j(e=[],t=[],n={}){let r=Wl(e,t,n),o=r.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=r.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(n.promoteMinConfidence??.55)&&(a.score??0)>=(n.promoteMinScore??.55));return{scored:r,candidates:s,blocked:i}}function Tj(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let n=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),r={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=zl({tradeId:n,intent:r,asOf:t.asOf??Date.now()});return{tradeId:n,intent:r,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function Bx(e=[],t=[],n={}){let{scored:r,candidates:o,blocked:i}=_j(e,t,n),s=Math.min(Math.max(Number(n.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(Tj(c,{asOf:n.asOf,tradeId:n.tradeIdPrefix?`${n.tradeIdPrefix}-${c.id}`:void 0,intentExtra:n.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:r.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Ux=R(()=>{Dm();$m()});function Nj(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function qx(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=Nj(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}var Fx=R(()=>{});import{createHash as Cj,timingSafeEqual as Rj}from"node:crypto";function r6(e){if(e==null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Hm(e,t){if(!r6(e))throw new TypeError(`${t} must be a plain object`);for(let n of Reflect.ownKeys(e)){if(typeof n!="string")throw new TypeError(`${t} may contain only string keys`);let r=Object.getOwnPropertyDescriptor(e,n);if(!r?.enumerable||!("value"in r))throw new TypeError(`${t}.${n} must be an enumerable data field`)}return e}function Ot(e,t,n){Hm(e,n);let r=Object.keys(e).sort(),o=[...t].sort();if(r.length!==o.length||r.some((i,s)=>i!==o[s])){let i=o.filter(a=>!r.includes(a)),s=r.filter(a=>!o.includes(a));throw new TypeError(`${n} keys must be exact (missing: ${i.join(",")||"none"}; unknown: ${s.join(",")||"none"})`)}}function Ir(e,t,{min:n=0,max:r=1e3}={}){if(!Array.isArray(e)||e.length<n||e.length>r)throw new TypeError(`${t} must be an array with ${n}..${r} entries`);return e}function ht(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(typeof e!="number"||!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be a safe integer from ${n} through ${r}`);return e}function ji(e,t){return e===null?null:ht(e,t,{min:1})}function _n(e,t,n=256){if(typeof e!="string"||e.length<1||e.length>n||e!==e.trim()||!zj.test(e))throw new TypeError(`${t} must be non-empty printable text up to ${n} characters`);return e}function Yn(e,t){if(typeof e!="string"||!Fm.test(e))throw new TypeError(`${t} must be lowercase sha256 hex`);return e}function kt(e,t){if(typeof e!="string"||!jj.test(e.toLowerCase()))throw new TypeError(`${t} must be a 20-byte EVM address`);return e.toLowerCase()}function De(e,t,{positive:n=!1}={}){if(typeof e=="string"&&!/^(0|[1-9][0-9]*)$/.test(e))throw new TypeError(`${t} must be an unsigned decimal integer`);let r=qx(e,t);if(r<0n||r>Dj||n&&r===0n)throw new RangeError(`${t} is outside uint256 bounds`);return r.toString(10)}function Gl(e,t){return De(e,t,{positive:!0})}function jx(e,t){if(typeof e!="string"||!Hj.test(e.toLowerCase()))throw new TypeError(`${t} must be complete, even-length 0x calldata`);return e.toLowerCase()}function Kx(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Kx(t);Object.freeze(e)}return e}function jm(e,t=new WeakMap){if(e==null||typeof e!="object")return e;if(t.has(e))return t.get(e);if(Array.isArray(e)){let r=[];t.set(e,r);for(let o of e)r.push(jm(o,t));return r}let n={};t.set(e,n);for(let[r,o]of Object.entries(e)){let i=String(r).toLowerCase().replace(/[_-]/g,"");if(!(o6.has(r)||r==="storageKeys")){if(Uj.test(i))throw new Ro(`$.${r}`,"forbidden-key-name");if(typeof o=="string"&&/^(?:0x)?[0-9a-f]{64}$/i.test(o)&&qj.test(i)){n[r]="public-digest";continue}n[r]=jm(o,t)}}return n}function Kl(e,t){xr(jm(e),t)}function Yx(e,t){let n=_n(e,t,128);if(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(n))throw new TypeError(`${t} must be a bounded tenant identifier`);return n}function i6(e,t){if(typeof e!="string"||!/^0x[0-9a-f]{64}$/.test(e.toLowerCase()))throw new TypeError(`${t} must be a 32-byte storage key`);return e.toLowerCase()}function s6(e,t){return Ir(e,t,{min:0,max:128}).map((n,r)=>{let o=`${t}[${r}]`;Ot(n,n6,o);let i=[...new Set(Ir(n.storageKeys,`${o}.storageKeys`,{min:0,max:256}).map((s,a)=>i6(s,`${o}.storageKeys[${a}]`)))].sort();return{address:kt(n.address,`${o}.address`),storageKeys:i}}).sort((n,r)=>n.address<r.address?-1:n.address>r.address?1:0)}function a6(e,t){let n=Bj[typeof e=="string"?e.trim().toLowerCase():e];if(n==null)throw new TypeError(`${t} must be a closed EVM transaction type`);if($j.includes(n))throw new TypeError(`${t} ${n} is unsupported; blob and EIP-7702 fields are refused rather than partially bound`);if(!Mj.has(n))throw new TypeError(`${t} is unsupported`);return n}function c6(e){let t=new Set;function n(r,o,i){if(i>256)throw new TypeError(`canonical JSON nesting exceeds 256 at ${o}`);if(r===null)return"null";if(typeof r=="string"||typeof r=="boolean")return JSON.stringify(r);if(typeof r=="number"){if(!Number.isSafeInteger(r))throw new TypeError(`canonical JSON number at ${o} must be a safe integer`);return JSON.stringify(r)}if(typeof r!="object")throw new TypeError(`canonical JSON does not allow ${typeof r} at ${o}`);if(t.has(r))throw new TypeError(`canonical JSON does not allow cycles at ${o}`);t.add(r);let s;return Array.isArray(r)?s=`[${r.map((a,c)=>n(a,`${o}[${c}]`,i+1)).join(",")}]`:(Hm(r,o),s=`{${Object.keys(r).sort().map(c=>`${JSON.stringify(c)}:${n(r[c],`${o}.${c}`,i+1)}`).join(",")}}`),t.delete(r),s}return n(e,"$",0)}function Yl(e){return Cj("sha256").update(c6(e),"utf8").digest("hex")}function l6(e,t,n){let r=Ir(e,n,{min:1,max:1e3}).map((o,i)=>{let s=`${n}[${i}]`;Ot(o,Wj,s);let a=Gl(o.chainId,`${s}.chainId`),c=[...new Set(Ir(o.destinations,`${s}.destinations`,{min:1,max:2e3}).map((l,u)=>kt(l,`${s}.destinations[${u}]`)))].sort();return{chainId:a,destinations:c}}).sort((o,i)=>BigInt(o.chainId)<BigInt(i.chainId)?-1:BigInt(o.chainId)>BigInt(i.chainId)?1:0);if(new Set(r.map(o=>o.chainId)).size!==r.length)throw new TypeError(`${n} has duplicate chainId rows`);if(r.some(o=>!t.includes(o.chainId))||t.some(o=>!r.some(i=>i.chainId===o)))throw new TypeError(`${n} must contain exactly one row for every allowed chain`);return r}function Jx(e){Kl(e,"resolved policy"),Ot(e,Vj,"resolved policy");let t=e.grantId===null?null:Yn(e.grantId,"resolved policy.grantId"),n=ji(e.grantExpiresAtMs,"resolved policy.grantExpiresAtMs");if(t===null!=(n===null))throw new TypeError("resolved policy grant id and expiry must both be null or present");let r=[...new Set(Ir(e.allowedChainIds,"resolved policy.allowedChainIds",{min:1,max:1e3}).map((i,s)=>Gl(i,`resolved policy.allowedChainIds[${s}]`)))].sort((i,s)=>BigInt(i)<BigInt(s)?-1:BigInt(i)>BigInt(s)?1:0),o={policyVersion:e.policyVersion,allowedChainIds:r,destinationAllowlist:l6(e.destinationAllowlist,r,"resolved policy.destinationAllowlist"),maxValuePerTxWei:De(e.maxValuePerTxWei,"resolved policy.maxValuePerTxWei"),maxDailyValueWei:De(e.maxDailyValueWei,"resolved policy.maxDailyValueWei"),maxGasLimit:De(e.maxGasLimit,"resolved policy.maxGasLimit",{positive:!0}),maxFeePerGasWei:De(e.maxFeePerGasWei,"resolved policy.maxFeePerGasWei"),maxPriorityFeePerGasWei:De(e.maxPriorityFeePerGasWei,"resolved policy.maxPriorityFeePerGasWei"),maxSlippageBps:ht(e.maxSlippageBps,"resolved policy.maxSlippageBps",{min:0,max:1e4}),expiresAtMs:ht(e.expiresAtMs,"resolved policy.expiresAtMs",{min:1}),grantId:t,grantExpiresAtMs:n};if(o.policyVersion!==1)throw new TypeError("resolved policy.policyVersion must be 1");if(BigInt(o.maxValuePerTxWei)>BigInt(o.maxDailyValueWei))throw new RangeError("resolved policy per-transaction value cap exceeds daily cap");if(BigInt(o.maxPriorityFeePerGasWei)>BigInt(o.maxFeePerGasWei))throw new RangeError("resolved policy priority fee cap exceeds total fee cap");return o}function u6(e){return Yl(Jx(e))}function Xx(e,t){let n=`calls[${t}]`;Ot(e,Gj,n);let r=a6(e.type,`${n}.type`),o=kt(e.from,`${n}.from`),i=s6(e.accessList,`${n}.accessList`);if(r==="legacy"){if(e.maxFeePerGas!==null||e.maxPriorityFeePerGas!==null)throw new TypeError(`${n} legacy transactions bind gasPrice and leave eip1559 fees null`);if(i.length!==0)throw new TypeError(`${n} legacy transactions must use an empty accessList`);return{type:r,chainId:Gl(e.chainId,`${n}.chainId`),from:o,to:kt(e.to,`${n}.to`),value:De(e.value,`${n}.value`),data:jx(e.data,`${n}.data`),gasLimit:De(e.gasLimit,`${n}.gasLimit`,{positive:!0}),gasPrice:De(e.gasPrice,`${n}.gasPrice`),maxFeePerGas:null,maxPriorityFeePerGas:null,accessList:i,nonce:De(e.nonce,`${n}.nonce`)}}if(e.gasPrice!==null)throw new TypeError(`${n} typed transactions bind eip1559 fees and leave gasPrice null`);if(r==="eip1559"&&i.length!==0)throw new TypeError(`${n} eip1559 transactions must use an empty accessList; use eip2930 to bind accessList`);let s=De(e.maxFeePerGas,`${n}.maxFeePerGas`),a=De(e.maxPriorityFeePerGas,`${n}.maxPriorityFeePerGas`);if(BigInt(a)>BigInt(s))throw new RangeError(`${n} priority fee exceeds max fee`);return{type:r,chainId:Gl(e.chainId,`${n}.chainId`),from:o,to:kt(e.to,`${n}.to`),value:De(e.value,`${n}.value`),data:jx(e.data,`${n}.data`),gasLimit:De(e.gasLimit,`${n}.gasLimit`,{positive:!0}),gasPrice:null,maxFeePerGas:s,maxPriorityFeePerGas:a,accessList:i,nonce:De(e.nonce,`${n}.nonce`)}}function zm(e,t,n){let r=kt(t,n);for(let[o,i]of e.entries())if(i.from!==r)throw new Error(`${n} does not match calls[${o}].from`);return r}function Qx(e){Ot(e,Kj,"route");let t={provider:_n(e.provider,"route.provider",128),venue:kt(e.venue,"route.venue"),routeId:_n(e.routeId,"route.routeId",512)};return{...t,routeDigest:Yl(t)}}function Zx(e){Ot(e,Yj,"route");let{routeDigest:t,...n}=e,r=Qx(n);if(Yn(t,"route.routeDigest")!==r.routeDigest)throw new Error("route digest mismatch");return r}function d6(e){return{quoteId:e.quoteId===null?null:_n(e.quoteId,"quote.quoteId",512),account:kt(e.account,"quote.account"),recipient:kt(e.recipient,"quote.recipient"),assetIn:kt(e.assetIn,"quote.assetIn"),assetOut:kt(e.assetOut,"quote.assetOut"),amountIn:De(e.amountIn,"quote.amountIn"),amountOut:De(e.amountOut,"quote.amountOut"),minAmountOut:De(e.minAmountOut,"quote.minAmountOut"),slippageBps:ht(e.slippageBps,"quote.slippageBps",{min:0,max:1e4}),slippageGuardDigest:Yn(e.slippageGuardDigest,"quote.slippageGuardDigest")}}function eI(e){Ot(e,Wx,"quote");let t=d6(e);if(BigInt(t.minAmountOut)>BigInt(t.amountOut))throw new RangeError("quote.minAmountOut exceeds quote.amountOut");return{...t,quoteDigest:Yl(t)}}function tI(e){Ot(e,Jj,"quote");let{quoteDigest:t,...n}=e,r=eI(n);if(Yn(t,"quote.quoteDigest")!==r.quoteDigest)throw new Error("quote digest mismatch");return r}function nI(e){if(Ot(e,Xj,"simulation"),_n(e.status,"simulation.status",32).toLowerCase()!=="success")throw new Error(`simulation status ${JSON.stringify(e.status)} is not successful`);if(e.stateOverridesDigest!==null)throw new Error("mainnet approval refuses simulation state overrides");if(typeof e.blockHash!="string"||!Fj.test(e.blockHash.toLowerCase()))throw new TypeError("simulation.blockHash must be a 32-byte block hash");return{engine:_n(e.engine,"simulation.engine",128),status:"success",blockNumber:De(e.blockNumber,"simulation.blockNumber",{positive:!0}),blockHash:e.blockHash.toLowerCase(),stateOverridesDigest:null,balanceDeltasDigest:Yn(e.balanceDeltasDigest,"simulation.balanceDeltasDigest"),logsDigest:Yn(e.logsDigest,"simulation.logsDigest")}}function p6(e,t,n){let o={balanceAtLeast:["account","asset"],balanceAtMost:["account","asset"],allowanceEquals:["account","asset","spender"],ownerOf:["collection","tokenId"],positionSizeAtMost:["account","asset"],noNewApproval:["account","allowedSpender"]}[e];if(!o)throw new TypeError(`${n} kind is unsupported`);Ot(t,o,`${n}.subject`);let i={};for(let s of o)i[s]=s==="tokenId"?De(t[s],`${n}.subject.${s}`):kt(t[s],`${n}.subject.${s}`);return i}function rI(e,t){let n=`postconditions[${t}]`;Ot(e,["comparator","kind","subject","value"],n);let r=_n(e.kind,`${n}.kind`,64),o={balanceAtLeast:"gte",balanceAtMost:"lte",allowanceEquals:"eq",ownerOf:"eq",positionSizeAtMost:"lte",noNewApproval:"eq"};if(!(r in o))throw new TypeError(`${n}.kind is unsupported`);if(e.comparator!==o[r])throw new TypeError(`${n}.comparator must be ${o[r]} for ${r}`);let i;if(r==="ownerOf")i=kt(e.value,`${n}.value`);else if(r==="noNewApproval"){if(e.value!=="true")throw new TypeError(`${n}.value must be the string "true"`);i="true"}else i=De(e.value,`${n}.value`);return{kind:r,subject:p6(r,e.subject,n),comparator:o[r],value:i}}function qi(e,t){return e.some(t)}function oI(e,t,n,r){let o=(i,s)=>i===s;if(e==="evm-swap"){if(!qi(t,i=>i.kind==="balanceAtLeast"&&o(i.subject.account,n.recipient)&&o(i.subject.asset,n.assetOut)&&BigInt(i.value)>=BigInt(n.minAmountOut)))throw new Error("evm-swap requires balanceAtLeast(recipient, assetOut, minAmountOut)");if(!qi(t,i=>i.kind==="noNewApproval"&&o(i.subject.account,n.account)&&o(i.subject.allowedSpender,r.venue)))throw new Error("evm-swap requires noNewApproval(account, route venue)")}else if(e==="evm-approval"){if(!qi(t,i=>i.kind==="allowanceEquals"&&o(i.subject.account,n.account)))throw new Error("evm-approval requires allowanceEquals(account, spender, exactAmount)")}else if(e==="evm-transfer"){if(!qi(t,i=>i.kind==="balanceAtLeast"&&o(i.subject.account,n.recipient)&&o(i.subject.asset,n.assetOut)))throw new Error("evm-transfer requires balanceAtLeast(recipient, asset, amount)")}else if(e==="evm-bridge"){if(!qi(t,i=>i.kind==="balanceAtMost"&&o(i.subject.account,n.account)&&o(i.subject.asset,n.assetIn)))throw new Error("evm-bridge requires source balanceAtMost(account, assetIn, bound)")}else if(e==="nft-mint"&&!qi(t,i=>i.kind==="ownerOf"||i.kind==="balanceAtLeast"&&o(i.subject.account,n.account)&&o(i.subject.asset,n.assetOut)))throw new Error("nft-mint requires ownerOf or balanceAtLeast ownership evidence")}function f6(e,t){if(Hm(e,"prepare"),e.requiresUserSignature!==!0||e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.oraclePrepared!==!0)throw new Error("prepare must be custody-none, user-signature-required, and prepare-only");if(!Number.isSafeInteger(e.preparedAt)||!Number.isSafeInteger(e.expiresAt))throw new TypeError("prepare timestamps must be safe integers");if(Ra(e)!==e.prepareHash)throw new Error("prepareHash mismatch");return xu(e,{nowMs:t,maxAgeMs:Ca(co),label:"approval binding"}),e}function iI(e,{input:t=!1,nowMs:n}={}){if(Ot(e,t?Gx:Qj,"preview"),e.previewVersion!==Mm)throw new TypeError(`preview.previewVersion must be ${Mm}`);let r=ht(n,"nowMs",{min:1}),o=ht(e.builtAtMs,"preview.builtAtMs",{min:1}),i=ht(e.expiresAtMs,"preview.expiresAtMs",{min:1});if(o>r+5e3)throw new Error("preview was built in the future");yu({issuedAtMs:o,expiresAtMs:i},r,"approval preview");let s=f6(e.prepare,r);if(i>s.expiresAt)throw new Error("preview expiry cannot exceed prepare expiry");let a=_n(e.surface,"preview.surface",64);if(!Vx.has(a))throw new TypeError(`preview.surface ${JSON.stringify(a)} is unsupported`);let c=Ir(e.calls,"preview.calls",{min:1,max:256}).map(Xx);zm(c,c[0].from,"preview.calls[0].from");let l=t?Qx(e.route):Zx(e.route),u=t?eI(e.quote):tI(e.quote),d=nI(e.simulation),p=Ir(e.postconditions,"preview.postconditions",{min:1,max:256}).map(rI);if(oI(a,p,u,l),l.provider!==s.provider)throw new Error("preview route provider does not match prepare provider");let f={previewVersion:Mm,previewId:_n(e.previewId,"preview.previewId",512),builtAtMs:o,expiresAtMs:i,surface:a,calls:c,route:l,quote:u,simulation:d,postconditions:p,prepare:s,policyDigest:Yn(e.policyDigest,"preview.policyDigest"),custody:e.custody,execution:e.execution};if(f.custody!=="none"||f.execution!=="prepare-only")throw new Error("preview must declare custody none and execution prepare-only");return f}function m6(e,{nowMs:t}={}){Kl(e,"preview");let n=iI(e,{nowMs:t});return Yl(n)}function h6(e,{nowMs:t}={}){let n=m6(e,{nowMs:t});if(!cI(e.previewHash,n))throw new Error("previewHash mismatch");return!0}function g6(e,t){let n=new Map(t.destinationAllowlist.map(r=>[r.chainId,new Set(r.destinations)]));for(let r of e.calls){if(!t.allowedChainIds.includes(r.chainId))throw new Error(`policy mismatch: chain ${r.chainId} is not allowed`);if(!n.get(r.chainId)?.has(r.to))throw new Error(`policy mismatch: destination ${r.to} is not allowed on chain ${r.chainId}`);if(BigInt(r.value)>BigInt(t.maxValuePerTxWei))throw new Error("policy mismatch: transaction value exceeds cap");if(BigInt(r.gasLimit)>BigInt(t.maxGasLimit))throw new Error("policy mismatch: gas limit exceeds cap");let o=r.type==="legacy"?r.gasPrice:r.maxFeePerGas,i=r.type==="legacy"?"0":r.maxPriorityFeePerGas;if(BigInt(o)>BigInt(t.maxFeePerGasWei))throw new Error("policy mismatch: max fee exceeds cap");if(BigInt(i)>BigInt(t.maxPriorityFeePerGasWei))throw new Error("policy mismatch: priority fee exceeds cap")}if(!e.calls.some(r=>n.get(r.chainId)?.has(e.route.venue)))throw new Error("policy mismatch: route venue was not in the consulted destination allowlist");if(e.quote.slippageBps>t.maxSlippageBps)throw new Error("policy mismatch: quote slippage exceeds ceiling")}function y6(e){return Ot(e,e6,"binding.expiryBounds"),{issuedAtMs:ht(e.issuedAtMs,"binding.expiryBounds.issuedAtMs",{min:1}),previewExpiresAtMs:ht(e.previewExpiresAtMs,"binding.expiryBounds.previewExpiresAtMs",{min:1}),prepareExpiresAtMs:ht(e.prepareExpiresAtMs,"binding.expiryBounds.prepareExpiresAtMs",{min:1}),grantExpiresAtMs:ji(e.grantExpiresAtMs,"binding.expiryBounds.grantExpiresAtMs"),sessionExpiresAtMs:ji(e.sessionExpiresAtMs,"binding.expiryBounds.sessionExpiresAtMs"),policyExpiresAtMs:ht(e.policyExpiresAtMs,"binding.expiryBounds.policyExpiresAtMs",{min:1}),approvalTtlMs:ht(e.approvalTtlMs,"binding.expiryBounds.approvalTtlMs",{min:1,max:zx}),requestedExpiresAtMs:ji(e.requestedExpiresAtMs,"binding.expiryBounds.requestedExpiresAtMs")}}function sI(e){let t=[e.previewExpiresAtMs,e.prepareExpiresAtMs,e.grantExpiresAtMs,e.sessionExpiresAtMs,e.policyExpiresAtMs,e.issuedAtMs+e.approvalTtlMs,e.requestedExpiresAtMs].filter(n=>n!==null);return Math.min(...t)}function b6(e){if(Kl(e,"approval binding"),Ot(e,t6,"approval binding"),e.bindingVersion!==Fi)throw new TypeError(`approval binding.bindingVersion must be ${Fi}`);if(e.custody!=="none"||e.execution!=="prepare-only")throw new Error("approval binding must be custody-none and prepare-only");if(e.maxExecutions!==1||e.oneShot!==!0)throw new Error("approval binding must be one-shot with maxExecutions 1");if(e.schemaVersion!==Bm)throw new TypeError("approval binding.schemaVersion mismatch");if(e.buildVersion!==Um)throw new TypeError("approval binding.buildVersion mismatch");if(e.domainSeparator!==qm)throw new TypeError("approval binding.domainSeparator mismatch");let t=_n(e.surface,"approval binding.surface",64);if(!Vx.has(t))throw new TypeError("approval binding surface is unsupported");let n=Yx(e.tenantId,"approval binding.tenantId"),r=Ir(e.calls,"approval binding.calls",{min:1,max:256}).map(Xx),o=zm(r,e.expectedFrom,"approval binding.expectedFrom"),i=kt(e.expectedSigner,"approval binding.expectedSigner");if(i!==o)throw new Error("approval binding expectedSigner must equal expectedFrom");let s=Zx(e.route),a=tI(e.quote),c=nI(e.simulation),l=Ir(e.postconditions,"approval binding.postconditions",{min:1,max:256}).map(rI);oI(t,l,a,s);let u=y6(e.expiryBounds),d=ht(e.expiresAtMs,"approval binding.expiresAtMs",{min:1});if(d!==sI(u))throw new Error("approval binding expiry does not equal composed minimum ceiling");return{bindingVersion:Fi,schemaVersion:Bm,buildVersion:Um,domainSeparator:qm,tenantId:n,previewId:_n(e.previewId,"approval binding.previewId",512),previewHash:Yn(e.previewHash,"approval binding.previewHash"),prepareHash:Yn(e.prepareHash,"approval binding.prepareHash"),custody:"none",execution:"prepare-only",surface:t,expectedFrom:o,expectedSigner:i,calls:r,route:s,quote:a,simulation:c,policyDigest:Yn(e.policyDigest,"approval binding.policyDigest"),postconditions:l,expiryBounds:u,expiresAtMs:d,oneShot:!0,maxExecutions:1}}function aI(e){if(Kl(e,"approval binding input"),Ot(e,Zj,"approval binding input"),e.bindingVersion!==Fi)throw new TypeError(`approval binding input.bindingVersion must be ${Fi}`);let t=ht(e.nowMs,"approval binding input.nowMs",{min:1}),n=ht(e.issuedAtMs,"approval binding input.issuedAtMs",{min:1});if(n>t+5e3)throw new Error("approval binding issuance is in the future");h6(e.preview,{nowMs:t});let r=iI(e.preview,{nowMs:t}),o=Jx(e.resolvedPolicy),i=u6(o);if(!cI(r.policyDigest,i))throw new Error("policy mismatch: preview policy digest is stale");if(o.expiresAtMs<=t||o.grantExpiresAtMs!==null&&o.grantExpiresAtMs<=t)throw new Error("resolved policy or grant is expired");let s=ji(e.sessionExpiresAtMs,"approval binding input.sessionExpiresAtMs");if(s!==null&&s<=t)throw new Error("approval session is expired");g6(r,o);let a=Yx(e.tenantId,"approval binding input.tenantId"),c=kt(e.expectedSigner,"approval binding input.expectedSigner"),l=zm(r.calls,c,"approval binding input.expectedSigner"),u=e.approvalTtlMs===null?Hx:ht(e.approvalTtlMs,"approval binding input.approvalTtlMs",{min:1});u=Math.min(u,zx,Ca(u));let d={issuedAtMs:n,previewExpiresAtMs:r.expiresAtMs,prepareExpiresAtMs:r.prepare.expiresAt,grantExpiresAtMs:o.grantExpiresAtMs,sessionExpiresAtMs:s,policyExpiresAtMs:o.expiresAtMs,approvalTtlMs:u,requestedExpiresAtMs:ji(e.requestedExpiresAtMs,"approval binding input.requestedExpiresAtMs")},p=sI(d);if(p<=t||p<=n)throw new Error("approval binding inputs are expired or leave no execution window");let f={bindingVersion:Fi,schemaVersion:Bm,buildVersion:Um,domainSeparator:qm,tenantId:a,previewId:r.previewId,previewHash:e.preview.previewHash,prepareHash:r.prepare.prepareHash,custody:"none",execution:"prepare-only",surface:r.surface,expectedFrom:l,expectedSigner:c,calls:r.calls,route:r.route,quote:r.quote,simulation:r.simulation,policyDigest:i,postconditions:r.postconditions,expiryBounds:d,expiresAtMs:p,oneShot:!0,maxExecutions:1};return Kx(b6(f))}function cI(e,t){if(typeof e!="string"||typeof t!="string"||!Fm.test(e)||!Fm.test(t))return!1;let n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return n.length!==r.length?!1:Rj(n,r)}var Fi,Mm,Bm,Um,qm,Hx,zx,Pj,Lj,$j,lK,Dj,Vx,Mj,Bj,Uj,qj,Fm,Fj,jj,Hj,zj,uK,Vj,Wj,Gj,Kj,Yj,Wx,Jj,Xj,Gx,Qj,Zj,e6,t6,dK,pK,fK,mK,n6,o6,lI=R(()=>{nt();Fx();bu();Tm();Nm();Fi=1,Mm=1,Bm="oracle.approval-binding/1",Um="0.28.26+approval-binding.1",qm="oracle.approval-binding.v1",Hx=2e4,zx=Hx,Pj=Object.freeze(["evm-swap","evm-approval","evm-transfer","evm-bridge","nft-mint"]),Lj=Object.freeze(["legacy","eip2930","eip1559"]),$j=Object.freeze(["eip4844","eip7702"]),lK=Object.freeze({custody:"none",execution:"prepare-only",authenticatesApprover:!1,maxExecutions:1,networkIo:!1,signer:!1}),Dj=(1n<<256n)-1n,Vx=new Set(Pj),Mj=new Set(Lj),Bj=Object.freeze({legacy:"legacy","0x0":"legacy",0:"legacy",0:"legacy",eip2930:"eip2930","0x1":"eip2930",1:"eip2930",1:"eip2930",eip1559:"eip1559","0x2":"eip1559",2:"eip1559",2:"eip1559",eip4844:"eip4844","0x3":"eip4844",3:"eip4844",3:"eip4844",eip7702:"eip7702","0x4":"eip7702",4:"eip7702",4:"eip7702"}),Uj=/^(signhash|signature|sig|privatekey|privkey|secret|secretkey|mnemonic|seed|seedphrase|passphrase|password|apikey|authorization|bearer|keystore|wif|xprv)$/i,qj=/(?:hash|digest|checksum|mac|id)$/i,Fm=/^[0-9a-f]{64}$/,Fj=/^0x[0-9a-f]{64}$/,jj=/^0x[0-9a-f]{40}$/,Hj=/^0x(?:[0-9a-f]{2})*$/,zj=/^[^\u0000-\u001f\u007f]+$/,uK=Object.freeze(["allowedChainIds","destinationAllowlist","expiresAtMs","grant","maxDailyValueWei","maxFeePerGasWei","maxGasLimit","maxPriorityFeePerGasWei","maxSlippageBps","maxValuePerTxWei","policyVersion"]),Vj=Object.freeze(["allowedChainIds","destinationAllowlist","expiresAtMs","grantExpiresAtMs","grantId","maxDailyValueWei","maxFeePerGasWei","maxGasLimit","maxPriorityFeePerGasWei","maxSlippageBps","maxValuePerTxWei","policyVersion"]),Wj=Object.freeze(["chainId","destinations"]),Gj=Object.freeze(["accessList","chainId","data","from","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","nonce","to","type","value"]),Kj=Object.freeze(["provider","routeId","venue"]),Yj=Object.freeze(["provider","routeDigest","routeId","venue"]),Wx=Object.freeze(["account","amountIn","amountOut","assetIn","assetOut","minAmountOut","quoteId","recipient","slippageBps","slippageGuardDigest"]),Jj=Object.freeze([...Wx,"quoteDigest"]),Xj=Object.freeze(["balanceDeltasDigest","blockHash","blockNumber","engine","logsDigest","stateOverridesDigest","status"]),Gx=Object.freeze(["builtAtMs","calls","custody","execution","expiresAtMs","policyDigest","postconditions","prepare","previewId","previewVersion","quote","route","simulation","surface"]),Qj=Object.freeze([...Gx,"previewHash"]),Zj=Object.freeze(["approvalTtlMs","bindingVersion","expectedSigner","issuedAtMs","nowMs","preview","requestedExpiresAtMs","resolvedPolicy","sessionExpiresAtMs","tenantId"]),e6=Object.freeze(["approvalTtlMs","grantExpiresAtMs","issuedAtMs","policyExpiresAtMs","prepareExpiresAtMs","previewExpiresAtMs","requestedExpiresAtMs","sessionExpiresAtMs"]),t6=Object.freeze(["bindingVersion","buildVersion","calls","custody","domainSeparator","execution","expectedFrom","expectedSigner","expiresAtMs","expiryBounds","maxExecutions","oneShot","policyDigest","postconditions","prepareHash","previewHash","previewId","quote","route","schemaVersion","simulation","surface","tenantId"]),dK=Object.freeze(["approvalVersion","approver","binding","issuedAtMs","maxExecutions","oneShot"]),pK=Object.freeze(["approvalDigest","approvalId","approvalVersion","approver","binding","custody","execution","expiresAtMs","issuedAtMs","maxExecutions","oneShot","previewId"]),fK=Object.freeze(["kind","ref"]),mK=Object.freeze(["executionCount","expectedApprovalDigest","expectedFrom","nowMs","preview","resolvedPolicy","tenantId"]),n6=Object.freeze(["address","storageKeys"]);o6=new Set(["requiresUserSignature","signingReady","broadcastReady","executionReady","oraclePrepared","prepareHash","prepareMac","prepareVersion","preparedAt","expiresAt","provider","kind","note"])});function w6(e){let t=e instanceof Error?e.message:String(e||"approval preview refused"),n=bt(t,{force:!0}).slice(0,300)||"approval preview refused";return Object.freeze({ok:!0,verdict:"DENY",reasons:Object.freeze([n]),authorization:!1,approvalRequired:!0,queued:!1,signed:!1,broadcast:!1})}function uI(e,t={}){try{if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("approval preview arguments must be an object");let n=Object.keys(e);if(n.length!==1||n[0]!=="bindingInput")throw new TypeError("approval preview requires only bindingInput");if(!e.bindingInput||typeof e.bindingInput!="object"||Array.isArray(e.bindingInput))throw new TypeError("bindingInput must be an object");let o=(t.createApprovalBinding||aI)(e.bindingInput);return Object.freeze({ok:!0,verdict:"ALLOW",reasons:Object.freeze(["exact preview, policy, caps, expiry, and signer binding validated"]),previewHash:o.previewHash,prepareHash:o.prepareHash,policyDigest:o.policyDigest,expiresAtMs:o.expiresAtMs,surface:o.surface,expectedSigner:o.expectedSigner,custody:o.custody,execution:o.execution,oneShot:o.oneShot,maxExecutions:o.maxExecutions,authorization:!1,approvalRequired:!0,queued:!1,signed:!1,broadcast:!1})}catch(n){return w6(n)}}var dI=R(()=>{lI();Yi()});function pI(e){let t=A6[Number(e)]||[];return new Set([...t,...E6].map(n=>String(n).trim().toLowerCase()).filter(Boolean))}var E6,A6,fI=R(()=>{E6=["0x000000000022d473030f116ddee9f6b43ac78ba3"],A6={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Jl(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Vm(e){e&&(e.prepareAttempted=!0)}function Wm(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function I6(e,t=process.env){let n=t&&typeof t=="object"?t:process.env,r=String(n.ORACLE_DEST_ALLOWLIST||n.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...pI(o)]:[];return new Set([...r,...i])}function k6(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function O6(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function _6(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function T6(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function N6(e,t={}){let n=[],r={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:r,errors:["prepared fact must be an object"]};e.signed===!0&&n.push("prepared fact is signed"),e.broadcast===!0&&n.push("prepared fact claims broadcast");for(let o of S6)e[o]&&n.push(`prepared fact carries ${o}`);for(let o of v6)e[o]&&n.push(`prepared fact claims executed ${o}`);if(r.unsigned=n.length===0,O6(e)){let o=_6(e),i=o.to==null?"":String(o.to).trim();if(!i)n.push("prepared transaction is missing destination"),r.destination="missing";else{let s=x6.test(i);if(i.startsWith("0x")&&!s)n.push("prepared destination is not a 20-byte address"),r.destination="malformed";else{let a=I6(o.chainId,t.env),c=i.toLowerCase(),l=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!l?(n.push(`destination ${c} not allowlisted`),r.destination="blocked"):r.destination=a.size===0?"unset":"allowlisted"}}}if(k6(e)){let o=T6(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):Zn;!Number.isInteger(o)||o<0?(n.push("swap prepare is missing integer slippage bps"),r.slippage="missing"):o>Zn||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>Zn?(n.push(`slippage ${o} exceeds cap ${Math.min(i,Zn)}`),r.slippage="blocked"):r.slippage="ok"}return{ok:n.length===0,checks:r,errors:n}}function Gm(e,t){let n=[];e?.execution!=="prepare-only"&&n.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&n.push("lifecycle custody must be none");let r=N6(t);return{ok:n.length===0&&r.ok,checks:r.checks,errors:[...n,...r.errors]}}var S6,v6,x6,mI=R(()=>{fI();fn();S6=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),v6=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),x6=/^0x[a-fA-F0-9]{40}$/});var gI={};Z(gI,{DESK_TOOLS:()=>R6,runDeskTool:()=>L6});function P6(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>C6)throw new TypeError("tool arguments exceed size limit")}function gt(e,t,n=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let r=new Set([...t,...n]);for(let o of Object.keys(e))if(!r.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function L6(e,t,n={}){if(P6(t),e==="approval_preview")return gt(t,["bindingInput"]),(n.evaluateApprovalPreview||uI)(t,n);if(e==="research_artifact"){if(gt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>hI)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(n.createResearchArtifact||Uv)(t)}}if(e==="portfolio_analyze")return gt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(n.summarizePortfolioLedger||Gv)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return gt(t,["input"],["method","asOf"]),{ok:!0,records:(n.createCostBasisRecords||ex)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){gt(t,["action","input","asOf"],["thresholds"]);let r={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(n.evaluatePositionHealth||vm)(t.input,r)};if(t.action==="book")return{ok:!0,analysis:(n.evaluatePositionBook||hx)(t.input,r)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return gt(t,["input","asOf"]),{ok:!0,preview:(n.previewGovernanceAction||yx)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){gt(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let r={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(n.evaluateAddressSafety||_m)(t.input,r)};if(t.action==="transaction")return{ok:!0,analysis:(n.evaluateTransactionSafety||Tx)(t.input,r)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return gt(t,["input"]),{ok:!0,analysis:(n.summarizePortfolioRisk||$l)(t.input)};if(e==="trade_lifecycle"){let r=n.createTradeLifecycle||zl,o=n.advanceTradeLifecycle||Dx,i=n.assertTradeLifecycle||Lm;if(t.action==="create")return gt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:r({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(gt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Vm(n.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Gm(t.lifecycle,s?.fact||{});if(!a.ok)return Wm(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Jl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Jl(n.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(gt(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Vm(n.loopVerifier);let a=Gm(t.lifecycle,t.fact);if(!a.ok)return Wm(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Jl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(gt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let r=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(n.signalsToPrepareIntents||Bx)(t.events,r,{limit:t.limit});let i=(n.scoreSignals||Wl)(t.events,r);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let r=n.openArtifactStore||Lv,o=!n.artifactStore,i=n.artifactStore||await r(n.artifactStoreOptions||{});try{if(t.action==="get")return gt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return gt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return gt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return gt(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var C6,hI,Xl,Mt,Tn,R6,yI=R(()=>{$v();qv();Kv();bm();tx();gx();bx();Nx();$m();Dm();Ux();dI();mI();C6=128*1024,hI=5e4,Xl={type:"string",minLength:1,maxLength:256},Mt={type:"object",additionalProperties:!0},Tn=(e,t,n)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:n})}),R6=Object.freeze([Tn("approval_preview","Validate an exact prepared approval binding and return ALLOW or DENY. Never grants approval, queues, signs, or broadcasts.",{type:"object",properties:{bindingInput:Mt},required:["bindingInput"],additionalProperties:!1}),Tn("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Xl,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Mt,parentId:Xl,childId:Xl},required:["action"],additionalProperties:!1}),Tn("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:hI},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Tn("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Mt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Tn("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:Mt,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),Tn("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:Mt,asOf:{type:"string",minLength:1},thresholds:Mt},required:["action","input","asOf"],additionalProperties:!1}),Tn("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:Mt,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),Tn("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:Mt,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),Tn("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:Mt},required:["input"],additionalProperties:!1}),Tn("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Xl,intent:Mt,lifecycle:Mt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Mt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Tn("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Mt},markouts:{type:"array",maxItems:100,items:Mt},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var bI={};Z(bI,{deployGloballyEnabled:()=>D6,executeGloballyEnabled:()=>$6,mevExecuteEnabled:()=>M6});function $6(){return ha("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function D6(){return ha("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function M6(){return ha("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var wI=R(()=>{ga()});ga();import EI from"node:fs";import Km from"node:process";import{fileURLToPath as B6}from"node:url";import{createInterface as RI}from"node:readline";var Rn=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),PI=/^[A-Za-z0-9_-]{1,64}$/;function ya(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function st(e,t,n){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:n}}}function LI(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function $I(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(t.length>=Rn.maxTools)break;if(!r||typeof r!="object"||Array.isArray(r))continue;let o=typeof r.name=="string"?r.name.trim():"";if(!PI.test(o)||n.has(o))continue;n.add(o);let i=r.inputSchema&&typeof r.inputSchema=="object"&&!Array.isArray(r.inputSchema)?{...r.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...r,name:o,inputSchema:i})}return t}function DI(e){let t=Number(e)||Rn.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Rn.maxCallTimeoutMs)}async function MI(e,t,n){let r;try{return await Promise.race([e,new Promise((o,i)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{n?.()}catch{}},t)})])}finally{clearTimeout(r)}}function BI(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function Wi(e,t,n="arguments",r=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(r>12)return`${n} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>Wi(e,i,n,r+1)===null))return`${n} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>Wi(e,i,n,r+1)===null))return`${n} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${n} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${n} must equal the required constant`;if(t.type){let o=BI(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${n} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${n} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${n} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${n} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${n} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=Wi(e[i],t.items,`${n}[${i}]`,r+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${n} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${n}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${n}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=Wi(e[s],i[s],`${n}.${s}`,r+1);if(a)return a}}return null}function ba(e,t={}){let n=$I(e?.tools),r=new Set(n.map(l=>l.name)),o=new Map(n.map(l=>[l.name,l])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=DI(t.callTimeoutMs),c=!1;return async function(u){let d=u?.id??null;if(!LI(u))return st(d,-32600,"invalid request");if(u.method==="initialize")return c=!0,ya(d,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return ya(d,{});if(!c)return st(d,-32002,"server not initialized");if(u.method==="tools/list")return ya(d,{tools:n});if(u.method==="tools/call"){let p=u.params?.name,f=u.params?.arguments??{};if(typeof p!="string"||!r.has(p))return st(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return st(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return st(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>Rn.maxArgumentBytes)return st(d,-32602,"tool arguments exceeded the size limit");let h=Wi(f,o.get(p)?.inputSchema);if(h)return st(d,-32602,h);try{let g=new AbortController,b=await MI(Promise.resolve(e.call(p,f,{signal:g.signal})),a,()=>g.abort(new Error("tool call timed out")));return ya(d,b)}catch(g){if(g?.code==="ORACLE_MCP_TIMEOUT")return st(d,-32001,"tool call timed out");let b=typeof g?.message=="string"?g.message.replace(/\s+/g," ").trim():"",y=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(b),v=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(b.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return y&&!v&&b.length<=200?st(d,-32e3,`tool call failed: ${b}`):st(d,-32e3,"tool call failed")}}return st(d,-32601,"method not found")}}function nu(e,t={}){let n=t.input||process.stdin,r=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Rn.maxRequestBytes,64),Rn.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||Rn.maxResponseBytes,256),Rn.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||Rn.maxConcurrentCalls,1),Rn.maxConcurrentCalls),a=s*8,c=ba(e,t),l={closed:!1,inflight:0},u=RI({input:n,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function h(){if(l.closed||l.readerClosed)return;let A=l.inflight>=s||p.length>0||m;A&&!f?(f=!0,u.pause(),typeof n.pause=="function"&&n.pause()):!A&&f&&(f=!1,typeof n.resume=="function"&&n.resume(),u.resume())}function g(A){if(!A||l.closed)return;let x=JSON.stringify(A);Buffer.byteLength(x)>i&&(x=JSON.stringify(st(A.id,-32003,"response exceeded the size limit"))),r.write(`${x}
24
24
  `)===!1&&!m&&(m=!0,h(),r.once("drain",()=>{m=!1,y()}))}function b(A){l.inflight+=1,h(),Promise.resolve(c(A)).then(g).catch(()=>g(st(A?.id,-32603,"internal error"))).finally(()=>{l.inflight-=1,y()})}function y(){for(;!l.closed&&!m&&l.inflight<s&&p.length>0;)b(p.shift());h()}function v(){l.closed||(g(st(null,-32700,"request exceeded the size limit")),l.closed=!0,u.close(),typeof n.destroy=="function"&&n.destroy())}return n.on("data",A=>{if(l.closed)return;let x=String(A).split(`
25
25
  `);for(let O=0;O<x.length;O+=1){if(d+=Buffer.byteLength(x[O]),d>o){v();return}O<x.length-1&&(d=0)}}),u.on("line",A=>{if(l.closed)return;if(Buffer.byteLength(A)>o){v();return}let x;try{x=JSON.parse(A)}catch{g(st(null,-32700,"parse error"));return}if(p.length>=a){g(st(x?.id,-32e3,"server busy"));return}p.push(x),y()}),u.on("close",()=>{l.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),l}var eh=Object.freeze(["#7CC4FF","#FFB86B","#8CE99A","#FF8FA3","#C9A6FF","#FFE066","#66D9E8","#FF9F68","#9AD1D4","#D6A2E8","#A0D468","#F7A6C4"]);function Be(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Gi(e,t){let n=String(e??"");return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function UI(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t>>>0}function wa(e){return String(e??"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function nh(e){let t=e&&e.token||{},r=[wa(t.chain),wa(t.address)||wa(t.symbol)||wa(t.name)].filter(Boolean).join("-")||"token",o=JSON.stringify({chain:t.chain??null,address:t.address??null,symbol:t.symbol??null,name:t.name??null}),i=UI(o).toString(36),s=`${r}-${i}`;return s.length>64&&(s=s.slice(0,64)),s=s.replace(/-+$/,""),s||"bubble-map"}function rh(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)<=1?t*100:t:0}function qI(e){return(Array.isArray(e?.nodes)?e.nodes:[]).slice(0,250).map((n,r)=>{let o=n&&n.id!==void 0&&n.id!==null?String(n.id):`node-${r}`,i=n&&n.address!==void 0&&n.address!==null?String(n.address):"",s=n&&n.label!==void 0&&n.label!==null?String(n.label).trim():"";return{id:o,address:i,label:s!==""?s:i||`Node ${r+1}`,share:rh(n?.share),rank:Number.isFinite(Number(n?.rank))?Number(n.rank):r+1,clusterId:n&&n.clusterId!==void 0&&n.clusterId!==null?String(n.clusterId):null}})}function FI(e,t){return(Array.isArray(e?.edges)?e.edges:[]).slice(0,400).map(r=>({source:r&&r.source!==void 0&&r.source!==null?String(r.source):null,target:r&&r.target!==void 0&&r.target!==null?String(r.target):null,value:Number.isFinite(Number(r?.value))?Number(r.value):0,count:Number.isFinite(Number(r?.count))?Number(r.count):0})).filter(r=>r.source&&r.target&&r.source!==r.target&&t.has(r.source)&&t.has(r.target))}function jI(e,t){let n=Array.isArray(e?.clusters)?e.clusters:[],r=new Map;for(let i of n.slice(0,40)){if(!i||i.id===void 0||i.id===null)continue;let s=String(i.id);r.set(s,{id:s,label:i.label!==void 0&&i.label!==null&&String(i.label).trim()!==""?String(i.label):s,share:rh(i.share),holderCount:Number.isFinite(Number(i.holderCount))?Number(i.holderCount):0,members:[]})}for(let i of t){let s=i.clusterId||"uncategorized";r.has(s)||r.set(s,{id:s,label:s==="uncategorized"?"Uncategorized":s,share:0,holderCount:0,members:[]}),r.get(s).members.push(i.id)}let o=Array.from(r.values());for(let i of o)if(i.holderCount=i.holderCount||i.members.length,!i.share){let s=i.members.reduce((a,c)=>{let l=t.find(u=>u.id===c);return a+(l&&Number.isFinite(l.share)?l.share:0)},0);s>0&&(i.share=s)}return o.sort((i,s)=>s.share-i.share||i.id.localeCompare(s.id)),o.forEach((i,s)=>{i.color=eh[s%eh.length]}),o}function HI(e){let t=Number.isFinite(e)&&e>0?e:0,n=Math.sqrt(t)*4.6;return Math.max(7,Math.min(46,n||7))}function zI(e,t){let n=new Map,r=t.length||1,o=new Map(e.map(i=>[i.id,i]));return t.forEach((i,s)=>{let a=r===1?0:2*Math.PI*s/r,c=r===1?320:320+190*Math.cos(a),l=r===1?320:320+190*Math.sin(a),u=i.members.map(d=>o.get(d)).filter(Boolean).sort((d,p)=>d.rank-p.rank||d.id.localeCompare(p.id));u.forEach((d,p)=>{let f=Math.floor(p/7),m=Math.min(7,u.length-f*7),h=p%7,g=f===0&&u.length===1?0:28+f*34,b=2*Math.PI*h/Math.max(1,m)+f*.5+s*.35,y=HI(d.share),v=y+6,A=Math.max(v,Math.min(640-v,c+g*Math.cos(b))),x=Math.max(v,Math.min(640-v,l+g*Math.sin(b)));n.set(d.id,{x:A,y:x,r:y,clusterId:i.id,color:i.color})})}),n}function th(e){let t=Number(e);return Number.isFinite(t)?`${t.toFixed(Math.abs(t)>=10?0:1)}%`:null}function ru(e,t=2){let n=Number(e);return Number.isFinite(n)?n.toFixed(t):null}function VI(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function WI(e){return JSON.stringify(e).replace(/</g,"\\u003c")}function GI(e){if(!e||typeof e!="object"||(Array.isArray(e.nodes)?e.nodes:[]).length===0)return null;let n=qI(e),r=new Set(n.map(B=>B.id)),o=jI(e,n),i=FI(e,r),s=zI(n,o),a=e.token&&typeof e.token=="object"?e.token:{},c=e.metrics&&typeof e.metrics=="object"?e.metrics:{},l=e.source&&typeof e.source=="object"?e.source:{},u=e.coverage&&typeof e.coverage=="object"?e.coverage:{},p=`bm-${nh(e)}`,f=`${p}-viewport`,m=`${p}-data`,h=Gi(a.symbol||a.name||a.address||"TOKEN",24),g=[a.name,a.chain].filter(Boolean).map(B=>Gi(String(B),40)).join(" \xB7 "),b=[["SCORE",ru(c.bubblemapsScore,0)],["GINI",ru(c.giniIndex,2)],["NAKAMOTO",ru(c.nakamotoCoefficient,0)]].filter(([,B])=>B!==null),y=Number.isFinite(Number(u.nodes))?Number(u.nodes):n.length,v=Number.isFinite(Number(u.edges))?Number(u.edges):i.length,A=Number.isFinite(Number(u.clusters))?Number(u.clusters):o.length,x=VI(l.fetchedAt),O=l.provider?Gi(String(l.provider),32):"unknown provider",E=i.map(B=>{let D=s.get(B.source),T=s.get(B.target);if(!D||!T)return"";let P=Math.max(1,Math.min(6,Math.log10(Math.max(1,B.value))*1.6));return`<line data-edge data-edge-source="${Be(B.source)}" data-edge-target="${Be(B.target)}" x1="${D.x.toFixed(1)}" y1="${D.y.toFixed(1)}" x2="${T.x.toFixed(1)}" y2="${T.y.toFixed(1)}" stroke="#8FB6D9" stroke-opacity="0.35" stroke-width="${P.toFixed(1)}"></line>`}).join(""),_=n.map(B=>{let D=s.get(B.id);if(!D)return"";let T=Gi(B.label,18),P=th(B.share)||"",H=`${B.label} \xB7 rank #${B.rank}${P?` \xB7 ${P}`:""}`;return`<g class="bm-node" data-node-id="${Be(B.id)}" data-cluster-id="${Be(D.clusterId)}" tabindex="0" role="button" aria-label="${Be(H)}"><title>${Be(H)}</title><circle cx="${D.x.toFixed(1)}" cy="${D.y.toFixed(1)}" r="${D.r.toFixed(1)}" fill="${D.color}" fill-opacity="0.82" stroke="#0B1018" stroke-width="1.5"></circle><text x="${D.x.toFixed(1)}" y="${(D.y+D.r+12).toFixed(1)}" text-anchor="middle" class="bm-label">${Be(T)}</text></g>`}).join(""),w=o.slice(0,12),S=w.map(B=>`<li><button type="button" class="bm-legend-btn" data-cluster-filter="${Be(B.id)}" aria-pressed="false"><span class="bm-swatch" style="background:${B.color}"></span><span class="bm-legend-label">${Be(Gi(B.label,20))}</span><span class="bm-legend-share">${Be(th(B.share)||"\u2014")}</span></button></li>`).join(""),N=o.length>w.length?`<li class="bm-legend-more">+${o.length-w.length} more</li>`:"",I=b.map(([B,D])=>`<div class="bm-metric"><span>${Be(B)}</span><b>${Be(D)}</b></div>`).join(""),U={nodes:n.map(B=>({id:B.id,clusterId:s.get(B.id)?.clusterId??null})),edges:i.map(B=>({source:B.source,target:B.target})),clusters:o.map(B=>({id:B.id}))};return`<!doctype html><html><head><meta charset="utf-8"><style>:root{color-scheme:dark}*{margin:0;padding:0;box-sizing:border-box}body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#F4F9FE}.bm{max-width:680px;width:100%;background:#0B1018;border:1px solid rgba(124,196,255,.18);border-radius:14px;padding:16px 18px}.bm-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:8px}.bm-title{font-size:16px;letter-spacing:.06em;color:#A7D8FF;font-family:Georgia,serif}.bm-sub{font-size:11px;color:#9FB8D2}.bm-metrics{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:10px}.bm-metric{font-size:11px;display:flex;gap:6px;color:#9FB8D2;border:1px solid rgba(124,196,255,.16);border-radius:8px;padding:3px 8px}.bm-metric b{color:#F4F9FE}.bm-coverage{font-size:10px;color:#6c829c;margin-bottom:10px}.bm-stage{width:100%;aspect-ratio:1/1;max-height:520px;border-radius:10px;overflow:hidden;background:radial-gradient(circle at 50% 40%,rgba(124,196,255,.06),transparent 70%);touch-action:none}.bm-stage svg{width:100%;height:100%;display:block;cursor:grab}.bm-stage svg:active{cursor:grabbing}.bm-label{font-size:9px;fill:#CFE3F7;paint-order:stroke;stroke:#0B1018;stroke-width:3px}.bm-node{cursor:pointer;transition:opacity .15s}.bm-node:hover circle,.bm-node:focus circle,.bm-node.bm-hover circle{stroke:#F4F9FE;stroke-width:2.5}.bm-node.bm-connected circle{stroke:#FFD166;stroke-width:2.5}.bm-node.bm-pinned circle{stroke:#7CC4FF;stroke-width:3}[data-edge]{transition:stroke-opacity .15s}[data-edge].bm-edge-active{stroke:#FFD166;stroke-opacity:.85}.bm-legend{list-style:none;display:flex;gap:8px;flex-wrap:wrap;margin-top:12px;padding:0}.bm-legend-btn{display:flex;align-items:center;gap:6px;background:rgba(124,196,255,.06);border:1px solid rgba(124,196,255,.18);border-radius:20px;padding:4px 10px;font-size:10px;color:#CFE3F7;cursor:pointer;font-family:inherit}.bm-legend-btn[aria-pressed="true"]{border-color:#7CC4FF;background:rgba(124,196,255,.16)}.bm-swatch{width:9px;height:9px;border-radius:50%;flex:none}.bm-legend-share{color:#6c829c}.bm-legend-more{font-size:10px;color:#6c829c;align-self:center}.bm-disclaimer{margin-top:12px;padding-top:10px;border-top:1px solid rgba(124,196,255,.12);font-size:10px;line-height:1.5;color:#9FB8D2}.bm-footer{margin-top:8px;font-size:9px;letter-spacing:.08em;color:#6c829c;display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}@media (max-width:480px){.bm-metrics{gap:8px}.bm-legend{gap:6px}}</style></head><body><div class="bm" id="${Be(p)}" data-bubble-map data-node-count="${n.length}"><div class="bm-head"><span class="bm-title">${Be(h)}</span>${g?`<span class="bm-sub">${Be(g)}</span>`:""}</div>`+(I?`<div class="bm-metrics">${I}</div>`:"")+`<div class="bm-coverage">${y} nodes \xB7 ${v} edges \xB7 ${A} clusters</div><div class="bm-stage"><svg viewBox="0 0 640 640" preserveAspectRatio="xMidYMid meet" role="img" aria-label="${Be(`Bubble map of holder clusters for ${h}`)}"><g id="${Be(f)}"><g data-edges>${E}</g><g data-nodes>${_}</g></g></svg></div>`+(S?`<ul class="bm-legend" role="list" aria-label="Clusters">${S}${N}</ul>`:"")+`<div class="bm-disclaimer">Clusters show transaction and holder relationships derived from on-chain flows. They are NOT identity attribution \u2014 a cluster is not proof of common ownership or control.</div><div class="bm-footer"><span>${Be(O)}</span><span>${x?Be(x):"freshness unknown"}</span></div></div><script type="application/json" id="${Be(m)}">${WI(U)}</script><script>(function(){var root=document.getElementById(${JSON.stringify(p)});if(!root)return;var dataEl=document.getElementById(${JSON.stringify(m)});var payload={nodes:[],edges:[]};try{payload=JSON.parse(dataEl.textContent);}catch(e){}var svg=root.querySelector('svg');var viewport=document.getElementById(${JSON.stringify(f)});var scale=1,tx=0,ty=0,dragging=false,startX=0,startY=0;function applyTransform(){viewport.setAttribute('transform','translate('+tx+','+ty+') scale('+scale+')');}svg.addEventListener('wheel',function(ev){ev.preventDefault();var delta=ev.deltaY>0?0.9:1.1;scale=Math.max(0.5,Math.min(4,scale*delta));applyTransform();},{passive:false});svg.addEventListener('pointerdown',function(ev){dragging=true;startX=ev.clientX-tx;startY=ev.clientY-ty;try{svg.setPointerCapture(ev.pointerId);}catch(e){}});svg.addEventListener('pointermove',function(ev){if(!dragging)return;tx=ev.clientX-startX;ty=ev.clientY-startY;applyTransform();});function endDrag(){dragging=false;}svg.addEventListener('pointerup',endDrag);svg.addEventListener('pointercancel',endDrag);svg.addEventListener('pointerleave',endDrag);var nodeEls=Array.prototype.slice.call(root.querySelectorAll('[data-node-id]'));var nodeById=new Map(nodeEls.map(function(n){return [n.getAttribute('data-node-id'),n];}));var edgeEls=Array.prototype.slice.call(root.querySelectorAll('[data-edge]'));function clearHighlight(){nodeEls.forEach(function(n){n.classList.remove('bm-hover','bm-connected');});edgeEls.forEach(function(e){e.classList.remove('bm-edge-active');});}function highlight(id){clearHighlight();nodeEls.forEach(function(n){if(n.getAttribute('data-node-id')===id)n.classList.add('bm-hover');});edgeEls.forEach(function(e){var s=e.getAttribute('data-edge-source'),t=e.getAttribute('data-edge-target');if(s===id||t===id){e.classList.add('bm-edge-active');nodeEls.forEach(function(n){var nid=n.getAttribute('data-node-id');if(nid===s||nid===t)n.classList.add('bm-connected');});}});}nodeEls.forEach(function(n){n.addEventListener('pointerenter',function(){highlight(n.getAttribute('data-node-id'));});n.addEventListener('pointerleave',clearHighlight);n.addEventListener('focus',function(){highlight(n.getAttribute('data-node-id'));});n.addEventListener('blur',clearHighlight);n.addEventListener('click',function(){var already=n.classList.contains('bm-pinned');nodeEls.forEach(function(x){x.classList.remove('bm-pinned');});if(!already)n.classList.add('bm-pinned');});});var legendBtns=Array.prototype.slice.call(root.querySelectorAll('[data-cluster-filter]'));legendBtns.forEach(function(btn){btn.addEventListener('click',function(){var cid=btn.getAttribute('data-cluster-filter');var active=btn.getAttribute('aria-pressed')==='true';legendBtns.forEach(function(b){b.setAttribute('aria-pressed','false');});nodeEls.forEach(function(n){n.style.opacity='';});edgeEls.forEach(function(e){e.style.opacity='';});if(!active){btn.setAttribute('aria-pressed','true');nodeEls.forEach(function(n){n.style.opacity=n.getAttribute('data-cluster-id')===cid?'1':'.12';});edgeEls.forEach(function(e){var s=e.getAttribute('data-edge-source'),t=e.getAttribute('data-edge-target');var sEl=nodeById.get(s);var tEl=nodeById.get(t);var match=(sEl&&sEl.getAttribute('data-cluster-id')===cid)||(tEl&&tEl.getAttribute('data-cluster-id')===cid);e.style.opacity=match?'1':'.06';});}});});})();</script></body></html>`}function oh(e){let t=GI(e);return t?{type:"resource",resource:{uri:`ui://oracle/bubble-map/${nh(e)}`,mimeType:"text/html",text:t}}:null}var ih=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),KI=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function kr(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Bt(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function Ki(e,t){if(e==null)return null;let n=String(e);if(/^\d{7,}$/.test(n)){let r=Number(t);if(Number.isFinite(r)&&r>0&&r<=36){let o=Number(n)/10**r;if(Number.isFinite(o))return Bt(o)}return`${n} raw`}return Bt(e)}var YI=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function JI(e,t){let n=Number(t);return t!=null&&Number.isFinite(n)?n:YI[String(e||"").toUpperCase()]}function sh(e,t){let n=t&&typeof t=="object"?t:{},r=n.result&&typeof n.result=="object"?n.result:n,o=r;if(r.estimate&&typeof r.estimate=="object"){let c=r.estimate,l=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,u=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:r.tool||r.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:l,feeUsd:u,decimalsOut:r.action?.toToken?.decimals},tokenIn:r.action?.fromToken?.symbol,tokenOut:r.action?.toToken?.symbol}}let i=[],s=(c,l,u={})=>{l==null||l===""||i.push({label:c,value:String(l),...u})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,l=JI(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let u=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=Ki(u,l);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??Ki(d,l),{hero:!0}),s("GROSS OUT",u!==void 0&&d!==void 0&&String(u)!==String(d)?Ki(d,l):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Bt(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Bt(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",Ki(m,l)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let b=Number(d),y=Number(m);Number.isFinite(b)&&Number.isFinite(y)&&b>0&&y>0&&y<=b&&s("SLIPPAGE",`${((1-y/b)*1e4).toFixed(0)} bps max`)}let h=c.meta?.fee??c.poolFee;h!=null&&s("POOL FEE",`${Number(h)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Bt(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let g=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(b=>b!==a).slice(0,3):[];for(let b of g){let y=b?.provider||b?.venue||b?.source,v=Ki(b?.netOut??b?.amountOut??b?.toAmount,l);y&&v&&s(`vs ${y}`,v,{dim:!0})}}else if(e==="portfolio"){let l=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",l!=null?`$${Bt(l)}`:null,{hero:!0});let u=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",u?u.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),u){let f=u.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,h)=>Number(h.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Bt(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Bt(d)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((h,g)=>h+g,0)/f.length;s("AVG ENTRY",`$${Bt(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Bt(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Bt(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let l=(o.buys||o.purchases).map(u=>Number(u?.priceEth??u?.price??u?.costEth)).filter(u=>Number.isFinite(u)&&u>0);l.length>0&&s("AVG BUY",`${Bt(l.reduce((u,d)=>u+d,0)/l.length)} \xB7 ${l.length} buys`)}s("OWNERS",Bt(o.owners??o.numOwners))}return i}function XI(e,t,n){let r=ih[e]||ih.generic,o=sh(e,n),i=o.find(l=>l.hero),s=o.filter(l=>!l.hero),a=kr(JSON.stringify(n,null,2)).slice(0,2e4),c=s.map(l=>`<div class="row${l.dim?" dim":""}${l.warn?" warn":""}"><span>${kr(l.label)}</span><b>${kr(l.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
26
26
  :root{color-scheme:dark}