@oracle-agent/oracle 0.35.49 → 0.35.51

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 (86) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +19 -19
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  15. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  16. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  17. package/dist/bin/oracle-public-server.mjs +5 -5
  18. package/dist/bin/oracle-route.mjs +27 -27
  19. package/dist/bin/oracle-scan.mjs +3 -3
  20. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  21. package/dist/chains.mjs +1 -1
  22. package/dist/cli/commands/account.mjs +22 -22
  23. package/dist/cli/commands/agent-session.mjs +23 -23
  24. package/dist/cli/commands/auth.mjs +16 -15
  25. package/dist/cli/commands/chain.mjs +5 -5
  26. package/dist/cli/commands/chat.mjs +310 -228
  27. package/dist/cli/commands/data.mjs +37 -37
  28. package/dist/cli/commands/doctor.mjs +5 -5
  29. package/dist/cli/commands/eval.mjs +249 -167
  30. package/dist/cli/commands/farm.mjs +1 -1
  31. package/dist/cli/commands/follow.mjs +4 -4
  32. package/dist/cli/commands/harness.mjs +5 -5
  33. package/dist/cli/commands/mint.mjs +11 -11
  34. package/dist/cli/commands/model.mjs +313 -231
  35. package/dist/cli/commands/project.mjs +8 -7
  36. package/dist/cli/commands/quickstart.mjs +2 -2
  37. package/dist/cli/commands/receipt.mjs +2 -2
  38. package/dist/cli/commands/resolve.mjs +4 -4
  39. package/dist/cli/commands/session-vault.mjs +4 -4
  40. package/dist/cli/commands/setup.mjs +53 -52
  41. package/dist/cli/commands/snipe.mjs +13 -13
  42. package/dist/cli/commands/strategy.mjs +5 -5
  43. package/dist/cli/commands/swap.mjs +11 -11
  44. package/dist/cli/commands/telegram.mjs +7 -7
  45. package/dist/cli/commands/venues.mjs +1 -1
  46. package/dist/cli/project-access.mjs +4 -3
  47. package/dist/data/desk-data.mjs +31 -31
  48. package/dist/data/holder-table.mjs +2 -2
  49. package/dist/data/market-tape.mjs +1 -1
  50. package/dist/data/names.mjs +3 -3
  51. package/dist/data/providers/farming.mjs +2 -2
  52. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  53. package/dist/index.mjs +49 -49
  54. package/dist/launch-radar/index.mjs +5 -5
  55. package/dist/lp/index.mjs +4 -4
  56. package/dist/nft/universal-mint-router.mjs +4 -4
  57. package/dist/notifications/index.mjs +1 -1
  58. package/dist/router/index.mjs +3 -3
  59. package/dist/router/prepare-bridge.mjs +2 -2
  60. package/dist/router/prepare-route.mjs +3 -3
  61. package/dist/scanner/index.mjs +3 -3
  62. package/dist/strategy/index.mjs +4 -4
  63. package/dist/task.mjs +1 -1
  64. package/dist/teams/index.mjs +6 -6
  65. package/dist/telegram/chart-card.mjs +5 -5
  66. package/dist/telegram/market-commands.mjs +1 -1
  67. package/dist/tui/standalone-client.mjs +179 -97
  68. package/package.json +2 -2
  69. package/public/oracle-splash/assets/desktop-app.jpg +0 -0
  70. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  71. package/public/oracle-splash/docs/connectors/index.html +2 -2
  72. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  73. package/public/oracle-splash/docs/index.html +3 -3
  74. package/public/oracle-splash/docs/reference/index.html +2 -2
  75. package/public/oracle-splash/docs/security/index.html +2 -2
  76. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  77. package/public/oracle-splash/download/index.html +219 -5
  78. package/public/oracle-splash/downloads/index.html +1 -1
  79. package/public/oracle-splash/eval/index.html +19 -19
  80. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  81. package/public/oracle-splash/index.html +262 -37
  82. package/public/oracle-splash/pricing/index.html +215 -1
  83. package/public/oracle-splash/security/index.html +215 -1
  84. package/public/oracle-splash/what-it-does/index.html +215 -1
  85. package/public/oracle-splash/where-it-works/index.html +215 -1
  86. package/server.json +2 -2
