@oracle-agent/oracle 0.35.4 → 0.35.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +25 -23
  4. package/dist/bin/oracle-data-mcp.mjs +13 -11
  5. package/dist/bin/oracle-gateway.mjs +35 -35
  6. package/dist/bin/oracle-mev-arb-shadow.mjs +7 -5
  7. package/dist/bin/oracle-mev-shadow.mjs +7 -5
  8. package/dist/bin/oracle-public-server.mjs +6 -4
  9. package/dist/bin/oracle-route.mjs +22 -20
  10. package/dist/bin/oracle-scan.mjs +14 -12
  11. package/dist/bin/oracle-telegram-mcp.mjs +10 -10
  12. package/dist/bin/oracle.mjs +7 -5
  13. package/dist/cli/commands/chat.mjs +166 -164
  14. package/dist/cli/commands/doctor.mjs +3 -3
  15. package/dist/cli/commands/eval.mjs +113 -113
  16. package/dist/cli/commands/farm.mjs +14 -14
  17. package/dist/cli/commands/follow.mjs +16 -14
  18. package/dist/cli/commands/model.mjs +170 -168
  19. package/dist/cli/commands/project.mjs +17 -0
  20. package/dist/cli/commands/resolve.mjs +8 -6
  21. package/dist/cli/commands/shadow.mjs +21 -0
  22. package/dist/cli/commands/signer.mjs +10 -10
  23. package/dist/cli/commands/snipe.mjs +10 -8
  24. package/dist/cli/commands/strategy.mjs +5 -5
  25. package/dist/cli/commands/swap.mjs +27 -25
  26. package/dist/cli/commands/telegram.mjs +10 -10
  27. package/dist/cli/commands/venues.mjs +2 -2
  28. package/dist/data/desk-data.mjs +23 -21
  29. package/dist/data/names.mjs +4 -2
  30. package/dist/data/providers/farming.mjs +2 -2
  31. package/dist/index.mjs +37 -35
  32. package/dist/local-signer/index.mjs +3 -3
  33. package/dist/local-signer/runtime.mjs +9 -9
  34. package/dist/nft/universal-mint-router.mjs +5 -3
  35. package/dist/router/index.mjs +4 -2
  36. package/dist/router/prepare-bridge.mjs +2 -2
  37. package/dist/scanner/index.mjs +5 -3
  38. package/dist/strategy/index.mjs +3 -3
  39. package/package.json +1 -1
  40. package/public/oracle-splash/index.html +2 -2
@@ -1,6 +1,6 @@
1
- import{createHash as we,randomBytes as $e}from"node:crypto";import{mkdirSync as xe,readFileSync as Se,writeFileSync as Ce}from"node:fs";import{homedir as Ae}from"node:os";import{dirname as Re,join as j}from"node:path";var re=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function M(t,{coin:e,side:r,sizeUsd:o,leverage:s,venue:a,confirm:i,user:l}={}){let u=String(t||"").trim();if(!u||u.includes("ts.net")||!/^https:\/\//i.test(u))return null;let d=new URL(u);if(e&&re.test(String(e).toUpperCase())&&d.searchParams.set("coin",String(e).toUpperCase()),(r==="long"||r==="short")&&d.searchParams.set("side",r),Number.isFinite(Number(o))&&Number(o)>=1&&d.searchParams.set("size",String(Math.min(1e5,Math.round(Number(o))))),Number.isInteger(Number(s))&&Number(s)>=1&&d.searchParams.set("lev",String(Math.min(50,Number(s)))),a){let g=String(a).toLowerCase()==="hl"?"hyperliquid":String(a).toLowerCase();d.searchParams.set("venue",g)}else d.searchParams.get("venue")||d.searchParams.set("venue","hyperliquid");return d.searchParams.set("view","perps"),d.searchParams.set("build","1"),i&&/^[0-9a-f]{32}$/i.test(String(i))&&d.searchParams.set("confirm",String(i).toLowerCase()),l&&/^0x[0-9a-fA-F]{40}$/.test(String(l))&&d.searchParams.set("user",String(l).toLowerCase()),d.toString()}var ne={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}},ie=new Map(Object.values(ne).map(t=>[t.chainId,t]));function H(t){return ie.get(Number(t))||null}var c="UNKNOWN",Be=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),oe=/[_*[\]`]/g;function n(t){return p(t)?String(t).replace(oe,e=>`\\${e}`):c}function p(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function h(t){if(!p(t))return c;let e=String(t).replace(/`/g,"");return e===""?c:`\`${e}\``}function $(t,{decimals:e=2}={}){if(!p(t))return c;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):c}function m(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===c?c:`${r} USD`}function I(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===c?c:`${r}%`}function N(t){let e=$(t,{decimals:0});return e===c?c:`${e} bps`}function x(t,e){if(!p(t))return c;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return c;let o;try{o=BigInt(typeof t=="string"?t.trim():t)}catch{return c}let s=o<0n,a=s?-o:o,i=10n**BigInt(r),l=(a/i).toString(),u=(a%i).toString().padStart(r,"0").replace(/0+$/,"");return`${s?"-":""}${l}${u?`.${u}`:""}`}function E(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?c:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return c}function y(t={}){let e=t.chainId;if(!p(e)||!Number.isFinite(Number(e)))return p(t.chain)?n(t.chain):c;let o=H(e)?.name||(p(t.chain)?String(t.chain):c);return`${n(o)} (chainId ${Number(e)})`}function D(t={}){return n(t.venue??t.dex??t.pool?.venue)}function ae(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?h(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${p(t.error)?` \u2014 ${n(t.error)}`:""} (text card stands)`:p(t.url)?h(t.url):"NONE (text card only)"}function A(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let o=r.expiresAt??r.expiry;if(p(o)){let a=typeof o=="number"?o:Date.parse(o);if(!Number.isFinite(a))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(a<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function se(t){let e=A(t);return e.allowed?`${e.actions.map(r=>n(r)).join(" / ")} (${n(e.reason)})`:`prepare-only \u2014 ${n(e.reason)}`}function b(t,e,r={}){let o=[`*${t}*`];for(let[s,a]of e)o.push(`${s}: ${a==null||a===""?c:a}`);return o.push(`Chart: ${ae(r.chart)}`),o.push(`Actions: ${se(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(s=>n(s)).join("; ")}`),(p(r.source)||p(r.fetchedAt))&&o.push(`Source: ${n(r.source)} at ${n(r.fetchedAt)}`),o.join(`
2
- `)}function k(t){return["Confidence",E(t.confidence)]}function ce(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=p(e.decimals)?x(e.amountOutRaw??e.out??e.raw,e.decimals):c;return[["Quote out (raw)",h(e.amountOutRaw??e.out??e.raw)],["Quote out",r===c?c:`${n(r)} ${n(e.symbol??"")}`.trim()]]}function F(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",c];let r=N(e.selectedBps),o=N(e.capBps);return["Auto-slippage",r===c&&o===c?c:`${r} selected, cap ${o}`]}function le(t={}){let e=t||{};return b(`ORACLE TOKEN \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",y(e)],["Venue",D(e)],["Name",n(e.name)],["Address",h(e.address??e.mint??e.contract)],["Price",m(e.priceUsd,{decimals:8})],["Market cap",m(e.marketCapUsd)],["Liquidity",m(e.liquidityUsd)],["Volume 24h",m(e.volume24hUsd)],["Change 24h",I(e.priceChange24h)],["Fee tier",p(e.feeTier)?`${N(Number(e.feeTier)/100)} (${$(e.feeTier,{decimals:0})})`:c],["Age",n(e.age)],...ce(e),F(e),k(e)],e)}function ue(t={}){let e=t||{};return b(`ORACLE LAUNCH \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",y(e)],["Venue",D(e)],["Address",h(e.address??e.mint??e.contract)],["Pool",h(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",m(e.liquidityUsd)],["Route ready",n(e.routeReady)],["Sellable",n(e.sellable)],["Sell sim",n(e.sellSimulation??e.sellSim)],["Smart wallets",n(e.smartWalletOverlap)],["Risk",n(e.risk??e.riskStatus)],["Prepared ticket",n(e.preparedTicket??e.ticketStatus)],F(e),k(e)],e)}function de(t={}){let e=t||{};return b(`ORACLE HIP-3 \u2014 ${n(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${n(e.dex)}`],["Market",n(e.market??e.coin)],["Mark",m(e.markPx,{decimals:6})],["Oracle",m(e.oraclePx,{decimals:6})],["Funding",I(e.funding,{decimals:6})],["Open interest",m(e.openInterestUsd)],["Depth",n(e.depth)],["Liquidation notes",n(e.liquidationNotes??e.riskNotes)],["Account context",n(e.accountContext)],k(e)],e)}function pe(t={}){let e=t||{};return b(`ORACLE HIP-4 \u2014 ${n(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${n(e.dex??"outcome")}`],["Event",n(e.event)],["Outcome",n(e.outcome)],["Market id",h(e.marketId??e.market)],["Bid",m(e.bid,{decimals:6})],["Ask",m(e.ask,{decimals:6})],["Depth",n(e.depth)],["Edge",I(e.edge)],["Position",n(e.position)],k(e)],e)}function me(t={}){let e=t||{};return b(`ORACLE POLYMARKET \u2014 ${n(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",n(e.event)],["Market",n(e.market)],["Market id",h(e.marketId??e.conditionId??e.tokenId)],["Yes",m(e.yesPrice,{decimals:4})],["No",m(e.noPrice,{decimals:4})],["Best bid / ask",`${m(e.bestBid,{decimals:4})} / ${m(e.bestAsk,{decimals:4})}`],["Volume",m(e.volumeUsd)],["Resolution risk",n(e.resolutionRisk)],["Order intent",n(e.orderIntent)],k(e)],e)}function fe(t={}){let e=t||{},r=p(e.completedSplits)&&p(e.totalSplits)?`${$(e.completedSplits,{decimals:0})} / ${$(e.totalSplits,{decimals:0})}`:c;return b(`ORACLE TWAP \u2014 ${n(e.pair??e.symbol??e.name)}`,[["Chain",y(e)],["Side",n(e.side??e.direction)],["Amount",`${n(x(e.amountTotal??e.amount,e.decimals??18))} ${n(e.symbol??"")}`.trim()],["Splits",`${$(e.totalSplits,{decimals:0})} over ${n(e.window)}`],["Progress",r],["Avg price",m(e.averagePrice,{decimals:6})],["Next split",n(e.nextSplitAt)],["Slippage cap",N(e.slippageBps)],["Status",n(e.status)],k(e)],e)}function he(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${n(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return b(`ORACLE BRIDGE \u2014 ${n(e.pair??e.fromSymbol)} \u2192 ${n(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",y({chainId:e.fromChainId,chain:e.fromChain})],["To chain",y({chainId:e.toChainId,chain:e.toChain})],["Amount",`${n(x(e.amount,e.fromDecimals??18))} ${n(e.fromSymbol??"")}`.trim()],["Best route",n(e.bestRoute??e.winner)],["Est. received",`${n(x(e.amountOut,e.toDecimals??18))} ${n(e.toSymbol??"")}`.trim()],["Fee",m(e.feeUsd)],["Est. time",n(e.estimatedTime)],["Revoke check",o],["All providers",n(e.providers?.join(", "))],["Preparable",n(e.preparable)],k(e)],e)}function ge(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let s=n(o.source??o.venue??o.name),a=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),i=Number.isFinite(a)?`${Math.abs(a).toFixed(0)} bps behind`:"spread UNKNOWN";return`${s} (${i})`});return r.length?r.join("; "):c}function be(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return p(e)?n(e):c}function ke(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,o=e.bridge&&typeof e.bridge=="object"?e.bridge:null,s=r.best??r.winner??{},a=`${n(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${n(e.tokenOutSymbol??e.toSymbol??"OUT")}`,i=[["Intent",n(e.intent??"swap")],["Chain",y({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${n(x(e.amountIn??r.amountIn,e.decimalsIn??18))} ${n(e.tokenInSymbol??"")}`.trim()],["Best swap",n(s.source??s.venue??r.bestRoute??e.bestRoute)],["Net out",`${n(x(s.netOut??s.amountOut??r.amountOut,e.decimalsOut??18))} ${n(e.tokenOutSymbol??"")}`.trim()],["Ranked on",be(r)],["Gas accounted",n(s.costAccounted===!0?"yes":s.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",p(r.improvementBps)?`${n(r.improvementBps)} bps`:c],["Runners-up",ge(r.routes??e.routes)]];if(o){let l=o.best??o.winner??{};i.push(["Best bridge",n(l.source??o.bestRoute??e.bestBridge)],["Bridge out",`${n(x(l.netOut??l.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${n(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",y({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",n(o.estimatedTime??l.meta?.durationSeconds)])}else i.push(["Best bridge","same-chain \u2014 use Best swap"]);return i.push(["Preparable",n(e.preparable??s.executionReady)],k(e)),b(`ORACLE SWAP \u2014 ${a}`,i,e)}function ye(t={}){let e=t||{};return b("ORACLE APPROVE \u2014 local signer",[["Pending id",h(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",n(e.surface)],["Action",n(e.action)],["Chain",y({chainId:e.chain??e.chainId,chain:e.chainName})],["To",h(e.to??e.destination)],["Value",p(e.value)?n(e.value):c],["Signer",n(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],k({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var Ue=Object.freeze({token:le,launch:ue,hip3:de,hip4:pe,polymarket:me,twap:fe,bridge:he,swap:ke,approve:ye});var Ne=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny"]),_e=new Set(Ne),L=/^[a-z0-9-]{4,40}$/i,q=/^[0-9a-f]{32}$/,V=/^\d+$/;function P(t=process.env){return j(t.ORACLE_CONFIG_DIR||j(Ae(),".config","oracle"),"telegram-cards.json")}function S(){return{links:{},artifacts:{},threads:{}}}var R=S();function T(){return R}function W(t,{readFile:e=Se}={}){try{let r=JSON.parse(String(e(t)));R={links:r.links&&typeof r.links=="object"?r.links:{},artifacts:r.artifacts&&typeof r.artifacts=="object"?r.artifacts:{},threads:r.threads&&typeof r.threads=="object"?r.threads:{}}}catch{R=S()}return R}function z(t,e=R,{writeFile:r=Ce,mkdir:o=xe}={}){o(Re(t),{recursive:!0,mode:448}),r(t,JSON.stringify(e),{mode:384})}function w(t){return t==null?!1:typeof t=="string"?t.trim()!=="":!0}function K(t){return we("sha256").update(String(t)).digest("hex")}function v(t){if(Array.isArray(t))return t.map(v);if(!t||typeof t!="object")return t;let e={};for(let[r,o]of Object.entries(t))/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(r)||(e[r]=v(o));return e}function Oe(t){let r=String(t||"").trim().match(/^oracle:card:(deepen|refresh|prepare|ta|fa|long|short|allow|deny):([a-z0-9-]{4,40})$/i);return r?{action:r[1].toLowerCase(),artifactId:r[2].toLowerCase()}:null}function Y({platform:t="telegram",artifactId:e,openUrl:r,hasGrant:o=!1}={}){let s=String(e||"").trim().toLowerCase();if(!L.test(s))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let a=[],i=[{text:"TA",callback_data:`oracle:card:ta:${s}`},{text:"FA",callback_data:`oracle:card:fa:${s}`}],l=O=>M(r,{side:O}),u=l("long"),d=l("short"),g=u&&d?[{text:"LONG",url:u},{text:"SHORT",url:d}]:[{text:"LONG",callback_data:`oracle:card:long:${s}`},{text:"SHORT",callback_data:`oracle:card:short:${s}`}];return w(r)?(a.push([{text:"Open",url:String(r)},i[0]]),a.push(g),a.push(o?[i[1],{text:"Prep",callback_data:`oracle:card:prepare:${s}`}]:[i[1]])):(a.push(i),a.push(g),o&&a.push([{text:"Prep",callback_data:`oracle:card:prepare:${s}`}])),String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:a.filter(O=>O.length>0)},cancelHint:"LONG/SHORT open the graph. CONFIRM there. Telegram never sends."}:{kind:"text_menu",text:"TA / FA / LONG / SHORT",cancelHint:""}}function G(t={}){let r=[`*${w(t.title)?n(t.title):"Oracle artifact"}*`,`Kind: ${w(t.kind)?n(t.kind):c}`,`Id: ${w(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:c}`,`Summary: ${w(t.summary)?n(t.summary):c}`,`Confidence: ${E(t.confidence)}`];(w(t.source)||w(t.fetchedAt))&&r.push(`Source: ${n(t.source)} at ${n(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(s=>n(s)).join("; ")}`);let o=A(t);return r.push(o.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${n(o.reason)}`),r.join(`
3
- `)}function Ie(t,e={},{now:r=Date.now()}={}){let o=t||S(),s=String(e.id||"").trim().toLowerCase();if(!L.test(s))throw new TypeError("artifact id required");let a={id:s,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:w(e.openUrl)?String(e.openUrl):null,confidence:e.confidence,source:e.source||"oracle",fetchedAt:e.fetchedAt||new Date(r).toISOString(),warnings:Array.isArray(e.warnings)?e.warnings.map(String):[],payload:v(e.payload||{}),createdAt:new Date(r).toISOString()};return o.artifacts[s]=a,a}function B(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),i=String(r||"").trim().toLowerCase();if(!a)throw new TypeError("chat id required");if(!L.test(i))throw new TypeError("artifact id required");return s.threads[a]={artifactId:i,updatedAt:o},s.threads[a]}function J(t,{chatId:e,text:r}={}){let o=String(e||"").trim(),s=String(r||"").trim();if(!o||!s||/^\//.test(s))return null;let a=t?.threads?.[o];if(!a?.artifactId)return null;let i=t.artifacts?.[a.artifactId];return i?`Continue artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. User: ${s}`:null}function Q(t,{ownerId:e,botUsername:r,now:o=Date.now(),ttlMs:s=600*1e3,token:a,randomBytes:i=$e}={}){let l=t||S(),u=String(e||"").trim(),d=String(r||"").replace(/^@/,"").trim();if(!V.test(u))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(d))throw new TypeError("bot username required");let g=a||i(16).toString("hex");if(!q.test(g))throw new TypeError("link token must be 32 hex chars");return l.links[K(g)]={ownerId:u,expiresAt:o+Number(s)},{token:g,url:`https://t.me/${d}?start=${g}`,expiresAt:o+Number(s)}}function Z(t,{token:e,telegramUserId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),i=String(r||"").trim();if(!q.test(a))return{ok:!1,error:"invalid start token"};if(!V.test(i))return{ok:!1,error:"invalid telegram user"};let l=K(a),u=s.links[l];return u?(delete s.links[l],Number(u.expiresAt)<=o?{ok:!1,error:"start token expired"}:String(u.ownerId)!==i?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:i}):{ok:!1,error:"unknown or already used start token"}}function X(t,{data:e,chatId:r,grant:o=null,now:s=Date.now()}={}){let a=Oe(e);if(!a)return null;if(!_e.has(a.action))return{text:"That card action is not available.",buttons:null};let i=t?.artifacts?.[a.artifactId];if(!i)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};r&&B(t,{chatId:r,artifactId:i.id,now:s});let l=A({grant:o},{now:s}),u=Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:l.allowed});return a.action==="refresh"?{text:G(i),buttons:u,prompt:null}:a.action==="deepen"?{text:null,buttons:null,prompt:`Deepen artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. Be terse. Do not sign or broadcast.`}:a.action==="ta"?{text:null,buttons:null,prompt:`TA artifact ${i.id}. Prior: ${i.summary||i.title}. Run deterministic TA on the coin/venue in the artifact (RSI divergence, S/R, candle patterns). Reply in this Telegram chat with the verdict rows and say what was drawn. Do not sign or broadcast.`}:a.action==="fa"?{text:null,buttons:null,prompt:`FA artifact ${i.id}. Prior: ${i.summary||i.title}. Run per-coin FA (funding, OI, book, premium) plus the separate MACRO thesis (M1/M2/Fed BS/net liquidity) if relevant. Cite receipts. Stay in this Telegram chat. Do not sign or broadcast.`}:a.action==="allow"?{text:"Allow is the graph. Open the ticket there and CONFIRM. Telegram did not send.",buttons:null,prompt:null}:a.action==="deny"?{text:`Denied ${i.id}. Ticket cancelled. Nothing signed.`,buttons:null,prompt:null}:a.action==="long"||a.action==="short"?{text:null,buttons:null,prompt:`Open the live graph ticket for a ${a.action} on artifact ${i.id}. Prior: ${i.summary||i.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`}:l.allowed?{text:`Queued unsigned prepare for ${i.id}. Nothing signed. Allow/Deny still required.`,buttons:u,prompt:null,prepare:{artifactId:i.id,unsigned:!0,broadcast:!1}}:{text:`Prepare blocked \u2014 ${l.reason}. Deepen and Refresh still work.`,buttons:u,prompt:null}}function ee(t={},{grant:e=null,now:r=Date.now(),state:o}={}){let s=o||T(),a=String(t.id||`art-${Math.abs(Number(r)).toString(36)}`).toLowerCase().slice(0,40),i=Ie(s,{...t,id:a},{now:r}),l=A({grant:e},{now:r});return{text:G({...i,grant:e}),replyMarkup:Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:l.allowed}).replyMarkup,artifact:i,state:s}}var U=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
1
+ import{createHash as we,randomBytes as $e}from"node:crypto";import{mkdirSync as Se,readFileSync as Ce,writeFileSync as Re}from"node:fs";import{homedir as Ae}from"node:os";import{dirname as Ne,join as j}from"node:path";var re=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function ne(t){let e=String(t||"").trim();if(!e||e.includes("ts.net")||!/^https:\/\//i.test(e))return null;try{return new URL(e)}catch{return null}}function U(t,{coin:e,side:r,sizeUsd:o,leverage:s,venue:a,confirm:i,user:u}={}){let l=ne(t);if(!l)return null;if(e&&re.test(String(e).toUpperCase())&&l.searchParams.set("coin",String(e).toUpperCase()),(r==="long"||r==="short")&&l.searchParams.set("side",r),Number.isFinite(Number(o))&&Number(o)>=1&&l.searchParams.set("size",String(Math.min(1e5,Math.round(Number(o))))),Number.isInteger(Number(s))&&Number(s)>=1&&l.searchParams.set("lev",String(Math.min(50,Number(s)))),a){let b=String(a).toLowerCase()==="hl"?"hyperliquid":String(a).toLowerCase();l.searchParams.set("venue",b)}else l.searchParams.get("venue")||l.searchParams.set("venue","hyperliquid");return l.searchParams.set("view","perps"),l.searchParams.set("build","1"),i&&/^[0-9a-f]{32}$/i.test(String(i))&&l.searchParams.set("confirm",String(i).toLowerCase()),u&&/^0x[0-9a-fA-F]{40}$/.test(String(u))&&l.searchParams.set("user",String(u).toLowerCase()),l.toString()}var ie={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}},oe=new Map(Object.values(ie).map(t=>[t.chainId,t]));function H(t){return oe.get(Number(t))||null}var Ue=Object.freeze([100,50,25]),He=Object.freeze([100,50,25,10]);var c="UNKNOWN",ze=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),ae=/[_*[\]`]/g;function n(t){return d(t)?String(t).replace(ae,e=>`\\${e}`):c}function d(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function f(t){if(!d(t))return c;let e=String(t).replace(/`/g,"");return e===""?c:`\`${e}\``}function w(t,{decimals:e=2}={}){if(!d(t))return c;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):c}function p(t,{decimals:e=2}={}){let r=w(t,{decimals:e});return r===c?c:`${r} USD`}function I(t,{decimals:e=2}={}){let r=w(t,{decimals:e});return r===c?c:`${r}%`}function N(t){let e=w(t,{decimals:0});return e===c?c:`${e} bps`}function $(t,e){if(!d(t))return c;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return c;let o;try{o=BigInt(typeof t=="string"?t.trim():t)}catch{return c}let s=o<0n,a=s?-o:o,i=10n**BigInt(r),u=(a/i).toString(),l=(a%i).toString().padStart(r,"0").replace(/0+$/,"");return`${s?"-":""}${u}${l?`.${l}`:""}`}function E(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?c:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return c}function k(t={}){let e=t.chainId;if(!d(e)||!Number.isFinite(Number(e)))return d(t.chain)?n(t.chain):c;let o=H(e)?.name||(d(t.chain)?String(t.chain):c);return`${n(o)} (chainId ${Number(e)})`}function D(t={}){return n(t.venue??t.dex??t.pool?.venue)}function se(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?f(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${d(t.error)?` \u2014 ${n(t.error)}`:""} (text card stands)`:d(t.url)?f(t.url):"NONE (text card only)"}function R(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let o=r.expiresAt??r.expiry;if(d(o)){let a=typeof o=="number"?o:Date.parse(o);if(!Number.isFinite(a))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(a<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function ce(t){let e=R(t);return e.allowed?`${e.actions.map(r=>n(r)).join(" / ")} (${n(e.reason)})`:`prepare-only \u2014 ${n(e.reason)}`}function h(t,e,r={}){let o=[`*${t}*`];for(let[s,a]of e)o.push(`${s}: ${a==null||a===""?c:a}`);return o.push(`Chart: ${se(r.chart)}`),o.push(`Actions: ${ce(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(s=>n(s)).join("; ")}`),(d(r.source)||d(r.fetchedAt))&&o.push(`Source: ${n(r.source)} at ${n(r.fetchedAt)}`),o.join(`
2
+ `)}function g(t){return["Confidence",E(t.confidence)]}function le(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=d(e.decimals)?$(e.amountOutRaw??e.out??e.raw,e.decimals):c;return[["Quote out (raw)",f(e.amountOutRaw??e.out??e.raw)],["Quote out",r===c?c:`${n(r)} ${n(e.symbol??"")}`.trim()]]}function F(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",c];let r=N(e.selectedBps),o=N(e.capBps);return["Auto-slippage",r===c&&o===c?c:`${r} selected, cap ${o}`]}function ue(t={}){let e=t||{};return h(`ORACLE TOKEN \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Name",n(e.name)],["Address",f(e.address??e.mint??e.contract)],["Price",p(e.priceUsd,{decimals:8})],["Market cap",p(e.marketCapUsd)],["Liquidity",p(e.liquidityUsd)],["Volume 24h",p(e.volume24hUsd)],["Change 24h",I(e.priceChange24h)],["Fee tier",d(e.feeTier)?`${N(Number(e.feeTier)/100)} (${w(e.feeTier,{decimals:0})})`:c],["Age",n(e.age)],...le(e),F(e),g(e)],e)}function de(t={}){let e=t||{};return h(`ORACLE LAUNCH \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Address",f(e.address??e.mint??e.contract)],["Pool",f(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",p(e.liquidityUsd)],["Route ready",n(e.routeReady)],["Sellable",n(e.sellable)],["Sell sim",n(e.sellSimulation??e.sellSim)],["Smart wallets",n(e.smartWalletOverlap)],["Risk",n(e.risk??e.riskStatus)],["Prepared ticket",n(e.preparedTicket??e.ticketStatus)],F(e),g(e)],e)}function pe(t={}){let e=t||{};return h(`ORACLE HIP-3 \u2014 ${n(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${n(e.dex)}`],["Market",n(e.market??e.coin)],["Mark",p(e.markPx,{decimals:6})],["Oracle",p(e.oraclePx,{decimals:6})],["Funding",I(e.funding,{decimals:6})],["Open interest",p(e.openInterestUsd)],["Depth",n(e.depth)],["Liquidation notes",n(e.liquidationNotes??e.riskNotes)],["Account context",n(e.accountContext)],g(e)],e)}function me(t={}){let e=t||{};return h(`ORACLE HIP-4 \u2014 ${n(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${n(e.dex??"outcome")}`],["Event",n(e.event)],["Outcome",n(e.outcome)],["Market id",f(e.marketId??e.market)],["Bid",p(e.bid,{decimals:6})],["Ask",p(e.ask,{decimals:6})],["Depth",n(e.depth)],["Edge",I(e.edge)],["Position",n(e.position)],g(e)],e)}function fe(t={}){let e=t||{};return h(`ORACLE POLYMARKET \u2014 ${n(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",n(e.event)],["Market",n(e.market)],["Market id",f(e.marketId??e.conditionId??e.tokenId)],["Yes",p(e.yesPrice,{decimals:4})],["No",p(e.noPrice,{decimals:4})],["Best bid / ask",`${p(e.bestBid,{decimals:4})} / ${p(e.bestAsk,{decimals:4})}`],["Volume",p(e.volumeUsd)],["Resolution risk",n(e.resolutionRisk)],["Order intent",n(e.orderIntent)],g(e)],e)}function he(t={}){let e=t||{},r=d(e.completedSplits)&&d(e.totalSplits)?`${w(e.completedSplits,{decimals:0})} / ${w(e.totalSplits,{decimals:0})}`:c;return h(`ORACLE TWAP \u2014 ${n(e.pair??e.symbol??e.name)}`,[["Chain",k(e)],["Side",n(e.side??e.direction)],["Amount",`${n($(e.amountTotal??e.amount,e.decimals??18))} ${n(e.symbol??"")}`.trim()],["Splits",`${w(e.totalSplits,{decimals:0})} over ${n(e.window)}`],["Progress",r],["Avg price",p(e.averagePrice,{decimals:6})],["Next split",n(e.nextSplitAt)],["Slippage cap",N(e.slippageBps)],["Status",n(e.status)],g(e)],e)}function ge(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${n(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return h(`ORACLE BRIDGE \u2014 ${n(e.pair??e.fromSymbol)} \u2192 ${n(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",k({chainId:e.fromChainId,chain:e.fromChain})],["To chain",k({chainId:e.toChainId,chain:e.toChain})],["Amount",`${n($(e.amount,e.fromDecimals??18))} ${n(e.fromSymbol??"")}`.trim()],["Best route",n(e.bestRoute??e.winner)],["Est. received",`${n($(e.amountOut,e.toDecimals??18))} ${n(e.toSymbol??"")}`.trim()],["Fee",p(e.feeUsd)],["Est. time",n(e.estimatedTime)],["Revoke check",o],["All providers",n(e.providers?.join(", "))],["Preparable",n(e.preparable)],g(e)],e)}function be(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let s=n(o.source??o.venue??o.name),a=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),i=Number.isFinite(a)?`${Math.abs(a).toFixed(0)} bps behind`:"spread UNKNOWN";return`${s} (${i})`});return r.length?r.join("; "):c}function ke(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return d(e)?n(e):c}function ye(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,o=e.bridge&&typeof e.bridge=="object"?e.bridge:null,s=r.best??r.winner??{},a=`${n(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${n(e.tokenOutSymbol??e.toSymbol??"OUT")}`,i=[["Intent",n(e.intent??"swap")],["Chain",k({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${n($(e.amountIn??r.amountIn,e.decimalsIn??18))} ${n(e.tokenInSymbol??"")}`.trim()],["Best swap",n(s.source??s.venue??r.bestRoute??e.bestRoute)],["Net out",`${n($(s.netOut??s.amountOut??r.amountOut,e.decimalsOut??18))} ${n(e.tokenOutSymbol??"")}`.trim()],["Ranked on",ke(r)],["Gas accounted",n(s.costAccounted===!0?"yes":s.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",d(r.improvementBps)?`${n(r.improvementBps)} bps`:c],["Runners-up",be(r.routes??e.routes)]];if(o){let u=o.best??o.winner??{};i.push(["Best bridge",n(u.source??o.bestRoute??e.bestBridge)],["Bridge out",`${n($(u.netOut??u.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${n(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",k({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",n(o.estimatedTime??u.meta?.durationSeconds)])}else i.push(["Best bridge","same-chain \u2014 use Best swap"]);return i.push(["Preparable",n(e.preparable??s.executionReady)],g(e)),h(`ORACLE SWAP \u2014 ${a}`,i,e)}function xe(t={}){let e=t||{};return h("ORACLE APPROVE \u2014 local signer",[["Pending id",f(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",n(e.surface)],["Action",n(e.action)],["Chain",k({chainId:e.chain??e.chainId,chain:e.chainName})],["To",f(e.to??e.destination)],["Value",d(e.value)?n(e.value):c],["Signer",n(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],g({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var We=Object.freeze({token:ue,launch:de,hip3:pe,hip4:me,polymarket:fe,twap:he,bridge:ge,swap:ye,approve:xe});var _e=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny"]),Oe=new Set(_e),v=/^[a-z0-9-]{4,40}$/i,q=/^[0-9a-f]{32}$/,z=/^\d+$/;function P(t=process.env){return j(t.ORACLE_CONFIG_DIR||j(Ae(),".config","oracle"),"telegram-cards.json")}function S(){return{links:{},artifacts:{},threads:{}}}var A=S();function T(){return A}function W(t,{readFile:e=Ce}={}){try{let r=JSON.parse(String(e(t)));A={links:r.links&&typeof r.links=="object"?r.links:{},artifacts:r.artifacts&&typeof r.artifacts=="object"?r.artifacts:{},threads:r.threads&&typeof r.threads=="object"?r.threads:{}}}catch{A=S()}return A}function V(t,e=A,{writeFile:r=Re,mkdir:o=Se}={}){o(Ne(t),{recursive:!0,mode:448}),r(t,JSON.stringify(e),{mode:384})}function y(t){return t==null?!1:typeof t=="string"?t.trim()!=="":!0}function K(t){return we("sha256").update(String(t)).digest("hex")}function L(t){if(Array.isArray(t))return t.map(L);if(!t||typeof t!="object")return t;let e={};for(let[r,o]of Object.entries(t))/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(r)||(e[r]=L(o));return e}function Ie(t){let r=String(t||"").trim().match(/^oracle:card:(deepen|refresh|prepare|ta|fa|long|short|allow|deny):([a-z0-9-]{4,40})$/i);return r?{action:r[1].toLowerCase(),artifactId:r[2].toLowerCase()}:null}function Y({platform:t="telegram",artifactId:e,openUrl:r,hasGrant:o=!1}={}){let s=String(e||"").trim().toLowerCase();if(!v.test(s))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let a=[],i=[{text:"TA",callback_data:`oracle:card:ta:${s}`},{text:"FA",callback_data:`oracle:card:fa:${s}`}],u=O=>U(r,{side:O}),l=u("long"),b=u("short"),x=l&&b?[{text:"LONG",url:l},{text:"SHORT",url:b}]:[{text:"LONG",callback_data:`oracle:card:long:${s}`},{text:"SHORT",callback_data:`oracle:card:short:${s}`}];return y(r)?(a.push([{text:"Open",url:String(r)},i[0]]),a.push(x),a.push(o?[i[1],{text:"Prep",callback_data:`oracle:card:prepare:${s}`}]:[i[1]])):(a.push(i),a.push(x),o&&a.push([{text:"Prep",callback_data:`oracle:card:prepare:${s}`}])),String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:a.filter(O=>O.length>0)},cancelHint:"LONG/SHORT open the graph. CONFIRM there. Telegram never sends."}:{kind:"text_menu",text:"TA / FA / LONG / SHORT",cancelHint:""}}function G(t={}){let r=[`*${y(t.title)?n(t.title):"Oracle artifact"}*`,`Kind: ${y(t.kind)?n(t.kind):c}`,`Id: ${y(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:c}`,`Summary: ${y(t.summary)?n(t.summary):c}`,`Confidence: ${E(t.confidence)}`];(y(t.source)||y(t.fetchedAt))&&r.push(`Source: ${n(t.source)} at ${n(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(s=>n(s)).join("; ")}`);let o=R(t);return r.push(o.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${n(o.reason)}`),r.join(`
3
+ `)}function Ee(t,e={},{now:r=Date.now()}={}){let o=t||S(),s=String(e.id||"").trim().toLowerCase();if(!v.test(s))throw new TypeError("artifact id required");let a={id:s,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:y(e.openUrl)?String(e.openUrl):null,confidence:e.confidence,source:e.source||"oracle",fetchedAt:e.fetchedAt||new Date(r).toISOString(),warnings:Array.isArray(e.warnings)?e.warnings.map(String):[],payload:L(e.payload||{}),createdAt:new Date(r).toISOString()};return o.artifacts[s]=a,a}function B(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),i=String(r||"").trim().toLowerCase();if(!a)throw new TypeError("chat id required");if(!v.test(i))throw new TypeError("artifact id required");return s.threads[a]={artifactId:i,updatedAt:o},s.threads[a]}function J(t,{chatId:e,text:r}={}){let o=String(e||"").trim(),s=String(r||"").trim();if(!o||!s||/^\//.test(s))return null;let a=t?.threads?.[o];if(!a?.artifactId)return null;let i=t.artifacts?.[a.artifactId];return i?`Continue artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. User: ${s}`:null}function Q(t,{ownerId:e,botUsername:r,now:o=Date.now(),ttlMs:s=600*1e3,token:a,randomBytes:i=$e}={}){let u=t||S(),l=String(e||"").trim(),b=String(r||"").replace(/^@/,"").trim();if(!z.test(l))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(b))throw new TypeError("bot username required");let x=a||i(16).toString("hex");if(!q.test(x))throw new TypeError("link token must be 32 hex chars");return u.links[K(x)]={ownerId:l,expiresAt:o+Number(s)},{token:x,url:`https://t.me/${b}?start=${x}`,expiresAt:o+Number(s)}}function Z(t,{token:e,telegramUserId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),i=String(r||"").trim();if(!q.test(a))return{ok:!1,error:"invalid start token"};if(!z.test(i))return{ok:!1,error:"invalid telegram user"};let u=K(a),l=s.links[u];return l?(delete s.links[u],Number(l.expiresAt)<=o?{ok:!1,error:"start token expired"}:String(l.ownerId)!==i?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:i}):{ok:!1,error:"unknown or already used start token"}}function X(t,{data:e,chatId:r,grant:o=null,now:s=Date.now()}={}){let a=Ie(e);if(!a)return null;if(!Oe.has(a.action))return{text:"That card action is not available.",buttons:null};let i=t?.artifacts?.[a.artifactId];if(!i)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};r&&B(t,{chatId:r,artifactId:i.id,now:s});let u=R({grant:o},{now:s}),l=Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:u.allowed});return a.action==="refresh"?{text:G(i),buttons:l,prompt:null}:a.action==="deepen"?{text:null,buttons:null,prompt:`Deepen artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. Be terse. Do not sign or broadcast.`}:a.action==="ta"?{text:null,buttons:null,prompt:`TA artifact ${i.id}. Prior: ${i.summary||i.title}. Run deterministic TA on the coin/venue in the artifact (RSI divergence, S/R, candle patterns). Reply in this Telegram chat with the verdict rows and say what was drawn. Do not sign or broadcast.`}:a.action==="fa"?{text:null,buttons:null,prompt:`FA artifact ${i.id}. Prior: ${i.summary||i.title}. Run per-coin FA (funding, OI, book, premium) plus the separate MACRO thesis (M1/M2/Fed BS/net liquidity) if relevant. Cite receipts. Stay in this Telegram chat. Do not sign or broadcast.`}:a.action==="allow"?{text:"Allow is the graph. Open the ticket there and CONFIRM. Telegram did not send.",buttons:null,prompt:null}:a.action==="deny"?{text:`Denied ${i.id}. Ticket cancelled. Nothing signed.`,buttons:null,prompt:null}:a.action==="long"||a.action==="short"?{text:null,buttons:null,prompt:`Open the live graph ticket for a ${a.action} on artifact ${i.id}. Prior: ${i.summary||i.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`}:u.allowed?{text:`Queued unsigned prepare for ${i.id}. Nothing signed. Allow/Deny still required.`,buttons:l,prompt:null,prepare:{artifactId:i.id,unsigned:!0,broadcast:!1}}:{text:`Prepare blocked \u2014 ${u.reason}. Deepen and Refresh still work.`,buttons:l,prompt:null}}function ee(t={},{grant:e=null,now:r=Date.now(),state:o}={}){let s=o||T(),a=String(t.id||`art-${Math.abs(Number(r)).toString(36)}`).toLowerCase().slice(0,40),i=Ee(s,{...t,id:a},{now:r}),u=R({grant:e},{now:r});return{text:G({...i,grant:e}),replyMarkup:Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:u.allowed}).replyMarkup,artifact:i,state:s}}var M=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
4
4
 
5
5
  oracle telegram link --owner <tg-id> --bot <username>
6
6
  oracle telegram redeem --token <32hex> --user <tg-id>
@@ -10,10 +10,10 @@ import{createHash as we,randomBytes as $e}from"node:crypto";import{mkdirSync as
10
10
 
11
11
  Native oracle-gateway uses the same module. Hermes is an optional adapter that
12
12
  must call this CLI instead of owning card state. Prepare is unsigned. Execute
13
- stays on Allow/Deny.`;function f(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function te(t,e){return t.includes(e)}function Ee(){return W(P()),T()}function _(t){z(P(),t)}function C(t,e){t.write(JSON.stringify(e)+`
14
- `)}async function ve(t=[],e={}){let r=e.out??process.stdout,o=e.err??process.stderr,s=t[0];if(!s||s==="--help"||s==="-h"||s==="help")return r.write(U+`
15
- `),0;let a=Ee();if(s==="link")try{let i=Q(a,{ownerId:f(t,"--owner"),botUsername:f(t,"--bot")});return _(a),C(r,{ok:!0,...i}),0}catch(i){return o.write(String(i.message||i)+`
16
- `),1}if(s==="redeem"){let i=Z(a,{token:f(t,"--token"),telegramUserId:f(t,"--user")});return _(a),C(r,i),i.ok?0:1}if(s==="wrap")try{let i=ee({id:f(t,"--id"),kind:f(t,"--kind")||"thesis",title:f(t,"--title")||"Oracle artifact",summary:f(t,"--summary")||"",openUrl:f(t,"--url"),source:"oracle-telegram"},{grant:te(t,"--grant")?{local:!0}:null,state:a}),l=f(t,"--chat");return l&&B(a,{chatId:l,artifactId:i.artifact.id}),_(a),C(r,{ok:!0,text:i.text,replyMarkup:i.replyMarkup||null,artifactId:i.artifact.id,fallback:`Reply: deepen ${i.artifact.id} | refresh ${i.artifact.id}`}),0}catch(i){return o.write(String(i.message||i)+`
17
- `),1}if(s==="callback"){let i=X(a,{data:f(t,"--data"),chatId:f(t,"--chat"),grant:te(t,"--grant")?{local:!0}:null});return _(a),i?(C(r,{ok:!0,...i}),0):(C(r,{ok:!1,error:"not an interactive card callback"}),1)}if(s==="continue"){let i=J(a,{chatId:f(t,"--chat"),text:f(t,"--text")});return C(r,{ok:!0,prompt:i}),0}return o.write(`unknown telegram verb '${s}'
18
- ${U}
19
- `),1}var Ke={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:U,run:t=>ve(t.argv||[])};export{Ke as default,ve as run};
13
+ stays on Allow/Deny.`;function m(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function te(t,e){return t.includes(e)}function Le(){return W(P()),T()}function _(t){V(P(),t)}function C(t,e){t.write(JSON.stringify(e)+`
14
+ `)}async function ve(t=[],e={}){let r=e.out??process.stdout,o=e.err??process.stderr,s=t[0];if(!s||s==="--help"||s==="-h"||s==="help")return r.write(M+`
15
+ `),0;let a=Le();if(s==="link")try{let i=Q(a,{ownerId:m(t,"--owner"),botUsername:m(t,"--bot")});return _(a),C(r,{ok:!0,...i}),0}catch(i){return o.write(String(i.message||i)+`
16
+ `),1}if(s==="redeem"){let i=Z(a,{token:m(t,"--token"),telegramUserId:m(t,"--user")});return _(a),C(r,i),i.ok?0:1}if(s==="wrap")try{let i=ee({id:m(t,"--id"),kind:m(t,"--kind")||"thesis",title:m(t,"--title")||"Oracle artifact",summary:m(t,"--summary")||"",openUrl:m(t,"--url"),source:"oracle-telegram"},{grant:te(t,"--grant")?{local:!0}:null,state:a}),u=m(t,"--chat");return u&&B(a,{chatId:u,artifactId:i.artifact.id}),_(a),C(r,{ok:!0,text:i.text,replyMarkup:i.replyMarkup||null,artifactId:i.artifact.id,fallback:`Reply: deepen ${i.artifact.id} | refresh ${i.artifact.id}`}),0}catch(i){return o.write(String(i.message||i)+`
17
+ `),1}if(s==="callback"){let i=X(a,{data:m(t,"--data"),chatId:m(t,"--chat"),grant:te(t,"--grant")?{local:!0}:null});return _(a),i?(C(r,{ok:!0,...i}),0):(C(r,{ok:!1,error:"not an interactive card callback"}),1)}if(s==="continue"){let i=J(a,{chatId:m(t,"--chat"),text:m(t,"--text")});return C(r,{ok:!0,prompt:i}),0}return o.write(`unknown telegram verb '${s}'
18
+ ${M}
19
+ `),1}var tt={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:M,run:t=>ve(t.argv||[])};export{tt as default,ve as run};
@@ -1,3 +1,3 @@
1
- var Y=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(o){throw t=[o],o}};import g from"node:fs";import Ne from"node:os";import f from"node:path";import{fileURLToPath as Le}from"node:url";function W(){return process.env.ORACLE_FAKE_HOME||Ne.homedir()}function Pe(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function y(){return Pe()?process.env.ORACLE_CONFIG_DIR||f.join(W(),".config","oracle"):f.join(W(),".config","oracle")}function Re(){return f.join(y(),"desk.json")}function Be(){return f.join(y(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let r={},t=(i,n)=>{if(n==null)return;let a=String(n).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,r[i]=a))};try{let i=Be();if(g.existsSync(i))for(let n of g.readFileSync(i,"utf8").split(/\r?\n/)){let a=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),t(a[1],s)}}catch{}try{let i=Re();if(g.existsSync(i)){let n=JSON.parse(g.readFileSync(i,"utf8"));n&&typeof n=="object"&&(t("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),t("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),t("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),t("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),t("ORACLE_EXEC_URL",n.execUrl),t("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(t("ORACLE_DESK_URL",o),t("ORACLE_DATA_URL",o),t("ORACLE_API_URL",o),t("ORACLE_PUBLIC_URL",o),t("MAD_DESK_URL",o)),d._result=Object.keys(r).length?r:null,d._result}var _e,Ss,H=Y(()=>{_e=f.dirname(Le(import.meta.url)),Ss=f.resolve(_e,"../..");try{d()}catch{}});var x={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}},Ve=new Map(Object.values(x).map(e=>[e.chainId,e]));import N from"node:fs";import z from"node:path";import{homedir as Oe}from"node:os";function S(e){let r=e?.transactionHash||e?.hash||e?.txid||null;return r?{happened:!0,hash:String(r),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import c from"node:path";import ke from"node:os";import{createHash as Te,randomBytes as va}from"node:crypto";import{Interface as C,keccak256 as ka}from"ethers";import{Transaction as Oa}from"@scure/btc-signer";import{ed25519 as Na}from"@noble/curves/ed25519.js";import{base58 as yo}from"@scure/base";import{Interface as F}from"ethers";import{Interface as re,MaxUint256 as Nt,isAddress as Lt,keccak256 as _t,toUtf8Bytes as Pt}from"ethers";import{Interface as ee,isAddress as dt}from"ethers";import{isAddress as it}from"ethers";var wt=new ee(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as te,isAddress as yt}from"ethers";var St=new te(["function approve(address spender,uint256 amount) returns (bool)"]),At=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Mt=new re(["function approve(address spender,uint256 amount) returns (bool)"]);var jt=300*1e3,Ut=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as Gt,NETWORK as Vt,OutScript as Kt,RawTx as Xt,SigHash as Yt,TEST_NETWORK as Qt,Transaction as Zt}from"@scure/btc-signer";import{createHash as oe}from"node:crypto";import{base58 as nr}from"@scure/base";import{getCompiledTransactionMessageDecoder as ir}from"@solana/transaction-messages";var _=e=>oe("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),ar=new Map([[_("route"),{name:"route",prefixBytes:0}],[_("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var mr=64*1024;var Ir=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),kr=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var Cr="0x"+"00".repeat(32);var ae=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Rr=Object.freeze(ae.map(e=>e[0]));import{TypedDataEncoder as fn,getAddress as pn}from"ethers";import{TypedDataEncoder as Mr,getAddress as Dr,isAddress as jr}from"ethers";var ce=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),ue=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as Qr,getAddress as Zr,isAddress as en}from"ethers";var Wr=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var le=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),cn=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var de=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"}]}),un=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var hn=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var ge=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Pn=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0});var ye=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Rn=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Bn=new F(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),$n=new F(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Fn=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var be=Object.freeze([...ge]),qn=Object.freeze({...ye});import{ed25519 as eo}from"@noble/curves/ed25519.js";import{base58 as ro}from"@scure/base";import{RawTx as oo,SigHash as io,Transaction as ao}from"@scure/btc-signer";import{Transaction as co,keccak256 as uo,verifyTypedData as lo}from"ethers";import{encode as jn}from"@msgpack/msgpack";import{keccak256 as zn,verifyTypedData as Wn}from"ethers";var Hn=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Jn=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var No=Object.freeze({N:1<<17,r:8,p:1}),Lo=256*1024*1024,_o=16*1024;var Ro=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as T}from"node:os";import{join as O}from"node:path";var M=process.env.ORACLE_PUBLIC_DESKTOP==="1",Se=M?process.env.ORACLE_CONFIG_DIR||O(T(),".config","oracle"):O(T(),".config","oracle"),qo=M?Se:O(T(),".config","mad-desk");var zo="0".repeat(64),Wo=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"});var Ho=Promise.resolve();import{Wallet as ti}from"ethers";import{base58 as ni}from"@scure/base";import{ed25519 as ii}from"@noble/curves/ed25519.js";import{NETWORK as si,TEST_NETWORK as ci,WIF as ui,p2wpkh as li}from"@scure/btc-signer";import{pubECDSA as fi}from"@scure/btc-signer/utils.js";var wi=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),hi=Object.freeze(["binance","bybit","okx","coinbase"]),gi=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),yi=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),bi=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Ei=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),xi=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Si=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),Ai=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),vi=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Ii=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var Ie=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),j=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Bi=256*1024;var ns=new C(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),os=new C(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),is=new C(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function U(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(ke.homedir(),".local","state"),"oracle"),t=Te("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(r,`signer-policy-${t}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(r,`signer-ledger-${t}.high-water`),cexOrders:c.join(e,"cex-orders.json"),cexOrdersAnchor:c.join(r,`cex-orders-${t}.high-water`),token:c.join(e,"signer-token"),lock:c.join(r,`signer-${t}.lock`)}}function Ce(){return process.env.ORACLE_CONFIG_DIR||z.join(Oe(),".config","oracle")}function h(){let e=U(z.join(Ce(),"signer")),r=N.existsSync(e.vault),t=N.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:N.existsSync(e.policy),armed:r&&!t,disarmed:t,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var hs=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);H();import G from"node:fs";import De from"node:path";var $e=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function b(e){return String(e||"").trim()||void 0}function Fe(e,{required:r=!1}={}){let t=b(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!$e.has(t))throw new Error(`unsupported provider: ${t}`);return t}function qe(e,{required:r=!1}={}){let t=b(e);if(!t){if(r)throw new Error("model is required");return}if(t.includes("..")||t.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(t))throw new Error("invalid model id");return t}function Me(e){let r=b(e);if(!r||r.length>2048)throw new Error("invalid custom base URL");let t;try{t=new URL(r)}catch{throw new Error("invalid custom base URL")}let o=t.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::1";if(t.protocol!=="https:"&&!(t.protocol==="http:"&&i)||t.username||t.password||t.search||t.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return t.toString().replace(/\/+$/,"")}function J({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=Fe(e),n=qe(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Me(t)};if(b(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var je=new Set(["auto","standalone","hermes","remote","arch"]);function Ue(){return De.join(y(),"model.json")}function p(e){return String(e||"").trim()||void 0}function ze(e={}){let r=p(e.backend)?.toLowerCase()||"auto",t=J({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=p(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=p(e.reasoningEffort),a=p(e.computeHost||e.remoteHost),s=p(e.computeUser||e.remoteUser),u=p(e.computePath||e.remotePath);if(!je.has(r))throw new Error(`unsupported backend: ${r}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(r))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(r==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:r,...t,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...u?{computePath:u}:{}}}function V(){let e=Ue();if(!G.existsSync(e))return null;try{return ze(JSON.parse(G.readFileSync(e,"utf8")))}catch{return null}}var We=new Set(["127.0.0.1","::1","localhost"]);function L({env:e=process.env,vault:r=null}={}){let t=r||h(),o=[];for(let[i,n]of Object.entries(x)){let a=(n.rpcEnv||[]).some(u=>String(e[u]||"").trim()),s="prepare";n.evm?a&&(s="live"):s="unavailable",o.push({key:i,chainId:n.chainId,name:n.name,family:"evm",status:s,execute:!!(t.vaultExists&&t.armed&&!t.disarmed),note:a?"rpc configured":"public read/prepare; set RPC for live reads"})}return o.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),o}function He({env:e=process.env,model:r=V(),vault:t=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(l,E,K,X=null)=>n.push({id:l,status:E,detail:K,fix:X}),s=(()=>{let[l,E]=process.versions.node.split(".").map(Number);return l>20||l===20&&E>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?null:"install node >= 20.19"),r?r.backend==="hermes"?a("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):a("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):a("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?a("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):a("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):a("vault","fail","no local vault","oracle sign init");let u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return We.has(u)?a("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${u} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?a("quote","ok",i.detail||"net quote returned"):a("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):a("quote","warn","quote not probed",null),{ok:!n.some(l=>l.status==="fail"),checks:n,venues:L({env:e,vault:t})}}async function qs(e=process.env){let r=e.ORACLE_SIGNER_HOST||"127.0.0.1",t=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${r}:${t}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Ms(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let t=(await e.json())?.pairs?.[0];return!t?.chainId||!t?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${t.chainId} ${t.baseToken?.symbol}/${t.quoteToken?.symbol} $${t.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var Ds={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let r=e.argv.includes("--json"),t=L();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
1
+ var Y=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(o){throw t=[o],o}};import g from"node:fs";import Ne from"node:os";import f from"node:path";import{fileURLToPath as Le}from"node:url";function H(){return process.env.ORACLE_FAKE_HOME||Ne.homedir()}function Pe(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function y(){return Pe()?process.env.ORACLE_CONFIG_DIR||f.join(H(),".config","oracle"):f.join(H(),".config","oracle")}function Re(){return f.join(y(),"desk.json")}function Be(){return f.join(y(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let r={},t=(i,n)=>{if(n==null)return;let a=String(n).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,r[i]=a))};try{let i=Be();if(g.existsSync(i))for(let n of g.readFileSync(i,"utf8").split(/\r?\n/)){let a=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),t(a[1],s)}}catch{}try{let i=Re();if(g.existsSync(i)){let n=JSON.parse(g.readFileSync(i,"utf8"));n&&typeof n=="object"&&(t("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),t("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),t("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),t("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),t("ORACLE_EXEC_URL",n.execUrl),t("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(t("ORACLE_DESK_URL",o),t("ORACLE_DATA_URL",o),t("ORACLE_API_URL",o),t("ORACLE_PUBLIC_URL",o),t("MAD_DESK_URL",o)),d._result=Object.keys(r).length?r:null,d._result}var _e,Ss,W=Y(()=>{_e=f.dirname(Le(import.meta.url)),Ss=f.resolve(_e,"../..");try{d()}catch{}});var x={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}},Ve=new Map(Object.values(x).map(e=>[e.chainId,e]));import N from"node:fs";import z from"node:path";import{homedir as Oe}from"node:os";function S(e){let r=e?.transactionHash||e?.hash||e?.txid||null;return r?{happened:!0,hash:String(r),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import c from"node:path";import ke from"node:os";import{createHash as Te,randomBytes as va}from"node:crypto";import{Interface as C,keccak256 as ka}from"ethers";import{Transaction as Oa}from"@scure/btc-signer";import{ed25519 as Na}from"@noble/curves/ed25519.js";import{base58 as yo}from"@scure/base";import{Interface as F}from"ethers";import{Interface as re,MaxUint256 as Nt,isAddress as Lt,keccak256 as _t,toUtf8Bytes as Pt}from"ethers";import{Interface as ee,isAddress as dt}from"ethers";import{isAddress as it}from"ethers";var wt=new ee(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as te,isAddress as yt}from"ethers";var St=new te(["function approve(address spender,uint256 amount) returns (bool)"]),At=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Mt=new re(["function approve(address spender,uint256 amount) returns (bool)"]);var jt=300*1e3,Ut=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as Gt,NETWORK as Vt,OutScript as Kt,RawTx as Xt,SigHash as Yt,TEST_NETWORK as Qt,Transaction as Zt}from"@scure/btc-signer";import{createHash as oe}from"node:crypto";import{base58 as nr}from"@scure/base";import{getCompiledTransactionMessageDecoder as ir}from"@solana/transaction-messages";var _=e=>oe("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),ar=new Map([[_("route"),{name:"route",prefixBytes:0}],[_("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var mr=64*1024;var Ir=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),kr=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var Cr="0x"+"00".repeat(32);var ae=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Rr=Object.freeze(ae.map(e=>e[0]));import{TypedDataEncoder as fn,getAddress as pn}from"ethers";import{TypedDataEncoder as Mr,getAddress as Dr,isAddress as jr}from"ethers";var ce=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),ue=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as Qr,getAddress as Zr,isAddress as en}from"ethers";var Hr=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var le=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),cn=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var de=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"}]}),un=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var hn=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var ge=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Pn=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0});var ye=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Rn=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Bn=new F(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),$n=new F(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Fn=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var be=Object.freeze([...ge]),qn=Object.freeze({...ye});import{ed25519 as eo}from"@noble/curves/ed25519.js";import{base58 as ro}from"@scure/base";import{RawTx as oo,SigHash as io,Transaction as ao}from"@scure/btc-signer";import{Transaction as co,keccak256 as uo,verifyTypedData as lo}from"ethers";import{encode as jn}from"@msgpack/msgpack";import{keccak256 as zn,verifyTypedData as Hn}from"ethers";var Wn=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Jn=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var No=Object.freeze({N:1<<17,r:8,p:1}),Lo=256*1024*1024,_o=16*1024;var Ro=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as T}from"node:os";import{join as O}from"node:path";var M=process.env.ORACLE_PUBLIC_DESKTOP==="1",Se=M?process.env.ORACLE_CONFIG_DIR||O(T(),".config","oracle"):O(T(),".config","oracle"),qo=M?Se:O(T(),".config","mad-desk");var zo="0".repeat(64),Ho=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"});var Wo=Promise.resolve();import{Wallet as ti}from"ethers";import{base58 as ni}from"@scure/base";import{ed25519 as ii}from"@noble/curves/ed25519.js";import{NETWORK as si,TEST_NETWORK as ci,WIF as ui,p2wpkh as li}from"@scure/btc-signer";import{pubECDSA as fi}from"@scure/btc-signer/utils.js";var wi=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),hi=Object.freeze(["binance","bybit","okx","coinbase"]),gi=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),yi=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),bi=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Ei=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),xi=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Si=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),Ai=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),vi=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Ii=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var Ie=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),j=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Bi=256*1024;var ns=new C(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),os=new C(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),is=new C(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function U(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(ke.homedir(),".local","state"),"oracle"),t=Te("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(r,`signer-policy-${t}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(r,`signer-ledger-${t}.high-water`),cexOrders:c.join(e,"cex-orders.json"),cexOrdersAnchor:c.join(r,`cex-orders-${t}.high-water`),token:c.join(e,"signer-token"),lock:c.join(r,`signer-${t}.lock`)}}function Ce(){return process.env.ORACLE_CONFIG_DIR||z.join(Oe(),".config","oracle")}function h(){let e=U(z.join(Ce(),"signer")),r=N.existsSync(e.vault),t=N.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:N.existsSync(e.policy),armed:r&&!t,disarmed:t,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var hs=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);W();import G from"node:fs";import De from"node:path";var $e=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function b(e){return String(e||"").trim()||void 0}function Fe(e,{required:r=!1}={}){let t=b(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!$e.has(t))throw new Error(`unsupported provider: ${t}`);return t}function qe(e,{required:r=!1}={}){let t=b(e);if(!t){if(r)throw new Error("model is required");return}if(t.includes("..")||t.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(t))throw new Error("invalid model id");return t}function Me(e){let r=b(e);if(!r||r.length>2048)throw new Error("invalid custom base URL");let t;try{t=new URL(r)}catch{throw new Error("invalid custom base URL")}let o=t.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::1";if(t.protocol!=="https:"&&!(t.protocol==="http:"&&i)||t.username||t.password||t.search||t.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return t.toString().replace(/\/+$/,"")}function J({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=Fe(e),n=qe(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Me(t)};if(b(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var je=new Set(["auto","standalone","hermes","remote","arch"]);function Ue(){return De.join(y(),"model.json")}function p(e){return String(e||"").trim()||void 0}function ze(e={}){let r=p(e.backend)?.toLowerCase()||"auto",t=J({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=p(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=p(e.reasoningEffort),a=p(e.computeHost||e.remoteHost),s=p(e.computeUser||e.remoteUser),u=p(e.computePath||e.remotePath);if(!je.has(r))throw new Error(`unsupported backend: ${r}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(r))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(r==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:r,...t,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...u?{computePath:u}:{}}}function V(){let e=Ue();if(!G.existsSync(e))return null;try{return ze(JSON.parse(G.readFileSync(e,"utf8")))}catch{return null}}var He=new Set(["127.0.0.1","::1","localhost"]);function L({env:e=process.env,vault:r=null}={}){let t=r||h(),o=[];for(let[i,n]of Object.entries(x)){let a=(n.rpcEnv||[]).some(u=>String(e[u]||"").trim()),s="prepare";n.evm?a&&(s="live"):s="unavailable",o.push({key:i,chainId:n.chainId,name:n.name,family:"evm",status:s,execute:!!(t.vaultExists&&t.armed&&!t.disarmed),note:a?"rpc configured":"public read/prepare; set RPC for live reads"})}return o.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),o}function We({env:e=process.env,model:r=V(),vault:t=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(l,E,K,X=null)=>n.push({id:l,status:E,detail:K,fix:X}),s=(()=>{let[l,E]=process.versions.node.split(".").map(Number);return l>20||l===20&&E>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?null:"install node >= 20.19"),r?r.backend==="hermes"?a("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):a("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):a("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?a("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):a("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):a("vault","fail","no local vault","oracle sign init");let u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return He.has(u)?a("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${u} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?a("quote","ok",i.detail||"net quote returned"):a("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):a("quote","warn","quote not probed",null),{ok:!n.some(l=>l.status==="fail"),checks:n,venues:L({env:e,vault:t})}}async function qs(e=process.env){let r=e.ORACLE_SIGNER_HOST||"127.0.0.1",t=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${r}:${t}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Ms(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let t=(await e.json())?.pairs?.[0];return!t?.chainId||!t?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${t.chainId} ${t.baseToken?.symbol}/${t.quoteToken?.symbol} $${t.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var Ds={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let r=e.argv.includes("--json"),t=L();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
2
2
  `),0;for(let o of t)process.stdout.write(`${o.status.padEnd(12)} ${o.key.padEnd(16)} ${o.name} exec=${o.execute?"local":"no"}
3
- `);return 0}};export{S as classifyReceipt,Ds as default,He as firstHourReport,Ms as probeQuote,qs as probeSigner,h as vaultStatus};
3
+ `);return 0}};export{S as classifyReceipt,Ds as default,We as firstHourReport,Ms as probeQuote,qs as probeSigner,h as vaultStatus};