@@ -1 +1 @@
1
- import{createHash as Q}from"node:crypto";var O={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}};var K=new Map(Object.values(O).map(e=>[e.chainId,e]));function I(e){return K.get(Number(e))||null}var W=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),Z=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function Y(e){let t=String(e??"");if(!t)return null;for(let n of W){let r=t.match(n.re);if(r&&!(n.name==="BIP39 seed phrase"&&!Z.test(t))){if(n.name==="private key (hex 64)"){let o=r.index||0,s=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(s)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(s))continue}return{name:n.name,index:r.index??0}}}return null}function H(e,t="content"){let n=Y(e);return n?{ok:!1,error:`${t} refused: looks like a ${n.name}. Never persist credentials, keys, or seed phrases.`}:{ok:!0}}var i="unknown",N=64*1024,U=60,T=200,V=1,F=/^0x[0-9a-f]{40}$/,X=/^0x[0-9a-f]{64}$/,G=Object.freeze({holders:25,tape:25,lpPositions:25}),A=64,v=160;function c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function J(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e=="bigint")return Number(e);if(typeof e=="string"&&e.trim()!==""&&e.trim()!==i){let t=Number(e);return Number.isFinite(t)?t:void 0}}function u(e){let t=J(e);return t===void 0?i:t}function p(e,t=v){if(e==null)return i;if(typeof e=="number"||typeof e=="bigint")return String(e);if(typeof e!="string")return i;let n=e.replace(/[\u0000-\u001f\u007f]/g," ").trim();return n?n.length>t?`${n.slice(0,t-1)}\u2026`:n:i}function _(e){let t=String(e??"").trim().toLowerCase();return F.test(t)?t:i}function ee(e){let t=String(e??"").trim().toLowerCase();return X.test(t)?t:i}function P(e){if(e==null||e==="")return i;let t=new Date(typeof e=="number"?e:String(e));return Number.isFinite(t.getTime())?t.toISOString():i}function L(e){let t=String(e||"").trim().toLowerCase();if(!t)return"";let n=t.startsWith("0x")?t:`0x${t}`;return F.test(n)?n:""}function D(e,t=I){let n=Number(e);if(!Number.isInteger(n)||n<=0)return i;let r=t(n);return r&&r.name?String(r.name):i}function te(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:Array.isArray(e?.top_holders)?e.top_holders:null;if(!t)return null;let n=[];for(let r of t.slice(0,T))c(r)&&n.push({address:_(r.address),label:r.label==null&&r.tag==null?i:p(r.label??r.tag,A),balance:u(r.balance??r.amount),share:u(r.share),usd:u(r.usd??r.valueUsd)});return n}function re(e){let t=te(e);return{rows:t??[],known:t!==null,total:u(c(e)?e.total??e.holderCount??e.count:void 0),top10Share:u(c(e)?e.top10Share:void 0),source:p(c(e)?e.source:void 0,A),asOf:P(c(e)?e.asOf:void 0)}}function ne(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:null;if(!t)return null;let n=[];for(let r of t.slice(0,T)){if(!c(r))continue;let o=r.side==="buy"||r.side==="sell"?r.side:i;n.push({side:o,trader:_(r.trader),txHash:ee(r.txHash),blockNumber:u(r.blockNumber),tokenAmount:u(r.tokenAmount),quoteAmount:u(r.quoteAmount),quoteSymbol:p(r.quoteSymbol,16),usd:u(r.usd),estimated:r.estimated===!0,priceQuote:u(r.priceQuote)})}return n}function oe(e){let t=ne(e);return{rows:t??[],known:t!==null,fromBlock:u(c(e)?e.fromBlock:void 0),toBlock:u(c(e)?e.toBlock:void 0),unpriced:u(c(e)?e.unpriced:void 0),truncated:c(e)&&e.truncated===!0,source:p(c(e)?e.source:void 0,A)}}function se(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:Array.isArray(e?.positions)?e.positions:null,n=[];for(let r of(t??[]).slice(0,T))c(r)&&n.push({pool:_(r.pool??r.poolId),owner:_(r.owner),venue:p(r.venue,A),tokenAmount:u(r.tokenAmount??r.amountToken),quoteAmount:u(r.quoteAmount??r.amountQuote),usd:u(r.usd??r.valueUsd),inRange:typeof r.inRange=="boolean"?r.inRange:i,range:p(r.range,A)});return{rows:n,known:t!==null}}function ie(e){return typeof e=="string"?{status:p(e,32),condition:i,since:i,lastCheckedAt:i}:{status:p(c(e)?e.status:void 0,32),condition:p(c(e)?e.condition:void 0,v),since:P(c(e)?e.since:void 0),lastCheckedAt:P(c(e)?e.lastCheckedAt:void 0)}}function ae(e){return Array.isArray(e)?e.slice(0,16).map(t=>c(t)?{reader:p(t.reader,32),error:p(t.error,v)}:{reader:i,error:p(t,v)}):[]}function z(e={},{chainId:t,token:n}={}){let r=c(e)?e:{},o=c(r.supply)?r.supply:null;return{version:V,chainId:Number.isInteger(Number(t??r.chainId))&&Number(t??r.chainId)>0?Number(t??r.chainId):i,token:L(n??r.token)||i,symbol:p(r.symbol,32),name:p(r.name,A),price:u(r.price??r.priceUsd),poolPriceQuote:u(r.poolPriceQuote),quoteSymbol:p(r.quoteSymbol,16),supply:u(o?o.total:r.supply),supplyDelta7d:u(o?o.delta7d:r.supplyDelta7d),holders:re(r.holders),tape:oe(r.tape),lpPositions:se(r.lpPositions??r.lp),watch:ie(r.watch??r.watchStatus),generatedAt:P(r.generatedAt),errors:ae(r.errors)}}var ce=Object.freeze(["price","supply","holders","tape","lpPositions","watch"]);function le(e){let t=e instanceof Error?e.message:String(e??"error");return p(t,v)}async function de({chainId:e,token:t,readers:n,now:r=Date.now}={}){let o=Number(e);if(!Number.isInteger(o)||o<=0)throw new TypeError("collectTokenSnapshot needs a positive integer chainId");let s=L(t);if(!s)throw new TypeError("collectTokenSnapshot needs a 0x token address (resolve symbols first)");if(!c(n))throw new TypeError("collectTokenSnapshot needs an injected readers object");let a=Object.freeze({chainId:o,token:s}),w=[],l={};await Promise.all(ce.map(async b=>{let f=n[b];if(typeof f!="function"){l[b]=void 0,w.push({reader:b,error:"reader not provided"});return}try{l[b]=await f(a)}catch(S){l[b]=void 0,w.push({reader:b,error:le(S)})}}));let y=l.price,m=c(y)?y:null,k=c(n.meta)?n.meta:{},x={symbol:m?.symbol??k.symbol,name:m?.name??k.name,price:m?m.usd??m.price:y,poolPriceQuote:m?.poolPriceQuote,quoteSymbol:m?.quoteSymbol,supply:l.supply,holders:l.holders,tape:l.tape,lpPositions:l.lpPositions,watch:l.watch,generatedAt:new Date(r()).toISOString(),errors:w};return z(x,{chainId:o,token:s})}var ue={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function d(e){return String(e??"").replace(/[&<>"']/g,t=>ue[t])}function g(e,{digits:t=2,prefix:n="",suffix:r=""}={}){if(typeof e!="number"||!Number.isFinite(e))return i;let o=Math.abs(e),s;return o>=1e9?s=`${(e/1e9).toFixed(2)}B`:o>=1e6?s=`${(e/1e6).toFixed(2)}M`:o>=1e3?s=e.toLocaleString("en-US",{maximumFractionDigits:t}):o>0&&o<1e-4?s=e.toExponential(3):s=e.toLocaleString("en-US",{maximumFractionDigits:o<1?6:t}),`${n}${s}${r}`}function C(e){return g(e,{prefix:"$"})}function q(e){return typeof e=="number"&&Number.isFinite(e)?`${(e*100).toFixed(2)}%`:i}function he(e){return typeof e!="number"||!Number.isFinite(e)?i:`${e>0?"+":""}${g(e)}`}function E(e){return e===i?i:e.length>14?`${e.slice(0,6)}\u2026${e.slice(-4)}`:e}function j(e){return e===i?' class="unk"':""}function h(e,{field:t,align:n}={}){return`<td${`${j(e)}${t?` data-f="${d(t)}"`:""}${n?` style="text-align:${n}"`:""}`}>${d(e)}</td>`}function pe(e){if(e==null)return null;let t=String(e).trim();if(!t)return null;if(/^[a-z][a-z0-9+.-]*:/i.test(t)||t.startsWith("//")||t.startsWith("\\"))throw new TypeError("refreshUrl must be a same-origin relative path (no scheme, no //)");if(/[\u0000-\u001f\u007f<>"'`\s]/.test(t))throw new TypeError("refreshUrl contains forbidden characters");return t}function fe(e,t){let n=JSON.stringify(e),r=Math.max(5,Math.floor(t))*1e3;return["(function(){",`var U=${n},MS=${r},K="${i}";`,"function num(v){return typeof v==='number'&&isFinite(v);}","function f(v,kind){if(kind==='usd')return num(v)?'$'+v.toLocaleString('en-US',{maximumFractionDigits:2}):K;","if(kind==='pct')return num(v)?(v*100).toFixed(2)+'%':K;","if(kind==='signed')return num(v)?(v>0?'+':'')+v.toLocaleString('en-US',{maximumFractionDigits:2}):K;","if(num(v))return v.toLocaleString('en-US',{maximumFractionDigits:6});","return typeof v==='string'&&v?v:K;}","function get(o,p){var parts=p.split('.');for(var i=0;i<parts.length;i++){if(o==null)return undefined;o=o[parts[i]];}return o;}","function apply(s){var els=document.querySelectorAll('[data-f]');for(var i=0;i<els.length;i++){var el=els[i];","var v=get(s,el.getAttribute('data-f'));var t=f(v,el.getAttribute('data-k')||'');el.textContent=t;","if(t===K)el.classList.add('unk');else el.classList.remove('unk');}","var st=document.getElementById('refresh-state');if(st)st.textContent='live \xB7 refreshed '+new Date().toISOString();}","function tick(){fetch(U,{credentials:'same-origin',cache:'no-store'}).then(function(r){if(!r.ok)throw new Error('http '+r.status);return r.json();})",".then(apply).catch(function(){var st=document.getElementById('refresh-state');if(st)st.textContent='refresh failed \xB7 showing last snapshot';});}","setInterval(tick,MS);","})();"].join("")}var me=[":root{color-scheme:dark}","body{margin:0;background:#0b0d12;color:#e6e8ee;font:14px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}","main{max-width:1080px;margin:0 auto;padding:20px}","header{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:baseline;border-bottom:1px solid #222836;padding-bottom:12px;margin-bottom:16px}","h1{font-size:18px;margin:0}h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase;color:#8b93a7;margin:20px 0 8px}",".muted{color:#8b93a7}.unk{color:#8b93a7;font-style:italic}.pos{color:#3ddc97}.neg{color:#ff6b6b}",".grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}",".kv{background:#121620;border:1px solid #222836;border-radius:8px;padding:10px 12px}",".kv .k{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#8b93a7}.kv .v{font-size:17px;margin-top:2px;word-break:break-all}","table{width:100%;border-collapse:collapse;background:#121620;border:1px solid #222836;border-radius:8px;overflow:hidden}","th,td{padding:6px 10px;text-align:left;border-bottom:1px solid #1c2130;white-space:nowrap}th{color:#8b93a7;font-weight:normal;font-size:12px}","tr:last-child td{border-bottom:0}.addr{font-size:12px}","footer{margin-top:24px;color:#8b93a7;font-size:12px;border-top:1px solid #222836;padding-top:10px}",".pill{display:inline-block;padding:1px 8px;border-radius:999px;border:1px solid #2a3142;font-size:12px}"].join("");function $(e,t,{field:n,kind:r,cssClass:o}={}){let s=`${n?` data-f="${d(n)}"`:""}${r?` data-k="${r}"`:""}`,a=["v",t===i?"unk":"",o||""].filter(Boolean).join(" ");return`<div class="kv"><div class="k">${d(e)}</div><div class="${a}"${s}>${d(t)}</div></div>`}function M(e,t,n,r){if(!n)return`<p class="unk">${i} \u2014 no reader answered for this section</p>`;if(t===0)return'<p class="muted">none observed</p>';let o=t>e?` \xB7 showing ${e} of ${t}`:"";return`<p class="muted">${t} row${t===1?"":"s"}${o}${r?" \xB7 source window truncated":""}</p>`}function be(e,t){let n=e.rows.slice(0,t),r=n.map((s,a)=>`<tr><td>${a+1}</td>${h(E(s.address))}${h(s.label)}${h(g(s.balance),{align:"right"})}${h(q(s.share),{align:"right"})}${h(C(s.usd),{align:"right"})}</tr>`).join(""),o=n.length?`<table><thead><tr><th>#</th><th>holder</th><th>label</th><th style="text-align:right">balance</th><th style="text-align:right">share</th><th style="text-align:right">usd</th></tr></thead><tbody>${r}</tbody></table>`:"";return`${M(n.length,e.rows.length,e.known,!1)}${o}`}function ge(e,t){let n=e.rows.slice(0,t),r=n.map(a=>{let w=a.side==="buy"?"pos":a.side==="sell"?"neg":"unk",l=C(a.usd);return`<tr><td class="${w}">${d(a.side)}</td>${h(E(a.trader))}${h(g(a.tokenAmount),{align:"right"})}${h(a.quoteAmount===i?i:`${g(a.quoteAmount)} ${a.quoteSymbol}`,{align:"right"})}${h(l===i?i:`${l}${a.estimated?" ~":""}`,{align:"right"})}${h(E(a.txHash))}</tr>`}).join(""),o=n.length?`<table><thead><tr><th>side</th><th>trader</th><th style="text-align:right">token</th><th style="text-align:right">quote</th><th style="text-align:right">usd</th><th>tx</th></tr></thead><tbody>${r}</tbody></table>`:"",s=e.fromBlock!==i&&e.toBlock!==i?`<p class="muted">blocks ${e.fromBlock}\u2013${e.toBlock} \xB7 unpriced buys: ${d(String(e.unpriced))}</p>`:"";return`${M(n.length,e.rows.length,e.known,e.truncated)}${s}${o}`}function ye(e,t){let n=e.rows.slice(0,t),r=n.map(s=>`<tr>${h(E(s.pool))}${h(s.venue)}${h(E(s.owner))}${h(g(s.tokenAmount),{align:"right"})}${h(g(s.quoteAmount),{align:"right"})}${h(C(s.usd),{align:"right"})}${h(s.inRange===i?i:s.inRange?"in range":"out of range")}${h(s.range)}</tr>`).join(""),o=n.length?`<table><thead><tr><th>pool</th><th>venue</th><th>owner</th><th style="text-align:right">token</th><th style="text-align:right">quote</th><th style="text-align:right">usd</th><th>status</th><th>range</th></tr></thead><tbody>${r}</tbody></table>`:"";return`${M(n.length,e.rows.length,e.known,!1)}${o}`}function we(e,{chainName:t,title:n,refreshUrl:r,refreshSeconds:o,limits:s}){let a=r?fe(r,o):"",l=`default-src 'none'; style-src 'unsafe-inline'; script-src ${a?`'sha256-${Q("sha256").update(a,"utf8").digest("base64")}'`:"'none'"}; connect-src ${r?"'self'":"'none'"}; img-src data:; base-uri 'none'; form-action 'none'`,y=!r&&o>0?`<meta http-equiv="refresh" content="${Math.max(5,Math.floor(o))}">`:"",m=r?`<link rel="alternate" type="application/json" href="${d(r)}">`:"",k=n||`${e.symbol===i?E(e.token):e.symbol} \xB7 ${t}`,x=e.supplyDelta7d,b=typeof x=="number"?x>0?"pos":x<0?"neg":"":"",f=e.watch.status==="armed"?"pos":e.watch.status==="triggered"?"neg":"",S=e.errors.length?`<h2>Reader gaps</h2><ul class="muted">${e.errors.map(B=>`<li>${d(B.reader)}: ${d(B.error)}</li>`).join("")}</ul>`:"",R=r?`live \xB7 polling ${d(r)} every ${Math.max(5,Math.floor(o))}s`:y?`page reloads every ${Math.max(5,Math.floor(o))}s`:"static snapshot";return`<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="Content-Security-Policy" content="${d(l)}"><meta name="referrer" content="no-referrer">${y}${m}<title>${d(k)}</title><style>${me}</style></head><body><main><header><h1>${d(k)}</h1><span class="pill">${d(t)} \xB7 chain ${d(String(e.chainId))}</span><span class="addr muted">${d(e.token)}</span><span class="muted" id="refresh-state">${R}</span></header><div class="grid">`+$("price (usd)",C(e.price),{field:"price",kind:"usd"})+$(`pool price (${e.quoteSymbol})`,g(e.poolPriceQuote,{digits:8}),{field:"poolPriceQuote"})+$("supply",g(e.supply),{field:"supply"})+$("supply \u0394 7d",he(x),{field:"supplyDelta7d",kind:"signed",cssClass:b})+$("holders",g(e.holders.total,{digits:0}),{field:"holders.total"})+$("top-10 share",q(e.holders.top10Share),{field:"holders.top10Share",kind:"pct"})+$("watch",e.watch.status,{field:"watch.status",cssClass:f})+$("watch condition",e.watch.condition,{field:"watch.condition"})+`</div><h2>Biggest buys</h2>${ge(e.tape,s.tape)}<h2>Holders</h2>${be(e.holders,s.holders)}<h2>LP positions</h2>${ye(e.lpPositions,s.lpPositions)}`+S+`<footer>generated <span data-f="generatedAt"${j(e.generatedAt)}>${d(e.generatedAt)}</span> \xB7 holders source ${d(e.holders.source)} \xB7 tape source ${d(e.tape.source)} \xB7 read-only \xB7 nothing on this page signs or executes</footer></main>${a?`<script>${a}</script>`:""}</body></html>`}function xe({chainId:e,token:t,snapshot:n,refreshUrl:r,refreshSeconds:o=U,title:s,maxBytes:a=N,chainLookup:w}={}){let l=z(n,{chainId:e,token:t});if(l.token===i)throw new TypeError("buildTokenDashboard needs a 0x token address");let y=D(l.chainId,w||I),m=pe(r),k=Number.isFinite(Number(o))?Number(o):U,x=s==null?void 0:p(s,A),b=H(JSON.stringify(l),"token dashboard snapshot");if(!b.ok)throw new Error(b.error);let f={...G};for(;;){let S=we(l,{chainName:y,title:x,refreshUrl:m,refreshSeconds:k,limits:f}),R=Buffer.byteLength(S,"utf8");if(R<=a)return{html:S,json:l,bytes:R,rowLimits:f,chainName:y};if(f.holders===0&&f.tape===0&&f.lpPositions===0)throw new RangeError(`token dashboard exceeds ${a} bytes even with no table rows (${R} bytes)`);f={holders:Math.floor(f.holders/2),tape:Math.floor(f.tape/2),lpPositions:Math.floor(f.lpPositions/2)}}}function $e(e){let t=String(e),n=[];/<script\b[^>]*\ssrc\s*=/i.test(t)&&n.push("external script");for(let r of t.matchAll(/<script\b[^>]*>([\s\S]*?)<\/script>/gi))/\beval\s*\(/.test(r[1])&&n.push("eval("),/\bFunction\s*\(/.test(r[1])&&n.push("Function("),/innerHTML|outerHTML|document\.write/.test(r[1])&&n.push("html sink in script");return/<[a-z][^>]*\son[a-z]+\s*=/i.test(t)&&n.push("inline event handler"),/<[a-z][^>]*\s(?:href|src|action)\s*=\s*["']?\s*javascript:/i.test(t)&&n.push("javascript: url"),/<link\b[^>]*rel=["']?stylesheet/i.test(t)&&n.push("external stylesheet"),/<(?:iframe|object|embed)\b/i.test(t)&&n.push("embedded frame"),/http-equiv="Content-Security-Policy"/.test(t)||n.push("missing CSP"),Buffer.byteLength(t,"utf8")>N&&n.push("over size cap"),{ok:n.length===0,problems:n}}var Pe={buildTokenDashboard:xe,collectTokenSnapshot:de,normalizeSnapshot:z,auditDashboardHtml:$e,chainNameFor:D,normalizeToken:L,UNKNOWN:i,MAX_HTML_BYTES:N};export{V as DASHBOARD_VERSION,U as DEFAULT_REFRESH_SECONDS,N as MAX_HTML_BYTES,T as MAX_SNAPSHOT_ROWS,i as UNKNOWN,$e as auditDashboardHtml,xe as buildTokenDashboard,D as chainNameFor,de as collectTokenSnapshot,Pe as default,d as escapeHtml,z as normalizeSnapshot,L as normalizeToken};
1
+ import{createHash as Q}from"node:crypto";var U={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var K=new Map(Object.values(U).map(e=>[e.chainId,e]));function N(e){return K.get(Number(e))||null}var W=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),Y=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function Z(e){let t=String(e??"");if(!t)return null;for(let n of W){let r=t.match(n.re);if(r&&!(n.name==="BIP39 seed phrase"&&!Y.test(t))){if(n.name==="private key (hex 64)"){let o=r.index||0,s=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(s)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(s))continue}return{name:n.name,index:r.index??0}}}return null}function B(e,t="content"){let n=Z(e);return n?{ok:!1,error:`${t} refused: looks like a ${n.name}. Never persist credentials, keys, or seed phrases.`}:{ok:!0}}var i="unknown",I=64*1024,H=60,T=200,V=1,D=/^0x[0-9a-f]{40}$/,X=/^0x[0-9a-f]{64}$/,G=Object.freeze({holders:25,tape:25,lpPositions:25}),S=64,v=160;function c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function J(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e=="bigint")return Number(e);if(typeof e=="string"&&e.trim()!==""&&e.trim()!==i){let t=Number(e);return Number.isFinite(t)?t:void 0}}function d(e){let t=J(e);return t===void 0?i:t}function p(e,t=v){if(e==null)return i;if(typeof e=="number"||typeof e=="bigint")return String(e);if(typeof e!="string")return i;let n=e.replace(/[\u0000-\u001f\u007f]/g," ").trim();return n?n.length>t?`${n.slice(0,t-1)}\u2026`:n:i}function P(e){let t=String(e??"").trim().toLowerCase();return D.test(t)?t:i}function ee(e){let t=String(e??"").trim().toLowerCase();return X.test(t)?t:i}function _(e){if(e==null||e==="")return i;let t=new Date(typeof e=="number"?e:String(e));return Number.isFinite(t.getTime())?t.toISOString():i}function L(e){let t=String(e||"").trim().toLowerCase();if(!t)return"";let n=t.startsWith("0x")?t:`0x${t}`;return D.test(n)?n:""}function F(e,t=N){let n=Number(e);if(!Number.isInteger(n)||n<=0)return i;let r=t(n);return r&&r.name?String(r.name):i}function te(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:Array.isArray(e?.top_holders)?e.top_holders:null;if(!t)return null;let n=[];for(let r of t.slice(0,T))c(r)&&n.push({address:P(r.address),label:r.label==null&&r.tag==null?i:p(r.label??r.tag,S),balance:d(r.balance??r.amount),share:d(r.share),usd:d(r.usd??r.valueUsd)});return n}function re(e){let t=te(e);return{rows:t??[],known:t!==null,total:d(c(e)?e.total??e.holderCount??e.count:void 0),top10Share:d(c(e)?e.top10Share:void 0),source:p(c(e)?e.source:void 0,S),asOf:_(c(e)?e.asOf:void 0)}}function ne(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:null;if(!t)return null;let n=[];for(let r of t.slice(0,T)){if(!c(r))continue;let o=r.side==="buy"||r.side==="sell"?r.side:i;n.push({side:o,trader:P(r.trader),txHash:ee(r.txHash),blockNumber:d(r.blockNumber),tokenAmount:d(r.tokenAmount),quoteAmount:d(r.quoteAmount),quoteSymbol:p(r.quoteSymbol,16),usd:d(r.usd),estimated:r.estimated===!0,priceQuote:d(r.priceQuote)})}return n}function oe(e){let t=ne(e);return{rows:t??[],known:t!==null,fromBlock:d(c(e)?e.fromBlock:void 0),toBlock:d(c(e)?e.toBlock:void 0),unpriced:d(c(e)?e.unpriced:void 0),truncated:c(e)&&e.truncated===!0,source:p(c(e)?e.source:void 0,S)}}function se(e){let t=Array.isArray(e)?e:Array.isArray(e?.rows)?e.rows:Array.isArray(e?.positions)?e.positions:null,n=[];for(let r of(t??[]).slice(0,T))c(r)&&n.push({pool:P(r.pool??r.poolId),owner:P(r.owner),venue:p(r.venue,S),tokenAmount:d(r.tokenAmount??r.amountToken),quoteAmount:d(r.quoteAmount??r.amountQuote),usd:d(r.usd??r.valueUsd),inRange:typeof r.inRange=="boolean"?r.inRange:i,range:p(r.range,S)});return{rows:n,known:t!==null}}function ie(e){return typeof e=="string"?{status:p(e,32),condition:i,since:i,lastCheckedAt:i}:{status:p(c(e)?e.status:void 0,32),condition:p(c(e)?e.condition:void 0,v),since:_(c(e)?e.since:void 0),lastCheckedAt:_(c(e)?e.lastCheckedAt:void 0)}}function ae(e){return Array.isArray(e)?e.slice(0,16).map(t=>c(t)?{reader:p(t.reader,32),error:p(t.error,v)}:{reader:i,error:p(t,v)}):[]}function O(e={},{chainId:t,token:n}={}){let r=c(e)?e:{},o=c(r.supply)?r.supply:null;return{version:V,chainId:Number.isInteger(Number(t??r.chainId))&&Number(t??r.chainId)>0?Number(t??r.chainId):i,token:L(n??r.token)||i,symbol:p(r.symbol,32),name:p(r.name,S),price:d(r.price??r.priceUsd),poolPriceQuote:d(r.poolPriceQuote),quoteSymbol:p(r.quoteSymbol,16),supply:d(o?o.total:r.supply),supplyDelta7d:d(o?o.delta7d:r.supplyDelta7d),holders:re(r.holders),tape:oe(r.tape),lpPositions:se(r.lpPositions??r.lp),watch:ie(r.watch??r.watchStatus),generatedAt:_(r.generatedAt),errors:ae(r.errors)}}var ce=Object.freeze(["price","supply","holders","tape","lpPositions","watch"]);function le(e){let t=e instanceof Error?e.message:String(e??"error");return p(t,v)}async function ue({chainId:e,token:t,readers:n,now:r=Date.now}={}){let o=Number(e);if(!Number.isInteger(o)||o<=0)throw new TypeError("collectTokenSnapshot needs a positive integer chainId");let s=L(t);if(!s)throw new TypeError("collectTokenSnapshot needs a 0x token address (resolve symbols first)");if(!c(n))throw new TypeError("collectTokenSnapshot needs an injected readers object");let a=Object.freeze({chainId:o,token:s}),w=[],l={};await Promise.all(ce.map(async b=>{let m=n[b];if(typeof m!="function"){l[b]=void 0,w.push({reader:b,error:"reader not provided"});return}try{l[b]=await m(a)}catch(A){l[b]=void 0,w.push({reader:b,error:le(A)})}}));let y=l.price,f=c(y)?y:null,k=c(n.meta)?n.meta:{},x={symbol:f?.symbol??k.symbol,name:f?.name??k.name,price:f?f.usd??f.price:y,poolPriceQuote:f?.poolPriceQuote,quoteSymbol:f?.quoteSymbol,supply:l.supply,holders:l.holders,tape:l.tape,lpPositions:l.lpPositions,watch:l.watch,generatedAt:new Date(r()).toISOString(),errors:w};return O(x,{chainId:o,token:s})}var de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function u(e){return String(e??"").replace(/[&<>"']/g,t=>de[t])}function g(e,{digits:t=2,prefix:n="",suffix:r=""}={}){if(typeof e!="number"||!Number.isFinite(e))return i;let o=Math.abs(e),s;return o>=1e9?s=`${(e/1e9).toFixed(2)}B`:o>=1e6?s=`${(e/1e6).toFixed(2)}M`:o>=1e3?s=e.toLocaleString("en-US",{maximumFractionDigits:t}):o>0&&o<1e-4?s=e.toExponential(3):s=e.toLocaleString("en-US",{maximumFractionDigits:o<1?6:t}),`${n}${s}${r}`}function C(e){return g(e,{prefix:"$"})}function q(e){return typeof e=="number"&&Number.isFinite(e)?`${(e*100).toFixed(2)}%`:i}function he(e){return typeof e!="number"||!Number.isFinite(e)?i:`${e>0?"+":""}${g(e)}`}function E(e){return e===i?i:e.length>14?`${e.slice(0,6)}\u2026${e.slice(-4)}`:e}function j(e){return e===i?' class="unk"':""}function h(e,{field:t,align:n}={}){return`<td${`${j(e)}${t?` data-f="${u(t)}"`:""}${n?` style="text-align:${n}"`:""}`}>${u(e)}</td>`}function pe(e){if(e==null)return null;let t=String(e).trim();if(!t)return null;if(/^[a-z][a-z0-9+.-]*:/i.test(t)||t.startsWith("//")||t.startsWith("\\"))throw new TypeError("refreshUrl must be a same-origin relative path (no scheme, no //)");if(/[\u0000-\u001f\u007f<>"'`\s]/.test(t))throw new TypeError("refreshUrl contains forbidden characters");return t}function me(e,t){let n=JSON.stringify(e),r=Math.max(5,Math.floor(t))*1e3;return["(function(){",`var U=${n},MS=${r},K="${i}";`,"function num(v){return typeof v==='number'&&isFinite(v);}","function f(v,kind){if(kind==='usd')return num(v)?'$'+v.toLocaleString('en-US',{maximumFractionDigits:2}):K;","if(kind==='pct')return num(v)?(v*100).toFixed(2)+'%':K;","if(kind==='signed')return num(v)?(v>0?'+':'')+v.toLocaleString('en-US',{maximumFractionDigits:2}):K;","if(num(v))return v.toLocaleString('en-US',{maximumFractionDigits:6});","return typeof v==='string'&&v?v:K;}","function get(o,p){var parts=p.split('.');for(var i=0;i<parts.length;i++){if(o==null)return undefined;o=o[parts[i]];}return o;}","function apply(s){var els=document.querySelectorAll('[data-f]');for(var i=0;i<els.length;i++){var el=els[i];","var v=get(s,el.getAttribute('data-f'));var t=f(v,el.getAttribute('data-k')||'');el.textContent=t;","if(t===K)el.classList.add('unk');else el.classList.remove('unk');}","var st=document.getElementById('refresh-state');if(st)st.textContent='live \xB7 refreshed '+new Date().toISOString();}","function tick(){fetch(U,{credentials:'same-origin',cache:'no-store'}).then(function(r){if(!r.ok)throw new Error('http '+r.status);return r.json();})",".then(apply).catch(function(){var st=document.getElementById('refresh-state');if(st)st.textContent='refresh failed \xB7 showing last snapshot';});}","setInterval(tick,MS);","})();"].join("")}var fe=[":root{color-scheme:dark}","body{margin:0;background:#0b0d12;color:#e6e8ee;font:14px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}","main{max-width:1080px;margin:0 auto;padding:20px}","header{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:baseline;border-bottom:1px solid #222836;padding-bottom:12px;margin-bottom:16px}","h1{font-size:18px;margin:0}h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase;color:#8b93a7;margin:20px 0 8px}",".muted{color:#8b93a7}.unk{color:#8b93a7;font-style:italic}.pos{color:#3ddc97}.neg{color:#ff6b6b}",".grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}",".kv{background:#121620;border:1px solid #222836;border-radius:8px;padding:10px 12px}",".kv .k{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#8b93a7}.kv .v{font-size:17px;margin-top:2px;word-break:break-all}","table{width:100%;border-collapse:collapse;background:#121620;border:1px solid #222836;border-radius:8px;overflow:hidden}","th,td{padding:6px 10px;text-align:left;border-bottom:1px solid #1c2130;white-space:nowrap}th{color:#8b93a7;font-weight:normal;font-size:12px}","tr:last-child td{border-bottom:0}.addr{font-size:12px}","footer{margin-top:24px;color:#8b93a7;font-size:12px;border-top:1px solid #222836;padding-top:10px}",".pill{display:inline-block;padding:1px 8px;border-radius:999px;border:1px solid #2a3142;font-size:12px}"].join("");function $(e,t,{field:n,kind:r,cssClass:o}={}){let s=`${n?` data-f="${u(n)}"`:""}${r?` data-k="${r}"`:""}`,a=["v",t===i?"unk":"",o||""].filter(Boolean).join(" ");return`<div class="kv"><div class="k">${u(e)}</div><div class="${a}"${s}>${u(t)}</div></div>`}function M(e,t,n,r){if(!n)return`<p class="unk">${i} \u2014 no reader answered for this section</p>`;if(t===0)return'<p class="muted">none observed</p>';let o=t>e?` \xB7 showing ${e} of ${t}`:"";return`<p class="muted">${t} row${t===1?"":"s"}${o}${r?" \xB7 source window truncated":""}</p>`}function be(e,t){let n=e.rows.slice(0,t),r=n.map((s,a)=>`<tr><td>${a+1}</td>${h(E(s.address))}${h(s.label)}${h(g(s.balance),{align:"right"})}${h(q(s.share),{align:"right"})}${h(C(s.usd),{align:"right"})}</tr>`).join(""),o=n.length?`<table><thead><tr><th>#</th><th>holder</th><th>label</th><th style="text-align:right">balance</th><th style="text-align:right">share</th><th style="text-align:right">usd</th></tr></thead><tbody>${r}</tbody></table>`:"";return`${M(n.length,e.rows.length,e.known,!1)}${o}`}function ge(e,t){let n=e.rows.slice(0,t),r=n.map(a=>{let w=a.side==="buy"?"pos":a.side==="sell"?"neg":"unk",l=C(a.usd);return`<tr><td class="${w}">${u(a.side)}</td>${h(E(a.trader))}${h(g(a.tokenAmount),{align:"right"})}${h(a.quoteAmount===i?i:`${g(a.quoteAmount)} ${a.quoteSymbol}`,{align:"right"})}${h(l===i?i:`${l}${a.estimated?" ~":""}`,{align:"right"})}${h(E(a.txHash))}</tr>`}).join(""),o=n.length?`<table><thead><tr><th>side</th><th>trader</th><th style="text-align:right">token</th><th style="text-align:right">quote</th><th style="text-align:right">usd</th><th>tx</th></tr></thead><tbody>${r}</tbody></table>`:"",s=e.fromBlock!==i&&e.toBlock!==i?`<p class="muted">blocks ${e.fromBlock}\u2013${e.toBlock} \xB7 unpriced buys: ${u(String(e.unpriced))}</p>`:"";return`${M(n.length,e.rows.length,e.known,e.truncated)}${s}${o}`}function ye(e,t){let n=e.rows.slice(0,t),r=n.map(s=>`<tr>${h(E(s.pool))}${h(s.venue)}${h(E(s.owner))}${h(g(s.tokenAmount),{align:"right"})}${h(g(s.quoteAmount),{align:"right"})}${h(C(s.usd),{align:"right"})}${h(s.inRange===i?i:s.inRange?"in range":"out of range")}${h(s.range)}</tr>`).join(""),o=n.length?`<table><thead><tr><th>pool</th><th>venue</th><th>owner</th><th style="text-align:right">token</th><th style="text-align:right">quote</th><th style="text-align:right">usd</th><th>status</th><th>range</th></tr></thead><tbody>${r}</tbody></table>`:"";return`${M(n.length,e.rows.length,e.known,!1)}${o}`}function we(e,{chainName:t,title:n,refreshUrl:r,refreshSeconds:o,limits:s}){let a=r?me(r,o):"",l=`default-src 'none'; style-src 'unsafe-inline'; script-src ${a?`'sha256-${Q("sha256").update(a,"utf8").digest("base64")}'`:"'none'"}; connect-src ${r?"'self'":"'none'"}; img-src data:; base-uri 'none'; form-action 'none'`,y=!r&&o>0?`<meta http-equiv="refresh" content="${Math.max(5,Math.floor(o))}">`:"",f=r?`<link rel="alternate" type="application/json" href="${u(r)}">`:"",k=n||`${e.symbol===i?E(e.token):e.symbol} \xB7 ${t}`,x=e.supplyDelta7d,b=typeof x=="number"?x>0?"pos":x<0?"neg":"":"",m=e.watch.status==="armed"?"pos":e.watch.status==="triggered"?"neg":"",A=e.errors.length?`<h2>Reader gaps</h2><ul class="muted">${e.errors.map(z=>`<li>${u(z.reader)}: ${u(z.error)}</li>`).join("")}</ul>`:"",R=r?`live \xB7 polling ${u(r)} every ${Math.max(5,Math.floor(o))}s`:y?`page reloads every ${Math.max(5,Math.floor(o))}s`:"static snapshot";return`<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="Content-Security-Policy" content="${u(l)}"><meta name="referrer" content="no-referrer">${y}${f}<title>${u(k)}</title><style>${fe}</style></head><body><main><header><h1>${u(k)}</h1><span class="pill">${u(t)} \xB7 chain ${u(String(e.chainId))}</span><span class="addr muted">${u(e.token)}</span><span class="muted" id="refresh-state">${R}</span></header><div class="grid">`+$("price (usd)",C(e.price),{field:"price",kind:"usd"})+$(`pool price (${e.quoteSymbol})`,g(e.poolPriceQuote,{digits:8}),{field:"poolPriceQuote"})+$("supply",g(e.supply),{field:"supply"})+$("supply \u0394 7d",he(x),{field:"supplyDelta7d",kind:"signed",cssClass:b})+$("holders",g(e.holders.total,{digits:0}),{field:"holders.total"})+$("top-10 share",q(e.holders.top10Share),{field:"holders.top10Share",kind:"pct"})+$("watch",e.watch.status,{field:"watch.status",cssClass:m})+$("watch condition",e.watch.condition,{field:"watch.condition"})+`</div><h2>Biggest buys</h2>${ge(e.tape,s.tape)}<h2>Holders</h2>${be(e.holders,s.holders)}<h2>LP positions</h2>${ye(e.lpPositions,s.lpPositions)}`+A+`<footer>generated <span data-f="generatedAt"${j(e.generatedAt)}>${u(e.generatedAt)}</span> \xB7 holders source ${u(e.holders.source)} \xB7 tape source ${u(e.tape.source)} \xB7 read-only \xB7 nothing on this page signs or executes</footer></main>${a?`<script>${a}</script>`:""}</body></html>`}function xe({chainId:e,token:t,snapshot:n,refreshUrl:r,refreshSeconds:o=H,title:s,maxBytes:a=I,chainLookup:w}={}){let l=O(n,{chainId:e,token:t});if(l.token===i)throw new TypeError("buildTokenDashboard needs a 0x token address");let y=F(l.chainId,w||N),f=pe(r),k=Number.isFinite(Number(o))?Number(o):H,x=s==null?void 0:p(s,S),b=B(JSON.stringify(l),"token dashboard snapshot");if(!b.ok)throw new Error(b.error);let m={...G};for(;;){let A=we(l,{chainName:y,title:x,refreshUrl:f,refreshSeconds:k,limits:m}),R=Buffer.byteLength(A,"utf8");if(R<=a)return{html:A,json:l,bytes:R,rowLimits:m,chainName:y};if(m.holders===0&&m.tape===0&&m.lpPositions===0)throw new RangeError(`token dashboard exceeds ${a} bytes even with no table rows (${R} bytes)`);m={holders:Math.floor(m.holders/2),tape:Math.floor(m.tape/2),lpPositions:Math.floor(m.lpPositions/2)}}}function $e(e){let t=String(e),n=[];/<script\b[^>]*\ssrc\s*=/i.test(t)&&n.push("external script");for(let r of t.matchAll(/<script\b[^>]*>([\s\S]*?)<\/script>/gi))/\beval\s*\(/.test(r[1])&&n.push("eval("),/\bFunction\s*\(/.test(r[1])&&n.push("Function("),/innerHTML|outerHTML|document\.write/.test(r[1])&&n.push("html sink in script");return/<[a-z][^>]*\son[a-z]+\s*=/i.test(t)&&n.push("inline event handler"),/<[a-z][^>]*\s(?:href|src|action)\s*=\s*["']?\s*javascript:/i.test(t)&&n.push("javascript: url"),/<link\b[^>]*rel=["']?stylesheet/i.test(t)&&n.push("external stylesheet"),/<(?:iframe|object|embed)\b/i.test(t)&&n.push("embedded frame"),/http-equiv="Content-Security-Policy"/.test(t)||n.push("missing CSP"),Buffer.byteLength(t,"utf8")>I&&n.push("over size cap"),{ok:n.length===0,problems:n}}var _e={buildTokenDashboard:xe,collectTokenSnapshot:ue,normalizeSnapshot:O,auditDashboardHtml:$e,chainNameFor:F,normalizeToken:L,UNKNOWN:i,MAX_HTML_BYTES:I};export{V as DASHBOARD_VERSION,H as DEFAULT_REFRESH_SECONDS,I as MAX_HTML_BYTES,T as MAX_SNAPSHOT_ROWS,i as UNKNOWN,$e as auditDashboardHtml,xe as buildTokenDashboard,F as chainNameFor,ue as collectTokenSnapshot,_e as default,u as escapeHtml,O as normalizeSnapshot,L as normalizeToken};
@@ -0,0 +1,46 @@
1
+ # near agent
2
+
3
+ You cover **NEAR Protocol**: account, NEP-141 token, and transaction reads.
4
+
5
+ ## What you own
6
+
7
+ Explain NEAR, map it away from Ethereum, read an account's NEAR balance and
8
+ storage, read NEP-141 token balances, and report transaction status. You do not
9
+ quote, prepare, sign, or broadcast.
10
+
11
+ ## NEAR is not EVM
12
+
13
+ - No chainId, no `eth_*` JSON-RPC, no ERC-20, no Uniswap, no MetaMask.
14
+ - Identity is an **account id** (`alice.near`, `wrap.near`) or a 64-hex
15
+ implicit account, not an `0x` address.
16
+ - Fungible tokens are **NEP-141** contracts (`ft_balance_of`, `ft_metadata`).
17
+ - Units: **1 NEAR = 10^24 yoctoNEAR**. Report exact values, never float math.
18
+ - Each account has its own access keys (full-access or function-call).
19
+ - A transaction lookup needs both the **hash** and the **sender** account id.
20
+
21
+ ## Hard rules
22
+
23
+ 1. Never invent an EVM chainId, wrapped native, or DEX router for NEAR.
24
+ 2. Never claim a quote, swap, bridge, or unsigned tx. Those ops are fail-closed.
25
+ 3. If the RPC is unreachable, say **UNAVAILABLE**. Never report a fake zero.
26
+ 4. A missing account is `found: false`, not a zero balance. Say which.
27
+ 5. Never request or print private keys, seed phrases, or access-key secrets.
28
+ 6. A token contract that does not answer `ft_balance_of` is not NEP-141. Say so
29
+ rather than reporting zero.
30
+ 7. For USD values, price wNEAR / NEP-141 tokens from a live price source and
31
+ label the source. If none answers, the USD value is `unknown`.
32
+
33
+ ## Voice
34
+
35
+ Short. Precise. Correct EVM assumptions immediately. Point at docs.near.org
36
+ for wallets and accounts, nearblocks.io for explorer links.
37
+
38
+ ## First answer shape
39
+
40
+ When someone asks "what's in this NEAR wallet":
41
+
42
+ 1. Call `near_account` for the NEAR balance (found or not).
43
+ 2. Call `near_ft_balance` for each NEP-141 the user names (e.g. `wrap.near`,
44
+ `usdt.tether-token.near`, `17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1` for native USDC).
45
+ 3. Report exact balances with the block height. Transfers happen in the user's
46
+ NEAR wallet, not in Oracle.
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "./profile.schema.json",
3
+ "id": "near-agent",
4
+ "label": "near agent",
5
+ "role": "venue",
6
+ "color": "#00EC97",
7
+ "description": "NEAR Protocol read-only lane: account balances, NEP-141 token balances, and transaction status over public JSON-RPC. Not EVM.",
8
+ "model": {
9
+ "note": "NEAR uses named accounts, yoctoNEAR units, and NEP-141 tokens. Users need accurate mapping away from EVM habits.",
10
+ "suggested": "careful-verifier"
11
+ },
12
+ "skills": [
13
+ "oracle-near",
14
+ "oracle-receipts",
15
+ "oracle-circuit-breaker"
16
+ ],
17
+ "mcp": [
18
+ "oracle-data"
19
+ ],
20
+ "chains": [],
21
+ "nonEvm": "near-mainnet",
22
+ "posture": {
23
+ "default": "DISARMED",
24
+ "grantActions": [
25
+ "read:chain"
26
+ ],
27
+ "signing": "none",
28
+ "rationale": "NEAR is not EVM. This lane reads accounts, NEP-141 balances, and tx status. Quote, prepare, sign, and broadcast stay unimplemented; send_tx and broadcast_tx_* are refused before any network call."
29
+ }
30
+ }
@@ -38,6 +38,7 @@ value yourself.
38
38
  | Solana tokens, Jupiter routes | `solana-agent` |
39
39
  | Bitcoin L1, Ordinals/runes, inscriptions | `bitcoin-agent` |
40
40
  | Canton Network, Canton Coin (CC), Canton onboarding | `canton-agent` |
41
+ | NEAR Protocol accounts, NEP-141 balances, NEAR tx status | `near-agent` |
41
42
  | Stable (988), USDT-native gas | `stable-agent` |
42
43
  | tokenized Robinhood-style assets / stock tokens | exact home-chain lane + `oracle-rfq-tokenized-assets` |
43
44
  | meme-token launches, sniping, liquidity/pool watches | token's home-chain lane + `oracle-meme-token-sniper` |
@@ -97,7 +97,7 @@ does not prove npm users receive it. A locally hosted model/data/policy loop doe
97
97
  a bundled signer. A merged feature is not public until the npm artifact containing it is
98
98
  published and inspected.
99
99
 
100
- **Candidate release in this source tree:** public package `@oracle-agent/oracle@0.35.49`
100
+ **Candidate release in this source tree:** public package `@oracle-agent/oracle@0.35.51`
101
101
  ships the encrypted local vault + short-lived loopback signer. Hosted/keyless
102
102
  Oracle cannot hold keys or move funds. Self-hosting with `oracle sign init` or
103
103
  `oracle sign import --kind evm --key-file <0600 file>` writes an encrypted vault and marks
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: oracle-near
3
+ description: Use for NEAR Protocol accounts, NEP-141 token balances, and tx status. Not EVM. Read-only.
4
+ ---
5
+
6
+ # NEAR Protocol
7
+
8
+ NEAR is a **separate ledger family**. Do not route it through EVM grants,
9
+ EVM scanners, Uniswap venues, or MetaMask RPC.
10
+
11
+ ## What this skill owns
12
+
13
+ - Static primer: what NEAR is, why it is not EVM, units, account ids.
14
+ - RPC health (chain_id, latest height, sync state).
15
+ - Account state: NEAR balance (exact from yoctoNEAR), locked, storage, contract flag.
16
+ - NEP-141 token balance via `ft_balance_of` + `ft_metadata`.
17
+ - Transaction status by hash + sender (finality, success/failure, fee burnt).
18
+
19
+ ## What this skill does not own
20
+
21
+ - Quotes, swaps, bridges, sniping, MEV.
22
+ - Unsigned transaction preparation.
23
+ - Signing or broadcast. `send_tx` and `broadcast_tx_*` are refused in code
24
+ before any network call.
25
+ - Access-key enumeration or any other query type outside the allowlist.
26
+
27
+ ## Tools
28
+
29
+ - `near_guide` — offline primer. Call this first for "what is NEAR".
30
+ - `near_health` — RPC health. UNAVAILABLE is a real answer.
31
+ - `near_account` — NEAR balance and account state. `found:false` means the
32
+ account does not exist, not a zero balance.
33
+ - `near_ft_balance` — one NEP-141 balance for one account. `nep141:false` means
34
+ the contract did not answer the NEP-141 view.
35
+ - `near_tx` — status for a hash + sender account id.
36
+
37
+ All tools take `network` (`mainnet` default, or `testnet`). The operator can
38
+ override the endpoint with `NEAR_RPC_URL` (mainnet) or `NEAR_TESTNET_RPC_URL`
39
+ (testnet); a custom endpoint is reported as `customEndpoint: true`. Callers
40
+ cannot choose the endpoint. Error text is cut to scheme://host so a keyed RPC
41
+ URL never reaches a reply.
42
+
43
+ Reading results:
44
+ - `found: false` means the account or tx does not exist (live answer).
45
+ - `found: null` with `evidence: UNAVAILABLE` means the RPC failed. Unknown,
46
+ not missing. Never report it as "no such account".
47
+ - `locked: null` / `fee: null` means the node did not return that field.
48
+ Unknown, not zero.
49
+
50
+ ## Common NEP-141 contracts
51
+
52
+ - `wrap.near` — wNEAR (24 decimals)
53
+ - `usdt.tether-token.near` — USDt
54
+ - `17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1` — native USDC
55
+
56
+ Verify decimals from `ft_metadata`, never from memory.
57
+
58
+ ## Hard rules
59
+
60
+ - Never fabricate a chainId or EVM RPC for NEAR.
61
+ - Never treat a timeout or refusal as balance 0.
62
+ - Never claim prepare/sign support.
63
+ - Account ids must be NEAR account ids. Reject `0x` EVM addresses unless the
64
+ user explicitly means a NEAR eth-implicit account (`0x` + 40 hex).
65
+ - DexScreener's `near` slug can price NEAR tokens; label any USD value with
66
+ its source and time. No live price means USD `unknown`.
@@ -1 +1 @@
1
- var r=(e,t,o)=>()=>{if(o)throw o[0];try{return e&&(t=e(e=0)),t}catch(s){throw o=[s],s}};import{AsyncLocalStorage as ee}from"node:async_hooks";var _e,R=r(()=>{_e=new ee});var P=r(()=>{});var He,ze,Ve,Ge,Ke,Xe,We,Ye,l=r(()=>{R();P();He=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ze=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ve=AbortSignal.prototype.throwIfAborted,Ge=EventTarget.prototype.addEventListener,Ke=EventTarget.prototype.removeEventListener,Xe=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,We=64*1024,Ye=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024})});var _=r(()=>{});var B=r(()=>{});var d=r(()=>{_();B()});var I=r(()=>{});var it,at,c=r(()=>{it=300*1e3,at=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Contract as lt,JsonRpcProvider as dt}from"ethers";var L=r(()=>{});var ht,E=r(()=>{L();ht=Object.freeze({swap:5,bridge:5,perps:0,nft:0})});var D=r(()=>{l();d();I();c();E()});var U=r(()=>{l();d();c();E()});var O=r(()=>{});var F=r(()=>{l();d();O();c()});var qt,M=r(()=>{qt=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import{TypedDataEncoder as Gt,getAddress as Kt,isAddress as Xt}from"ethers";var tr,rr,nr,or,q=r(()=>{l();d();M();I();c();tr=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),rr=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),nr=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),or=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var k,j=r(()=>{k={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}}});var cr,H=r(()=>{j();cr=new Map(Object.values(k).map(e=>[e.chainId,e]))});import{Interface as se,getAddress as wr}from"ethers";var gr,S=r(()=>{l();H();gr=new se(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});var z=r(()=>{});var xr,v=r(()=>{l();z();xr=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"})});import{Interface as V,getAddress as kr,isAddress as vr}from"ethers";var Pr,_r,G=r(()=>{S();v();d();c();Pr=new V(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),_r=new V(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"])});import{AbiCoder as ce,Interface as T,getAddress as Dr,isAddress as Ur,keccak256 as Fr}from"ethers";var zr,Vr,Gr,Kr,Xr,Wr,K=r(()=>{S();v();d();c();zr=ce.defaultAbiCoder(),Vr=new T(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Gr=new T(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Kr=new T(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Xr=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Wr=(1n<<14n)-1n});import{createHash as pe}from"node:crypto";var Oe=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),ke=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),ve=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"});var Z=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"});D();U();F();l();d();O();c();q();G();K();l();var En=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});E();S();var $n=Object.freeze(["lifi","relay"]);c();var de=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"});var Mn=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase()));var qn=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);c();var fe=/^0x[0-9a-fA-F]{40}$/,me=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"]),he=100,W=604800,X=256;function we(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`)}function y(e,t,o,s){if(typeof e=="string"&&/^(0|[1-9][0-9]*)$/.test(e)&&(e=Number(e)),typeof e!="number"||!Number.isSafeInteger(e)||e<o||e>s)throw new Error(`${t} must be a finite integer in ${o}..${s}`);return e}function ge(e,t){if(typeof e=="bigint"&&(e=e.toString()),typeof e!="string"||e.length>X||!/^[1-9][0-9]*$/.test(e))throw new Error(`${t} must be a positive canonical decimal integer string or bigint (max ${X} digits)`);return BigInt(e)}function C(e,t){if(typeof e!="string"||!fe.test(e))throw new Error(`${t} must be an exact EVM address`);return e}function be(e){if(typeof e!="function")throw new Error("now must be a function");return y(e(),"clock milliseconds",0,864e13-W*1e3)}function ye(e={},{now:t=Date.now}={}){we(e,"TWAP params");let o=y(e.splits===void 0?10:e.splits,"splits",2,100),s=y(e.chainId,"chainId",1,Number.MAX_SAFE_INTEGER),u=ge(e.amount,"amount");if(u<BigInt(o))throw new Error("amount must fund every split with at least one raw unit");let n=C(e.tokenIn,"tokenIn"),i=C(e.tokenOut,"tokenOut");if(n.toLowerCase()===i.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let f=C(e.taker,"taker");if(me.has(f.toLowerCase()))throw new Error("taker cannot be a placeholder/burn address");let a=e.windowHours===void 0?6:e.windowHours;if(typeof a=="string"&&/^(0|[1-9][0-9]*)(\.[0-9]+)?$/.test(a)&&(a=Number(a)),typeof a!="number"||!Number.isFinite(a))throw new Error("windowHours must be finite");let w=y(a*3600,"window seconds",60,W),b=y(e.slippageBps===void 0?100:e.slippageBps,"slippageBps",0,he);return{chainId:s,tokenIn:n,tokenOut:i,amount:u.toString(),splits:o,chunkSize:(u/BigInt(o)).toString(),remainder:(u%BigInt(o)).toString(),windowHours:a,windowSec:w,intervalSec:w/o,taker:f,slippageBps:b,status:"planned",createdAt:new Date(be(t)).toISOString()}}function Ee(e){let t=Date.parse(e.createdAt);return Array.from({length:e.splits},(o,s)=>({splitIndex:s+1,executeAfter:new Date(t+Math.floor(s*e.windowSec*1e3/e.splits)).toISOString(),chunkSize:(BigInt(e.chunkSize)+(BigInt(s)<BigInt(e.remainder)?1n:0n)).toString()}))}function Ae(e,t){return pe("sha256").update(JSON.stringify({params:e,schedule:t})).digest("hex")}function Y(e,{now:t=Date.now}={}){let o=Object.freeze(ye(e,{now:t})),s=Object.freeze(Ee(o).map(Object.freeze));return Object.freeze({params:o,schedule:s,planId:Ae(o,s),mode:"synthetic-twap",executionReady:!1})}var J=Object.freeze(["schemaVersion","mode","chainId","tokenIn","tokenOut","amount","splits","windowHours","taker","slippageBps"]),Se=/^0x[0-9a-fA-F]{40}$/;function Jn(e,{now:t=Date.now}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("draft must be an object");for(let i of Object.keys(e))if(!J.includes(i))throw new Error(`unsupported field: ${i}`);for(let i of J)if(!Object.hasOwn(e,i))throw new Error(`required field: ${i}`);if(e.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(e.mode!=="synthetic-twap")throw new Error("only synthetic-twap preview is available");let{schemaVersion:o,mode:s,...u}=e,n=Y(u,{now:t});return{schemaVersion:o,mode:s,status:"draft",active:!1,actionMode:"preview_only",persisted:!1,ownerBinding:null,tenantBinding:null,backendSigner:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,plan:n,windowEndsAt:new Date(Date.parse(n.params.createdAt)+n.params.windowSec*1e3).toISOString(),minimumOutput:null,capabilities:{syntheticTwapPreview:!0,venueNativeTwap:!1,limitOrders:!1,execute:!1,pause:!1,cancel:!1,enforcedLimits:!1},costs:["protocol/LP","provider/aggregator","Oracle/integrator","source gas and approvals","destination gas/claim"].map(i=>({category:i,status:"unknown",amountRaw:null,asset:null,amountUsd:null,source:null,asOf:null})),unavailableControls:["Venue-native TWAP and resting limit orders: no supported lifecycle in this planner.","Execution, pause, cancellation and revocation: no automation job is created.","Router/venue allowlists, separate recipient and cross-chain plans: not supported by this preview schema.","Approval, per-slice/aggregate fee and spend caps: no executor enforcement is available.","Retries, failure policy, stop conditions, worker leases and idempotent execution: unavailable.","Owner/tenant authorization and grant expiry: unavailable; no owner identity is inferred from the taker."],warnings:["Draft only. No quote, unsigned transaction, grant, timer, job, signature or broadcast is created.","Amounts are exact raw input units; token decimals and balances have not been verified.","Slice timestamps are a relative preview starting at generation, not scheduled execution times.","The preview window end is not order expiry or a grant deadline.","Slippage is a planning parameter, not an enforced output guarantee. Minimum output and all costs are unknown.","Source venue and candidate risk labels are discovery evidence, not route availability or trading approval."]}}function h(e,t){return typeof e=="string"&&e.length?e.slice(0,300):t}function xe(e){return typeof e=="string"&&Se.test(e)?e:null}function Qn(e,{now:t=Date.now}={}){let s=(Array.isArray(e?.candidates)?e.candidates:[]).slice(0,100).map((n,i)=>{let f=n?.chain?.id??n?.chainId,a=typeof f=="number"&&Number.isSafeInteger(f)&&f>0?f:null,w=xe(n?.token?.address),b=n?.token?.observedAt,Q=typeof b=="string"&&Number.isFinite(Date.parse(b))?b:null,N=a!==null&&w!==null;return{id:h(n?.id,`unidentified-row-${i}`),label:h(n?.token?.symbol,h(n?.token?.name,w??"Unknown token")),chainId:a,tokenAddress:w,observedAt:Q,venue:h(n?.venue?.name,h(n?.venue?.key,h(n?.venue?.id,"Unknown venue"))),status:["PASS","WARN","BLOCK"].includes(n?.status)?n.status:"UNKNOWN",whyBlocked:Array.isArray(n?.whyBlocked)?n.whyBlocked.filter(x=>typeof x=="string").slice(0,20).map(x=>x.slice(0,300)):[],previewEligible:N,unavailableReason:N?null:"An exact numeric EVM chain ID and token address are required; no ticker resolution is performed."}}),u=e?.evidence==="LIVE";return{source:"launch-radar durable store",evidence:h(e?.evidence,"UNAVAILABLE"),status:u?s.length?"ready":"empty":"unavailable",reason:u?null:"Launch Radar evidence is unavailable; this is not an empty-market result.",fetchedAt:new Date(t()).toISOString(),freshness:"Observation timestamps are source evidence; fetch time is not market freshness.",coverage:"At most 100 stored candidates; not a complete market scan. Only exact EVM identities can prefill this preview.",candidates:s}}export{Jn as buildAutomationDraft,Qn as discoverySnapshot};
1
+ var r=(e,t,o)=>()=>{if(o)throw o[0];try{return e&&(t=e(e=0)),t}catch(s){throw o=[s],s}};import{AsyncLocalStorage as ee}from"node:async_hooks";var Be,P=r(()=>{Be=new ee});var _=r(()=>{});var ze,Ve,Ge,Ke,Xe,We,Ye,Je,l=r(()=>{P();_();ze=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Ve=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ge=AbortSignal.prototype.throwIfAborted,Ke=EventTarget.prototype.addEventListener,Xe=EventTarget.prototype.removeEventListener,We=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ye=64*1024,Je=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024})});var B=r(()=>{});var $=r(()=>{});var d=r(()=>{B();$()});var I=r(()=>{});var at,ct,c=r(()=>{at=300*1e3,ct=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Contract as dt,JsonRpcProvider as pt}from"ethers";var L=r(()=>{});var wt,E=r(()=>{L();wt=Object.freeze({swap:5,bridge:5,perps:0,nft:0})});var U=r(()=>{l();d();I();c();E()});var F=r(()=>{l();d();c();E()});var O=r(()=>{});var M=r(()=>{l();d();O();c()});var jt,q=r(()=>{jt=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import{TypedDataEncoder as Kt,getAddress as Xt,isAddress as Wt}from"ethers";var rr,nr,or,sr,j=r(()=>{l();d();q();I();c();rr=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),nr=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),or=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),sr=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var k,H=r(()=>{k={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});var ur,v=r(()=>{H();ur=new Map(Object.values(k).map(e=>[e.chainId,e]))});import{Interface as ie,getAddress as wr}from"ethers";var gr,S=r(()=>{l();v();gr=new ie(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});var z=r(()=>{});var xr,T=r(()=>{l();z();xr=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"})});import{Interface as V,getAddress as kr,isAddress as vr}from"ethers";var Pr,_r,G=r(()=>{S();T();d();c();Pr=new V(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),_r=new V(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"])});import{AbiCoder as ue,Interface as C,getAddress as Dr,isAddress as Ur,keccak256 as Fr}from"ethers";var zr,Vr,Gr,Kr,Xr,Wr,K=r(()=>{S();T();d();c();zr=ue.defaultAbiCoder(),Vr=new C(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Gr=new C(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Kr=new C(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Xr=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Wr=(1n<<14n)-1n});import{createHash as fe}from"node:crypto";var ke=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),ve=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),Te=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"});var Z=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"});U();F();M();l();d();O();c();j();G();K();l();var En=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});E();S();v();var Un=Object.freeze(["lifi","relay"]);c();var pe=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"});var jn=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase()));var Hn=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);c();var me=/^0x[0-9a-fA-F]{40}$/,he=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"]),we=100,W=604800,X=256;function ge(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`)}function y(e,t,o,s){if(typeof e=="string"&&/^(0|[1-9][0-9]*)$/.test(e)&&(e=Number(e)),typeof e!="number"||!Number.isSafeInteger(e)||e<o||e>s)throw new Error(`${t} must be a finite integer in ${o}..${s}`);return e}function be(e,t){if(typeof e=="bigint"&&(e=e.toString()),typeof e!="string"||e.length>X||!/^[1-9][0-9]*$/.test(e))throw new Error(`${t} must be a positive canonical decimal integer string or bigint (max ${X} digits)`);return BigInt(e)}function N(e,t){if(typeof e!="string"||!me.test(e))throw new Error(`${t} must be an exact EVM address`);return e}function ye(e){if(typeof e!="function")throw new Error("now must be a function");return y(e(),"clock milliseconds",0,864e13-W*1e3)}function Ee(e={},{now:t=Date.now}={}){ge(e,"TWAP params");let o=y(e.splits===void 0?10:e.splits,"splits",2,100),s=y(e.chainId,"chainId",1,Number.MAX_SAFE_INTEGER),u=be(e.amount,"amount");if(u<BigInt(o))throw new Error("amount must fund every split with at least one raw unit");let n=N(e.tokenIn,"tokenIn"),i=N(e.tokenOut,"tokenOut");if(n.toLowerCase()===i.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let f=N(e.taker,"taker");if(he.has(f.toLowerCase()))throw new Error("taker cannot be a placeholder/burn address");let a=e.windowHours===void 0?6:e.windowHours;if(typeof a=="string"&&/^(0|[1-9][0-9]*)(\.[0-9]+)?$/.test(a)&&(a=Number(a)),typeof a!="number"||!Number.isFinite(a))throw new Error("windowHours must be finite");let w=y(a*3600,"window seconds",60,W),b=y(e.slippageBps===void 0?100:e.slippageBps,"slippageBps",0,we);return{chainId:s,tokenIn:n,tokenOut:i,amount:u.toString(),splits:o,chunkSize:(u/BigInt(o)).toString(),remainder:(u%BigInt(o)).toString(),windowHours:a,windowSec:w,intervalSec:w/o,taker:f,slippageBps:b,status:"planned",createdAt:new Date(ye(t)).toISOString()}}function Ae(e){let t=Date.parse(e.createdAt);return Array.from({length:e.splits},(o,s)=>({splitIndex:s+1,executeAfter:new Date(t+Math.floor(s*e.windowSec*1e3/e.splits)).toISOString(),chunkSize:(BigInt(e.chunkSize)+(BigInt(s)<BigInt(e.remainder)?1n:0n)).toString()}))}function Se(e,t){return fe("sha256").update(JSON.stringify({params:e,schedule:t})).digest("hex")}function Y(e,{now:t=Date.now}={}){let o=Object.freeze(Ee(e,{now:t})),s=Object.freeze(Ae(o).map(Object.freeze));return Object.freeze({params:o,schedule:s,planId:Se(o,s),mode:"synthetic-twap",executionReady:!1})}var J=Object.freeze(["schemaVersion","mode","chainId","tokenIn","tokenOut","amount","splits","windowHours","taker","slippageBps"]),xe=/^0x[0-9a-fA-F]{40}$/;function Zn(e,{now:t=Date.now}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("draft must be an object");for(let i of Object.keys(e))if(!J.includes(i))throw new Error(`unsupported field: ${i}`);for(let i of J)if(!Object.hasOwn(e,i))throw new Error(`required field: ${i}`);if(e.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(e.mode!=="synthetic-twap")throw new Error("only synthetic-twap preview is available");let{schemaVersion:o,mode:s,...u}=e,n=Y(u,{now:t});return{schemaVersion:o,mode:s,status:"draft",active:!1,actionMode:"preview_only",persisted:!1,ownerBinding:null,tenantBinding:null,backendSigner:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,plan:n,windowEndsAt:new Date(Date.parse(n.params.createdAt)+n.params.windowSec*1e3).toISOString(),minimumOutput:null,capabilities:{syntheticTwapPreview:!0,venueNativeTwap:!1,limitOrders:!1,execute:!1,pause:!1,cancel:!1,enforcedLimits:!1},costs:["protocol/LP","provider/aggregator","Oracle/integrator","source gas and approvals","destination gas/claim"].map(i=>({category:i,status:"unknown",amountRaw:null,asset:null,amountUsd:null,source:null,asOf:null})),unavailableControls:["Venue-native TWAP and resting limit orders: no supported lifecycle in this planner.","Execution, pause, cancellation and revocation: no automation job is created.","Router/venue allowlists, separate recipient and cross-chain plans: not supported by this preview schema.","Approval, per-slice/aggregate fee and spend caps: no executor enforcement is available.","Retries, failure policy, stop conditions, worker leases and idempotent execution: unavailable.","Owner/tenant authorization and grant expiry: unavailable; no owner identity is inferred from the taker."],warnings:["Draft only. No quote, unsigned transaction, grant, timer, job, signature or broadcast is created.","Amounts are exact raw input units; token decimals and balances have not been verified.","Slice timestamps are a relative preview starting at generation, not scheduled execution times.","The preview window end is not order expiry or a grant deadline.","Slippage is a planning parameter, not an enforced output guarantee. Minimum output and all costs are unknown.","Source venue and candidate risk labels are discovery evidence, not route availability or trading approval."]}}function h(e,t){return typeof e=="string"&&e.length?e.slice(0,300):t}function Ie(e){return typeof e=="string"&&xe.test(e)?e:null}function eo(e,{now:t=Date.now}={}){let s=(Array.isArray(e?.candidates)?e.candidates:[]).slice(0,100).map((n,i)=>{let f=n?.chain?.id??n?.chainId,a=typeof f=="number"&&Number.isSafeInteger(f)&&f>0?f:null,w=Ie(n?.token?.address),b=n?.token?.observedAt,Q=typeof b=="string"&&Number.isFinite(Date.parse(b))?b:null,R=a!==null&&w!==null;return{id:h(n?.id,`unidentified-row-${i}`),label:h(n?.token?.symbol,h(n?.token?.name,w??"Unknown token")),chainId:a,tokenAddress:w,observedAt:Q,venue:h(n?.venue?.name,h(n?.venue?.key,h(n?.venue?.id,"Unknown venue"))),status:["PASS","WARN","BLOCK"].includes(n?.status)?n.status:"UNKNOWN",whyBlocked:Array.isArray(n?.whyBlocked)?n.whyBlocked.filter(x=>typeof x=="string").slice(0,20).map(x=>x.slice(0,300)):[],previewEligible:R,unavailableReason:R?null:"An exact numeric EVM chain ID and token address are required; no ticker resolution is performed."}}),u=e?.evidence==="LIVE";return{source:"launch-radar durable store",evidence:h(e?.evidence,"UNAVAILABLE"),status:u?s.length?"ready":"empty":"unavailable",reason:u?null:"Launch Radar evidence is unavailable; this is not an empty-market result.",fetchedAt:new Date(t()).toISOString(),freshness:"Observation timestamps are source evidence; fetch time is not market freshness.",coverage:"At most 100 stored candidates; not a complete market scan. Only exact EVM identities can prefill this preview.",candidates:s}}export{Zn as buildAutomationDraft,eo as discoverySnapshot};