@oracle-agent/oracle 0.35.48 → 0.35.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
- package/dist/agent-sessions.mjs +23 -23
- package/dist/artifacts/token-dashboard.mjs +1 -1
- package/dist/assets/profiles/near-agent/SOUL.md +46 -0
- package/dist/assets/profiles/near-agent/profile.json +30 -0
- package/dist/assets/profiles/oracle/SOUL.md +1 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-near/SKILL.md +66 -0
- package/dist/automation-plan.mjs +1 -1
- package/dist/bin/desk-server.mjs +33 -33
- package/dist/bin/oracle-data-mcp.mjs +16 -16
- package/dist/bin/oracle-gateway.mjs +3 -3
- package/dist/bin/oracle-investigate.mjs +1 -1
- package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +4 -4
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +27 -27
- package/dist/bin/oracle-scan.mjs +3 -3
- package/dist/bin/oracle-telegram-mcp.mjs +1 -1
- package/dist/chains.mjs +1 -1
- package/dist/cli/commands/account.mjs +26 -26
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/auth.mjs +16 -15
- package/dist/cli/commands/chain.mjs +5 -5
- package/dist/cli/commands/chat.mjs +309 -227
- package/dist/cli/commands/data.mjs +37 -37
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +237 -155
- package/dist/cli/commands/extension-policy.mjs +1 -1
- package/dist/cli/commands/farm.mjs +1 -1
- package/dist/cli/commands/follow.mjs +4 -4
- package/dist/cli/commands/harness.mjs +6 -6
- package/dist/cli/commands/mint.mjs +11 -11
- package/dist/cli/commands/model.mjs +313 -231
- package/dist/cli/commands/project.mjs +8 -7
- package/dist/cli/commands/quickstart.mjs +2 -2
- package/dist/cli/commands/receipt.mjs +2 -2
- package/dist/cli/commands/resolve.mjs +4 -4
- package/dist/cli/commands/session-vault.mjs +4 -4
- package/dist/cli/commands/setup.mjs +53 -52
- package/dist/cli/commands/snipe.mjs +13 -13
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +11 -11
- package/dist/cli/commands/telegram.mjs +7 -7
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/cli/project-access.mjs +4 -3
- package/dist/data/desk-data.mjs +31 -31
- package/dist/data/holder-table.mjs +2 -2
- package/dist/data/market-tape.mjs +1 -1
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +49 -49
- package/dist/investigator/index.mjs +1 -1
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/lp/index.mjs +4 -4
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +4 -4
- package/dist/task.mjs +1 -1
- package/dist/teams/index.mjs +6 -6
- package/dist/telegram/chart-card.mjs +5 -5
- package/dist/telegram/market-commands.mjs +1 -1
- package/dist/tui/standalone-client.mjs +176 -93
- package/package.json +2 -2
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +3 -3
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/eval/index.html +19 -19
- package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
- package/public/oracle-splash/index.html +9 -9
- package/server.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{createHash as nr,randomBytes as or}from"node:crypto";import{mkdirSync as ir,readFileSync as sr,writeFileSync as ar}from"node:fs";import{homedir as cr}from"node:os";import{dirname as ur,join as Be}from"node:path";function de(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}}var it=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function pe(t,{coin:e,side:r,sizeUsd:o,leverage:n,venue:i,confirm:s,user:l}={}){let d=de(t);if(!d)return null;if(e&&it.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(n))&&Number(n)>=1&&d.searchParams.set("lev",String(Math.min(50,Number(n)))),i){let c=String(i).toLowerCase()==="hl"?"hyperliquid":String(i).toLowerCase();d.searchParams.set("venue",c)}else d.searchParams.get("venue")||d.searchParams.set("venue","hyperliquid");return d.searchParams.set("view","perps"),d.searchParams.set("build","1"),s&&/^[0-9a-f]{32}$/i.test(String(s))&&d.searchParams.set("confirm",String(s).toLowerCase()),l&&/^0x[0-9a-fA-F]{40}$/.test(String(l))&&d.searchParams.set("user",String(l).toLowerCase()),d.toString()}var Q={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}};var st=new Map(Object.values(Q).map(t=>[t.chainId,t]));function J(t){return st.get(Number(t))||null}var at=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);var ct=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});var qr=Object.freeze([100,50,25]),Hr=Object.freeze([100,50,25,10]);var p="UNKNOWN",Wr=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),ut=/[_*[\]`]/g;function a(t){return g(t)?String(t).replace(ut,e=>`\\${e}`):p}function g(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function $(t){if(!g(t))return p;let e=String(t).replace(/`/g,"");return e===""?p:`\`${e}\``}function M(t,{decimals:e=2}={}){if(!g(t))return p;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):p}function y(t,{decimals:e=2}={}){let r=M(t,{decimals:e});return r===p?p:`${r} USD`}function Z(t,{decimals:e=2}={}){let r=M(t,{decimals:e});return r===p?p:`${r}%`}function j(t){let e=M(t,{decimals:0});return e===p?p:`${e} bps`}function B(t,e){if(!g(t))return p;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return p;let o;try{o=BigInt(typeof t=="string"?t.trim():t)}catch{return p}let n=o<0n,i=n?-o:o,s=10n**BigInt(r),l=(i/s).toString(),d=(i%s).toString().padStart(r,"0").replace(/0+$/,"");return`${n?"-":""}${l}${d?`.${d}`:""}`}function ee(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?p: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 p}function P(t={}){let e=t.chainId;if(!g(e)||!Number.isFinite(Number(e)))return g(t.chain)?a(t.chain):p;let o=J(e)?.name||(g(t.chain)?String(t.chain):p);return`${a(o)} (chainId ${Number(e)})`}function fe(t={}){return a(t.venue??t.dex??t.pool?.venue)}function lt(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?$(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${g(t.error)?` \u2014 ${a(t.error)}`:""} (text card stands)`:g(t.url)?$(t.url):"NONE (text card only)"}function F(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(g(o)){let i=typeof o=="number"?o:Date.parse(o);if(!Number.isFinite(i))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(i<=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 dt(t){let e=F(t);return e.allowed?`${e.actions.map(r=>a(r)).join(" / ")} (${a(e.reason)})`:`prepare-only \u2014 ${a(e.reason)}`}function N(t,e,r={}){let o=[`*${t}*`];for(let n of e){if(!n)continue;let[i,s]=n;o.push(`${i}: ${s==null||s===""?p:s}`)}return o.push(`Chart: ${lt(r.chart)}`),o.push(`Actions: ${dt(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(n=>a(n)).join("; ")}`),(g(r.source)||g(r.fetchedAt))&&o.push(`Source: ${a(r.source)} at ${a(r.fetchedAt)}`),o.join(`
|
|
2
|
-
`)}function _(t){let e=ee(t.confidence);return e===p?null:["Confidence",e]}function pt(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=g(e.decimals)?B(e.amountOutRaw??e.out??e.raw,e.decimals):p;return[["Quote out (raw)",$(e.amountOutRaw??e.out??e.raw)],["Quote out",r===p?p:`${a(r)} ${a(e.symbol??"")}`.trim()]]}function me(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",p];let r=j(e.selectedBps),o=j(e.capBps);return["Auto-slippage",r===p&&o===p?p:`${r} selected, cap ${o}`]}function ft(t={}){let e=t||{};return N(`ORACLE TOKEN \u2014 ${a(e.symbol??e.token??e.name)}`,[["Chain",P(e)],["Venue",fe(e)],["Name",a(e.name)],["Address",$(e.address??e.mint??e.contract)],["Price",y(e.priceUsd,{decimals:8})],["Market cap",y(e.marketCapUsd)],["Liquidity",y(e.liquidityUsd)],["Volume 24h",y(e.volume24hUsd)],["Change 24h",Z(e.priceChange24h)],["Fee tier",g(e.feeTier)?`${j(Number(e.feeTier)/100)} (${M(e.feeTier,{decimals:0})})`:p],["Age",a(e.age)],...pt(e),me(e),_(e)],e)}function mt(t={}){let e=t||{};return N(`ORACLE LAUNCH \u2014 ${a(e.symbol??e.token??e.name)}`,[["Chain",P(e)],["Venue",fe(e)],["Address",$(e.address??e.mint??e.contract)],["Pool",$(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",y(e.liquidityUsd)],["Route ready",a(e.routeReady)],["Sellable",a(e.sellable)],["Sell sim",a(e.sellSimulation??e.sellSim)],["Smart wallets",a(e.smartWalletOverlap)],["Risk",a(e.risk??e.riskStatus)],["Prepared ticket",a(e.preparedTicket??e.ticketStatus)],me(e),_(e)],e)}function ht(t={}){let e=t||{};return N(`ORACLE HIP-3 \u2014 ${a(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${a(e.dexName?`${e.dexName} (${e.dex})`:e.dex)}`],["Market",a(e.market??e.coin)],["Mark",y(e.markPx,{decimals:6})],["Oracle",y(e.oraclePx,{decimals:6})],["Funding",Z(e.funding,{decimals:6})],["Open interest",y(e.openInterestUsd)],["Depth",a(e.depth)],["Liquidation notes",a(e.liquidationNotes??e.riskNotes)],["Account context",a(e.accountContext)],_(e)],e)}function bt(t={}){let e=t||{};return N(`ORACLE HIP-4 \u2014 ${a(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${a(e.dex??"outcome")}`],["Event",a(e.event)],["Outcome",a(e.outcome)],["Market id",$(e.marketId??e.market)],["Bid",y(e.bid,{decimals:6})],["Ask",y(e.ask,{decimals:6})],["Depth",a(e.depth)],["Edge",Z(e.edge)],["Position",a(e.position)],_(e)],e)}function gt(t={}){let e=t||{};return N(`ORACLE POLYMARKET \u2014 ${a(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",a(e.event)],["Market",a(e.market)],["Market id",$(e.marketId??e.conditionId??e.tokenId)],["Yes",y(e.yesPrice,{decimals:4})],["No",y(e.noPrice,{decimals:4})],["Best bid / ask",`${y(e.bestBid,{decimals:4})} / ${y(e.bestAsk,{decimals:4})}`],["Volume",y(e.volumeUsd)],["Resolution risk",a(e.resolutionRisk)],["Order intent",a(e.orderIntent)],_(e)],e)}function wt(t={}){let e=t||{},r=g(e.completedSplits)&&g(e.totalSplits)?`${M(e.completedSplits,{decimals:0})} / ${M(e.totalSplits,{decimals:0})}`:p;return N(`ORACLE TWAP \u2014 ${a(e.pair??e.symbol??e.name)}`,[["Chain",P(e)],["Side",a(e.side??e.direction)],["Amount",`${a(B(e.amountTotal??e.amount,e.decimals??18))} ${a(e.symbol??"")}`.trim()],["Splits",`${M(e.totalSplits,{decimals:0})} over ${a(e.window)}`],["Progress",r],["Avg price",y(e.averagePrice,{decimals:6})],["Next split",a(e.nextSplitAt)],["Slippage cap",j(e.slippageBps)],["Status",a(e.status)],_(e)],e)}function yt(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${a(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return N(`ORACLE BRIDGE \u2014 ${a(e.pair??e.fromSymbol)} \u2192 ${a(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",P({chainId:e.fromChainId,chain:e.fromChain})],["To chain",P({chainId:e.toChainId,chain:e.toChain})],["Amount",`${a(B(e.amount,e.fromDecimals??18))} ${a(e.fromSymbol??"")}`.trim()],["Best route",a(e.bestRoute??e.winner)],["Est. received",`${a(B(e.amountOut,e.toDecimals??18))} ${a(e.toSymbol??"")}`.trim()],["Fee",y(e.feeUsd)],["Est. time",a(e.estimatedTime)],["Revoke check",o],["All providers",a(e.providers?.join(", "))],["Preparable",a(e.preparable)],_(e)],e)}function xt(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let n=a(o.source??o.venue??o.name),i=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),s=Number.isFinite(i)?`${Math.abs(i).toFixed(0)} bps behind`:"spread UNKNOWN";return`${n} (${s})`});return r.length?r.join("; "):p}function St(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return g(e)?a(e):p}function kt(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,o=e.bridge&&typeof e.bridge=="object"?e.bridge:null,n=r.best??r.winner??{},i=`${a(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${a(e.tokenOutSymbol??e.toSymbol??"OUT")}`,s=[["Intent",a(e.intent??"swap")],["Chain",P({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",i],["Amount in",`${a(B(e.amountIn??r.amountIn,e.decimalsIn??18))} ${a(e.tokenInSymbol??"")}`.trim()],["Best swap",a(n.source??n.venue??r.bestRoute??e.bestRoute)],["Net out",`${a(B(n.netOut??n.amountOut??r.amountOut,e.decimalsOut??18))} ${a(e.tokenOutSymbol??"")}`.trim()],["Ranked on",St(r)],["Gas accounted",a(n.costAccounted===!0?"yes":n.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",g(r.improvementBps)?`${a(r.improvementBps)} bps`:p],["Runners-up",xt(r.routes??e.routes)]];if(o){let l=o.best??o.winner??{};s.push(["Best bridge",a(l.source??o.bestRoute??e.bestBridge)],["Bridge out",`${a(B(l.netOut??l.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${a(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",P({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",a(o.estimatedTime??l.meta?.durationSeconds)])}else s.push(["Best bridge","same-chain \u2014 use Best swap"]);return s.push(["Preparable",a(e.preparable??n.executionReady)],_(e)),N(`ORACLE SWAP \u2014 ${i}`,s,e)}function Et(t={}){let e=t||{};return N("ORACLE APPROVE \u2014 local signer",[["Pending id",$(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",a(e.surface)],["Action",a(e.action)],["Chain",P({chainId:e.chain??e.chainId,chain:e.chainName})],["To",$(e.to??e.destination)],["Value",g(e.value)?a(e.value):p],["Signer",a(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],_({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var Gr=Object.freeze({token:ft,launch:mt,hip3:ht,hip4:bt,polymarket:gt,twap:wt,bridge:yt,swap:kt,approve:Et});import{AbiCoder as Mt,Interface as Bt,getAddress as Ae,isAddress as Dt}from"ethers";import{AbiCoder as Lt,Interface as ne,getAddress as Kn,isAddress as Wn,keccak256 as Gn}from"ethers";import{AsyncLocalStorage as At}from"node:async_hooks";var Qr=new At;var cn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,un=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ln=AbortSignal.prototype.throwIfAborted,dn=EventTarget.prototype.addEventListener,pn=EventTarget.prototype.removeEventListener,fn=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null;var mn=64*1024,hn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});import{Interface as Ct,getAddress as kn}from"ethers";var En=new Ct(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var $n=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"});import{createHash as vt,createHmac as Ot,timingSafeEqual as Un}from"node:crypto";var $t=2,Tt=300*1e3,Nt=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})();function te(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(te).join(",")}]`:`{${Object.keys(t).sort().map(r=>`${JSON.stringify(r)}:${te(t[r])}`).join(",")}}`}function he(t){let e=String(t?.ORACLE_STAMP_HMAC_SECRET||"").trim();return e.length>=16?e:""}function be(t=process.env){return he(process.env)||he(t)}function _t(t){let{prepareHash:e,prepareMac:r,note:o,...n}=t||{};return n}function Rt(t){let e=_t(t);return vt("sha256").update(te(e)).digest("hex")}function Pt(t,e=be()){return e?Ot("sha256",e).update(String(t)).digest("hex"):""}function re(t,{provider:e,kind:r,env:o=process.env,nowMs:n=Date.now(),expiresAtMs:i}={}){if(!t||typeof t!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(t,"oraclePrepared");if(s&&typeof t.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...t,provider:t.provider||e,kind:t.kind||r,requiresUserSignature:t.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?t.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let d=Number(n),c=i==null?d+Tt:Number(i),u=c-d;if(!Number.isSafeInteger(d)||!Number.isSafeInteger(c)||u<=0||u>Nt)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let b={...l,preparedAt:d,expiresAt:c,prepareVersion:$t},S=Rt(b),f=be(o),w=f?Pt(S,f):void 0,T={...b,prepareHash:S};return w&&(T.prepareMac=w),T}var Zn=Lt.defaultAbiCoder();var ge={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}};var eo=new ne(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),to=new ne(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),ro=new ne(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),no=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),oo=(1n<<14n)-1n;var Ie=Mt.defaultAbiCoder(),L="0x0000000000000000000000000000000000000000",we="0x000000000022D473030F116dDEE9F6B43aC78BA3",ye=-887272,xe=887272,C=(1n<<128n)-1n,Ut=(1n<<256n)-1n,Ft=(1n<<24n)-1n,Se=30,ke=600,I=Object.freeze({INCREASE_LIQUIDITY:0,DECREASE_LIQUIDITY:1,MINT_POSITION:2,BURN_POSITION:3,SETTLE_PAIR:13,TAKE_PAIR:17,CLOSE_CURRENCY:18,SWEEP:20}),qt=Object.freeze(Object.fromEntries(Object.entries(I).map(([t,e])=>[e,t]))),Ht=Object.freeze(["mint","decrease","collect","burn","rebalance"]),Ce=new Bt(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable"]),jt=Ce.getFunction("modifyLiquidities").selector,zt="tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",Vt=Object.freeze({MINT_POSITION:Object.freeze([zt,"int24","int24","uint256","uint128","uint128","address","bytes"]),INCREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),DECREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),BURN_POSITION:Object.freeze(["uint256","uint128","uint128","bytes"]),SETTLE_PAIR:Object.freeze(["address","address"]),TAKE_PAIR:Object.freeze(["address","address","address"]),CLOSE_CURRENCY:Object.freeze(["address"]),SWEEP:Object.freeze(["address","address"])});function m(t){throw new Error(`uniswap-v4-lp: ${t}`)}function O(t,e){(t==null||t==="")&&m(`${e} address required`);let r=String(t);return Dt(r)||m(`${e} is not a valid address: ${r}`),Ae(r)}function x(t,e,{max:r=Ut,min:o=0n}={}){(t==null||t==="")&&m(`${e} required`);let n;try{n=typeof t=="bigint"?t:BigInt(String(t))}catch{m(`${e} must be an integer, got ${String(t)}`)}return n<o&&m(`${e} must be >= ${o}`),n>r&&m(`${e} exceeds ${e==="fee"?"uint24":r===C?"uint128":"uint256"}`),n}function Ee(t,e){let r=Number(t);return Number.isInteger(r)||m(`${e} must be an integer tick`),(r<ye||r>xe)&&m(`${e} ${r} outside [${ye}, ${xe}]`),r}function z(t){return t==null||t===""||String(t).toLowerCase()!=="0x"&&m("opaque hookData is inspect-only until a hook-specific adapter exists"),"0x"}function ve(t={}){(!t||typeof t!="object")&&m("poolKey required");let e=t.currency0==null||t.currency0===""?L:O(t.currency0,"poolKey.currency0"),r=O(t.currency1,"poolKey.currency1");BigInt(e)>=BigInt(r)&&m("poolKey.currency0 must sort below currency1 (V4 PoolKey invariant); reordering would target a different pool");let o=Number(x(t.fee,"fee",{max:Ft})),n=Number(t.tickSpacing);(!Number.isInteger(n)||n<=0||n>32767)&&m(`poolKey.tickSpacing must be a positive int16, got ${t.tickSpacing}`);let i=t.hooks==null||t.hooks===""?L:O(t.hooks,"poolKey.hooks");return{currency0:e,currency1:r,fee:o,tickSpacing:n,hooks:i}}function Oe(t,e,r){let o=Ee(t,"tickLower"),n=Ee(e,"tickUpper");return o>=n&&m(`tickLower ${o} must be below tickUpper ${n}`),(o%r!==0||n%r!==0)&&m(`ticks must be multiples of tickSpacing ${r} (got ${o}, ${n})`),{tickLower:o,tickUpper:n}}function Kt(t){let e=Number(t);return(!Number.isSafeInteger(e)||e<=0)&&m("deadline (unix seconds) required"),e}function $e(t){return`0x${t.map(e=>e.toString(16).padStart(2,"0")).join("")}`}function v(t,e){return Ie.encode(Vt[t],e)}function Wt(t,e){return(!Array.isArray(t)||!Array.isArray(e)||t.length!==e.length||t.length===0)&&m("actions and params must be equal-length non-empty arrays"),Ie.encode(["bytes","bytes[]"],[$e(t),e])}function V({chainId:t,positionManager:e,actions:r,params:o,deadline:n,value:i,summary:s,extra:l={}}){let d=Wt(r,o),c=Ce.encodeFunctionData("modifyLiquidities",[d,BigInt(n)]);return Object.freeze({chainId:Number(t),to:e,data:c,value:i.toString(),deadline:n,actions:r.map(u=>qt[u]),actionsHex:$e(r),summary:s,...l})}function K(t){let e=Number(t.chainId);(!Number.isInteger(e)||e<=0)&&m("chainId required");let r=O(t.positionManager,"positionManager");return{chainId:e,positionManager:r,deadline:Kt(t.deadline)}}function Gt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=ve(t.poolKey),{tickLower:i,tickUpper:s}=Oe(t.tickLower,t.tickUpper,n.tickSpacing),l=x(t.liquidity,"liquidity");l===0n&&m("liquidity must be > 0 for mint");let d=x(t.amount0Max,"amount0Max",{max:C}),c=x(t.amount1Max,"amount1Max",{max:C}),u=O(t.owner,"owner"),h=z(t.hookData),b=n.currency0===L,S=[I.MINT_POSITION,I.SETTLE_PAIR],f=[v("MINT_POSITION",[n,i,s,l,d,c,u,h]),v("SETTLE_PAIR",[n.currency0,n.currency1])];b&&(S.push(I.SWEEP),f.push(v("SWEEP",[L,u])));let w=b?d:0n,T=`mint v4 LP ${n.currency0}/${n.currency1} fee ${n.fee} ticks [${i}, ${s}] liquidity ${l} (max ${d} / ${c}) to ${u}${b?" paying native value":""}${n.hooks!==L?` hooked ${n.hooks}`:""}`;return V({chainId:e,positionManager:r,actions:S,params:f,deadline:o,value:w,summary:T,extra:{poolKey:n,tickLower:i,tickUpper:s,owner:u,requiresApproval:_e(n,{amount0Max:d,amount1Max:c})}})}function Te(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=x(t.tokenId,"tokenId"),i=x(t.liquidity,"liquidity"),s=x(t.amount0Min,"amount0Min",{max:C}),l=x(t.amount1Min,"amount1Min",{max:C}),{currency0:d,currency1:c}=Ne(t),u=O(t.recipient??t.owner,"recipient"),h=z(t.hookData),b=[I.DECREASE_LIQUIDITY,I.TAKE_PAIR],S=[v("DECREASE_LIQUIDITY",[n,i,s,l,h]),v("TAKE_PAIR",[d,c,u])],f=i===0n?`collect fees on v4 LP #${n} to ${u}`:`decrease v4 LP #${n} by ${i} liquidity (min ${s} / ${l}) to ${u}`;return V({chainId:e,positionManager:r,actions:b,params:S,deadline:o,value:0n,summary:f,extra:{tokenId:n.toString(),recipient:u,currency0:d,currency1:c}})}function Yt(t={}){return Te({...t,liquidity:0n,amount0Min:0n,amount1Min:0n})}function Xt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=x(t.tokenId,"tokenId"),i=x(t.amount0Min,"amount0Min",{max:C}),s=x(t.amount1Min,"amount1Min",{max:C}),{currency0:l,currency1:d}=Ne(t),c=O(t.recipient??t.owner,"recipient"),u=z(t.hookData),h=[I.BURN_POSITION,I.TAKE_PAIR],b=[v("BURN_POSITION",[n,i,s,u]),v("TAKE_PAIR",[l,d,c])];return V({chainId:e,positionManager:r,actions:h,params:b,deadline:o,value:0n,summary:`burn v4 LP #${n} (min ${i} / ${s}) to ${c}`,extra:{tokenId:n.toString(),recipient:c,currency0:l,currency1:d}})}function Qt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=t.burn||{},i=t.mint||{},s=x(n.tokenId,"burn.tokenId"),l=x(n.amount0Min??0n,"burn.amount0Min",{max:C}),d=x(n.amount1Min??0n,"burn.amount1Min",{max:C}),c=ve(i.poolKey);c.currency0===L&&m("rebalance refuses native currency pools: shortfall msg.value cannot be sized offline");let{tickLower:u,tickUpper:h}=Oe(i.tickLower,i.tickUpper,c.tickSpacing),b=x(i.liquidity,"mint.liquidity");b===0n&&m("mint.liquidity must be > 0 for rebalance");let S=x(i.amount0Max,"mint.amount0Max",{max:C}),f=x(i.amount1Max,"mint.amount1Max",{max:C}),w=O(i.owner??t.owner,"owner"),T=z(i.hookData??n.hookData),Y=[I.BURN_POSITION,I.MINT_POSITION,I.CLOSE_CURRENCY,I.CLOSE_CURRENCY],X=[v("BURN_POSITION",[s,l,d,T]),v("MINT_POSITION",[c,u,h,b,S,f,w,T]),v("CLOSE_CURRENCY",[c.currency0]),v("CLOSE_CURRENCY",[c.currency1])];return V({chainId:e,positionManager:r,actions:Y,params:X,deadline:o,value:0n,summary:`rebalance v4 LP: burn #${s} then mint ${c.currency0}/${c.currency1} fee ${c.fee} ticks [${u}, ${h}] liquidity ${b} (max ${S} / ${f}) to ${w}, one unlock`,extra:{burnTokenId:s.toString(),poolKey:c,tickLower:u,tickUpper:h,owner:w,requiresApproval:_e(c,{amount0Max:S,amount1Max:f})}})}function Ne(t){let e=t.poolKey&&typeof t.poolKey=="object"?t.poolKey:t,r=e.currency0==null||e.currency0===""?L:O(e.currency0,"currency0"),o=O(e.currency1,"currency1");return BigInt(r)>=BigInt(o)&&m("currency0 must sort below currency1"),{currency0:r,currency1:o}}function _e(t,{amount0Max:e,amount1Max:r}){let o=[];return t.currency0!==L&&o.push({token:t.currency0,spender:we,amount:e.toString()}),o.push({token:t.currency1,spender:we,amount:r.toString()}),{note:"PositionManager settles ERC-20 debt via Permit2; token\u2192Permit2 approval and a Permit2 allowance for PositionManager are both required",approvals:o}}var Jt=Object.freeze({mint:Gt,decrease:Te,collect:Yt,burn:Xt,rebalance:Qt});function Re(t={},e={}){let r=e.chains||ge,o=Number(t.chainId);(!Number.isInteger(o)||o<=0)&&m("chainId required");let n=r[o];n||m(`unsupported chainId ${o} (supported: ${Object.keys(r).join(", ")})`),n.positionManager||m(`no v4 PositionManager registered for chain ${o} (${n.name||"unnamed"})`);let i=String(t.kind||"").toLowerCase(),s=Jt[i];s||m(`unknown kind ${t.kind} (expected ${Ht.join("|")})`);let l=Number(t.deadlineSec);(!Number.isInteger(l)||l<Se||l>ke)&&m(`deadlineSec must be an integer from ${Se} through ${ke}`);let c=Number(e.nowSeconds??Math.floor(Date.now()/1e3))+l,u=t.params&&typeof t.params=="object"?t.params:{},h=s({...u,chainId:o,positionManager:Ae(n.positionManager),deadline:c}),b=t.from??u.owner??u.recipient??null,S=b?O(b,"from"):null,f={...h},{to:w,data:T,value:Y,summary:X,actions:et,actionsHex:tt,requiresApproval:rt=null}=h;for(let nt of["to","data","value","summary","actions","actionsHex","requiresApproval","chainId","deadline"])delete f[nt];return re({provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,lpKind:i,prepareReady:!0,calldataReady:!0,executionReady:!1,executionAllowed:!1,requiresUserSignature:!0,requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,signingReady:!1,broadcastReady:!1,simulate:null,chainId:o,chainName:n.name||null,deadline:c,summary:X,plan:{actions:et,actionsHex:tt,selector:jt},detail:f,requiresApproval:rt,transaction:{chainId:o,from:S,to:w,data:T,value:Y},notes:["prepare-only: user wallet must sign","one modifyLiquidities unlock; Telegram never sends","action bytes verified against v4-periphery Actions.sol; simulate before signing"]},{provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,env:e.env,nowMs:e.nowMs})}var Pe=1e3,k="unknown",Zt=/^[a-z0-9-]{4,40}$/i;function A(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!==""&&t.trim().toLowerCase()!==k:!0}function q(t,{estimate:e=!0,signed:r=!1}={}){if(!A(t))return k;let o=Number(t);if(!Number.isFinite(o))return k;let n=Math.abs(o),i=n>=1e3?n.toLocaleString("en-US",{maximumFractionDigits:0}):n.toFixed(2),s=o<0?"-":r&&o>0?"+":"";return`${e?"~":""}${s}$${i}`}function oe(t){if(!A(t))return k;let e=Number(t);return Number.isFinite(e)?e===0?"0":e>=1e3?e.toLocaleString("en-US",{maximumFractionDigits:2}):e>=1?e.toFixed(4):e.toPrecision(4):k}function er(t){if(!A(t))return k;let e=Number(t);return Number.isFinite(e)?`${(e/1e4).toFixed(e%100===0?2:3)}%`:a(t)}function tr(t){let e={1:"Ethereum",10:"Optimism",56:"BSC",137:"Polygon",8453:"Base",42161:"Arbitrum",43114:"Avalanche",4663:"Robinhood"},r=Number(t);return Number.isInteger(r)?e[r]?`${e[r]} (${r})`:`chain ${r}`:k}function rr(t){if(!t||typeof t!="object")return`Decision: ${k}`;let e=A(t.action)?String(t.action).toUpperCase():k,r=A(t.mode)?String(t.mode):"alert_only",o=A(t.reason)?a(t.reason):k;return`Decision: ${a(e)} (${a(r)}) \u2014 ${o}`}function Le(t={}){let r=[`*LP ${A(t.pair)?a(t.pair):k} \xB7 ${a(tr(t.chainId))}*`,`Net: ${q(t.netUsd,{signed:!0})}`,`Fees ${q(t.feesUsd)} \xB7 IL ${q(t.ilUsd)} \xB7 Gas ${q(t.gasUsd)} \xB7 Slip ${q(t.slippageUsd)}`,`Range: ${oe(t.rangeLower)} \u2013 ${oe(t.rangeUpper)} \xB7 now ${oe(t.priceNow)} \xB7 ${typeof t.inRange=="boolean"?t.inRange?"IN range":"OUT of range":`range ${k}`}`,`Fee tier: ${er(t.feeTier)}`,rr(t.decision)];(A(t.source)||A(t.observedAt))&&r.push(`Source: ${A(t.source)?a(t.source):k} at ${A(t.observedAt)?a(t.observedAt):k}`),r.push("Buttons open the graph or queue an unsigned prepare. Telegram never sends.");let o=r.join(`
|
|
1
|
+
import{createHash as nr,randomBytes as or}from"node:crypto";import{mkdirSync as ir,readFileSync as sr,writeFileSync as ar}from"node:fs";import{homedir as cr}from"node:os";import{dirname as ur,join as Be}from"node:path";function de(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}}var it=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function pe(t,{coin:e,side:r,sizeUsd:o,leverage:n,venue:i,confirm:s,user:l}={}){let d=de(t);if(!d)return null;if(e&&it.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(n))&&Number(n)>=1&&d.searchParams.set("lev",String(Math.min(50,Number(n)))),i){let c=String(i).toLowerCase()==="hl"?"hyperliquid":String(i).toLowerCase();d.searchParams.set("venue",c)}else d.searchParams.get("venue")||d.searchParams.set("venue","hyperliquid");return d.searchParams.set("view","perps"),d.searchParams.set("build","1"),s&&/^[0-9a-f]{32}$/i.test(String(s))&&d.searchParams.set("confirm",String(s).toLowerCase()),l&&/^0x[0-9a-fA-F]{40}$/.test(String(l))&&d.searchParams.set("user",String(l).toLowerCase()),d.toString()}var Q={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var st=new Map(Object.values(Q).map(t=>[t.chainId,t]));function J(t){return st.get(Number(t))||null}var at=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);var ct=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});var qr=Object.freeze([100,50,25]),Hr=Object.freeze([100,50,25,10]);var p="UNKNOWN",Wr=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),ut=/[_*[\]`]/g;function a(t){return g(t)?String(t).replace(ut,e=>`\\${e}`):p}function g(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function $(t){if(!g(t))return p;let e=String(t).replace(/`/g,"");return e===""?p:`\`${e}\``}function M(t,{decimals:e=2}={}){if(!g(t))return p;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):p}function y(t,{decimals:e=2}={}){let r=M(t,{decimals:e});return r===p?p:`${r} USD`}function Z(t,{decimals:e=2}={}){let r=M(t,{decimals:e});return r===p?p:`${r}%`}function j(t){let e=M(t,{decimals:0});return e===p?p:`${e} bps`}function B(t,e){if(!g(t))return p;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return p;let o;try{o=BigInt(typeof t=="string"?t.trim():t)}catch{return p}let n=o<0n,i=n?-o:o,s=10n**BigInt(r),l=(i/s).toString(),d=(i%s).toString().padStart(r,"0").replace(/0+$/,"");return`${n?"-":""}${l}${d?`.${d}`:""}`}function ee(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?p: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 p}function P(t={}){let e=t.chainId;if(!g(e)||!Number.isFinite(Number(e)))return g(t.chain)?a(t.chain):p;let o=J(e)?.name||(g(t.chain)?String(t.chain):p);return`${a(o)} (chainId ${Number(e)})`}function fe(t={}){return a(t.venue??t.dex??t.pool?.venue)}function lt(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?$(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${g(t.error)?` \u2014 ${a(t.error)}`:""} (text card stands)`:g(t.url)?$(t.url):"NONE (text card only)"}function F(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(g(o)){let i=typeof o=="number"?o:Date.parse(o);if(!Number.isFinite(i))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(i<=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 dt(t){let e=F(t);return e.allowed?`${e.actions.map(r=>a(r)).join(" / ")} (${a(e.reason)})`:`prepare-only \u2014 ${a(e.reason)}`}function N(t,e,r={}){let o=[`*${t}*`];for(let n of e){if(!n)continue;let[i,s]=n;o.push(`${i}: ${s==null||s===""?p:s}`)}return o.push(`Chart: ${lt(r.chart)}`),o.push(`Actions: ${dt(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(n=>a(n)).join("; ")}`),(g(r.source)||g(r.fetchedAt))&&o.push(`Source: ${a(r.source)} at ${a(r.fetchedAt)}`),o.join(`
|
|
2
|
+
`)}function _(t){let e=ee(t.confidence);return e===p?null:["Confidence",e]}function pt(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=g(e.decimals)?B(e.amountOutRaw??e.out??e.raw,e.decimals):p;return[["Quote out (raw)",$(e.amountOutRaw??e.out??e.raw)],["Quote out",r===p?p:`${a(r)} ${a(e.symbol??"")}`.trim()]]}function me(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",p];let r=j(e.selectedBps),o=j(e.capBps);return["Auto-slippage",r===p&&o===p?p:`${r} selected, cap ${o}`]}function ft(t={}){let e=t||{};return N(`ORACLE TOKEN \u2014 ${a(e.symbol??e.token??e.name)}`,[["Chain",P(e)],["Venue",fe(e)],["Name",a(e.name)],["Address",$(e.address??e.mint??e.contract)],["Price",y(e.priceUsd,{decimals:8})],["Market cap",y(e.marketCapUsd)],["Liquidity",y(e.liquidityUsd)],["Volume 24h",y(e.volume24hUsd)],["Change 24h",Z(e.priceChange24h)],["Fee tier",g(e.feeTier)?`${j(Number(e.feeTier)/100)} (${M(e.feeTier,{decimals:0})})`:p],["Age",a(e.age)],...pt(e),me(e),_(e)],e)}function mt(t={}){let e=t||{};return N(`ORACLE LAUNCH \u2014 ${a(e.symbol??e.token??e.name)}`,[["Chain",P(e)],["Venue",fe(e)],["Address",$(e.address??e.mint??e.contract)],["Pool",$(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",y(e.liquidityUsd)],["Route ready",a(e.routeReady)],["Sellable",a(e.sellable)],["Sell sim",a(e.sellSimulation??e.sellSim)],["Smart wallets",a(e.smartWalletOverlap)],["Risk",a(e.risk??e.riskStatus)],["Prepared ticket",a(e.preparedTicket??e.ticketStatus)],me(e),_(e)],e)}function ht(t={}){let e=t||{};return N(`ORACLE HIP-3 \u2014 ${a(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${a(e.dexName?`${e.dexName} (${e.dex})`:e.dex)}`],["Market",a(e.market??e.coin)],["Mark",y(e.markPx,{decimals:6})],["Oracle",y(e.oraclePx,{decimals:6})],["Funding",Z(e.funding,{decimals:6})],["Open interest",y(e.openInterestUsd)],["Depth",a(e.depth)],["Liquidation notes",a(e.liquidationNotes??e.riskNotes)],["Account context",a(e.accountContext)],_(e)],e)}function bt(t={}){let e=t||{};return N(`ORACLE HIP-4 \u2014 ${a(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${a(e.dex??"outcome")}`],["Event",a(e.event)],["Outcome",a(e.outcome)],["Market id",$(e.marketId??e.market)],["Bid",y(e.bid,{decimals:6})],["Ask",y(e.ask,{decimals:6})],["Depth",a(e.depth)],["Edge",Z(e.edge)],["Position",a(e.position)],_(e)],e)}function gt(t={}){let e=t||{};return N(`ORACLE POLYMARKET \u2014 ${a(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",a(e.event)],["Market",a(e.market)],["Market id",$(e.marketId??e.conditionId??e.tokenId)],["Yes",y(e.yesPrice,{decimals:4})],["No",y(e.noPrice,{decimals:4})],["Best bid / ask",`${y(e.bestBid,{decimals:4})} / ${y(e.bestAsk,{decimals:4})}`],["Volume",y(e.volumeUsd)],["Resolution risk",a(e.resolutionRisk)],["Order intent",a(e.orderIntent)],_(e)],e)}function wt(t={}){let e=t||{},r=g(e.completedSplits)&&g(e.totalSplits)?`${M(e.completedSplits,{decimals:0})} / ${M(e.totalSplits,{decimals:0})}`:p;return N(`ORACLE TWAP \u2014 ${a(e.pair??e.symbol??e.name)}`,[["Chain",P(e)],["Side",a(e.side??e.direction)],["Amount",`${a(B(e.amountTotal??e.amount,e.decimals??18))} ${a(e.symbol??"")}`.trim()],["Splits",`${M(e.totalSplits,{decimals:0})} over ${a(e.window)}`],["Progress",r],["Avg price",y(e.averagePrice,{decimals:6})],["Next split",a(e.nextSplitAt)],["Slippage cap",j(e.slippageBps)],["Status",a(e.status)],_(e)],e)}function yt(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${a(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return N(`ORACLE BRIDGE \u2014 ${a(e.pair??e.fromSymbol)} \u2192 ${a(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",P({chainId:e.fromChainId,chain:e.fromChain})],["To chain",P({chainId:e.toChainId,chain:e.toChain})],["Amount",`${a(B(e.amount,e.fromDecimals??18))} ${a(e.fromSymbol??"")}`.trim()],["Best route",a(e.bestRoute??e.winner)],["Est. received",`${a(B(e.amountOut,e.toDecimals??18))} ${a(e.toSymbol??"")}`.trim()],["Fee",y(e.feeUsd)],["Est. time",a(e.estimatedTime)],["Revoke check",o],["All providers",a(e.providers?.join(", "))],["Preparable",a(e.preparable)],_(e)],e)}function xt(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let n=a(o.source??o.venue??o.name),i=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),s=Number.isFinite(i)?`${Math.abs(i).toFixed(0)} bps behind`:"spread UNKNOWN";return`${n} (${s})`});return r.length?r.join("; "):p}function St(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return g(e)?a(e):p}function kt(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,o=e.bridge&&typeof e.bridge=="object"?e.bridge:null,n=r.best??r.winner??{},i=`${a(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${a(e.tokenOutSymbol??e.toSymbol??"OUT")}`,s=[["Intent",a(e.intent??"swap")],["Chain",P({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",i],["Amount in",`${a(B(e.amountIn??r.amountIn,e.decimalsIn??18))} ${a(e.tokenInSymbol??"")}`.trim()],["Best swap",a(n.source??n.venue??r.bestRoute??e.bestRoute)],["Net out",`${a(B(n.netOut??n.amountOut??r.amountOut,e.decimalsOut??18))} ${a(e.tokenOutSymbol??"")}`.trim()],["Ranked on",St(r)],["Gas accounted",a(n.costAccounted===!0?"yes":n.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",g(r.improvementBps)?`${a(r.improvementBps)} bps`:p],["Runners-up",xt(r.routes??e.routes)]];if(o){let l=o.best??o.winner??{};s.push(["Best bridge",a(l.source??o.bestRoute??e.bestBridge)],["Bridge out",`${a(B(l.netOut??l.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${a(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",P({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",a(o.estimatedTime??l.meta?.durationSeconds)])}else s.push(["Best bridge","same-chain \u2014 use Best swap"]);return s.push(["Preparable",a(e.preparable??n.executionReady)],_(e)),N(`ORACLE SWAP \u2014 ${i}`,s,e)}function Et(t={}){let e=t||{};return N("ORACLE APPROVE \u2014 local signer",[["Pending id",$(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",a(e.surface)],["Action",a(e.action)],["Chain",P({chainId:e.chain??e.chainId,chain:e.chainName})],["To",$(e.to??e.destination)],["Value",g(e.value)?a(e.value):p],["Signer",a(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],_({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var Yr=Object.freeze({token:ft,launch:mt,hip3:ht,hip4:bt,polymarket:gt,twap:wt,bridge:yt,swap:kt,approve:Et});import{AbiCoder as Mt,Interface as Bt,getAddress as Ae,isAddress as Dt}from"ethers";import{AbiCoder as Lt,Interface as ne,getAddress as Kn,isAddress as Wn,keccak256 as Yn}from"ethers";import{AsyncLocalStorage as At}from"node:async_hooks";var Qr=new At;var cn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,un=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ln=AbortSignal.prototype.throwIfAborted,dn=EventTarget.prototype.addEventListener,pn=EventTarget.prototype.removeEventListener,fn=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null;var mn=64*1024,hn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});import{Interface as Ct,getAddress as kn}from"ethers";var En=new Ct(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var $n=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"});import{createHash as vt,createHmac as Ot,timingSafeEqual as Un}from"node:crypto";var $t=2,Tt=300*1e3,Nt=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})();function te(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(te).join(",")}]`:`{${Object.keys(t).sort().map(r=>`${JSON.stringify(r)}:${te(t[r])}`).join(",")}}`}function he(t){let e=String(t?.ORACLE_STAMP_HMAC_SECRET||"").trim();return e.length>=16?e:""}function be(t=process.env){return he(process.env)||he(t)}function _t(t){let{prepareHash:e,prepareMac:r,note:o,...n}=t||{};return n}function Rt(t){let e=_t(t);return vt("sha256").update(te(e)).digest("hex")}function Pt(t,e=be()){return e?Ot("sha256",e).update(String(t)).digest("hex"):""}function re(t,{provider:e,kind:r,env:o=process.env,nowMs:n=Date.now(),expiresAtMs:i}={}){if(!t||typeof t!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(t,"oraclePrepared");if(s&&typeof t.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...t,provider:t.provider||e,kind:t.kind||r,requiresUserSignature:t.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?t.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let d=Number(n),c=i==null?d+Tt:Number(i),u=c-d;if(!Number.isSafeInteger(d)||!Number.isSafeInteger(c)||u<=0||u>Nt)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let b={...l,preparedAt:d,expiresAt:c,prepareVersion:$t},S=Rt(b),f=be(o),w=f?Pt(S,f):void 0,T={...b,prepareHash:S};return w&&(T.prepareMac=w),T}var Zn=Lt.defaultAbiCoder();var ge={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}};var eo=new ne(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),to=new ne(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),ro=new ne(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),no=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),oo=(1n<<14n)-1n;var Ie=Mt.defaultAbiCoder(),L="0x0000000000000000000000000000000000000000",we="0x000000000022D473030F116dDEE9F6B43aC78BA3",ye=-887272,xe=887272,C=(1n<<128n)-1n,Ut=(1n<<256n)-1n,Ft=(1n<<24n)-1n,Se=30,ke=600,I=Object.freeze({INCREASE_LIQUIDITY:0,DECREASE_LIQUIDITY:1,MINT_POSITION:2,BURN_POSITION:3,SETTLE_PAIR:13,TAKE_PAIR:17,CLOSE_CURRENCY:18,SWEEP:20}),qt=Object.freeze(Object.fromEntries(Object.entries(I).map(([t,e])=>[e,t]))),Ht=Object.freeze(["mint","decrease","collect","burn","rebalance"]),Ce=new Bt(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable"]),jt=Ce.getFunction("modifyLiquidities").selector,zt="tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",Vt=Object.freeze({MINT_POSITION:Object.freeze([zt,"int24","int24","uint256","uint128","uint128","address","bytes"]),INCREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),DECREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),BURN_POSITION:Object.freeze(["uint256","uint128","uint128","bytes"]),SETTLE_PAIR:Object.freeze(["address","address"]),TAKE_PAIR:Object.freeze(["address","address","address"]),CLOSE_CURRENCY:Object.freeze(["address"]),SWEEP:Object.freeze(["address","address"])});function m(t){throw new Error(`uniswap-v4-lp: ${t}`)}function O(t,e){(t==null||t==="")&&m(`${e} address required`);let r=String(t);return Dt(r)||m(`${e} is not a valid address: ${r}`),Ae(r)}function x(t,e,{max:r=Ut,min:o=0n}={}){(t==null||t==="")&&m(`${e} required`);let n;try{n=typeof t=="bigint"?t:BigInt(String(t))}catch{m(`${e} must be an integer, got ${String(t)}`)}return n<o&&m(`${e} must be >= ${o}`),n>r&&m(`${e} exceeds ${e==="fee"?"uint24":r===C?"uint128":"uint256"}`),n}function Ee(t,e){let r=Number(t);return Number.isInteger(r)||m(`${e} must be an integer tick`),(r<ye||r>xe)&&m(`${e} ${r} outside [${ye}, ${xe}]`),r}function z(t){return t==null||t===""||String(t).toLowerCase()!=="0x"&&m("opaque hookData is inspect-only until a hook-specific adapter exists"),"0x"}function ve(t={}){(!t||typeof t!="object")&&m("poolKey required");let e=t.currency0==null||t.currency0===""?L:O(t.currency0,"poolKey.currency0"),r=O(t.currency1,"poolKey.currency1");BigInt(e)>=BigInt(r)&&m("poolKey.currency0 must sort below currency1 (V4 PoolKey invariant); reordering would target a different pool");let o=Number(x(t.fee,"fee",{max:Ft})),n=Number(t.tickSpacing);(!Number.isInteger(n)||n<=0||n>32767)&&m(`poolKey.tickSpacing must be a positive int16, got ${t.tickSpacing}`);let i=t.hooks==null||t.hooks===""?L:O(t.hooks,"poolKey.hooks");return{currency0:e,currency1:r,fee:o,tickSpacing:n,hooks:i}}function Oe(t,e,r){let o=Ee(t,"tickLower"),n=Ee(e,"tickUpper");return o>=n&&m(`tickLower ${o} must be below tickUpper ${n}`),(o%r!==0||n%r!==0)&&m(`ticks must be multiples of tickSpacing ${r} (got ${o}, ${n})`),{tickLower:o,tickUpper:n}}function Kt(t){let e=Number(t);return(!Number.isSafeInteger(e)||e<=0)&&m("deadline (unix seconds) required"),e}function $e(t){return`0x${t.map(e=>e.toString(16).padStart(2,"0")).join("")}`}function v(t,e){return Ie.encode(Vt[t],e)}function Wt(t,e){return(!Array.isArray(t)||!Array.isArray(e)||t.length!==e.length||t.length===0)&&m("actions and params must be equal-length non-empty arrays"),Ie.encode(["bytes","bytes[]"],[$e(t),e])}function V({chainId:t,positionManager:e,actions:r,params:o,deadline:n,value:i,summary:s,extra:l={}}){let d=Wt(r,o),c=Ce.encodeFunctionData("modifyLiquidities",[d,BigInt(n)]);return Object.freeze({chainId:Number(t),to:e,data:c,value:i.toString(),deadline:n,actions:r.map(u=>qt[u]),actionsHex:$e(r),summary:s,...l})}function K(t){let e=Number(t.chainId);(!Number.isInteger(e)||e<=0)&&m("chainId required");let r=O(t.positionManager,"positionManager");return{chainId:e,positionManager:r,deadline:Kt(t.deadline)}}function Yt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=ve(t.poolKey),{tickLower:i,tickUpper:s}=Oe(t.tickLower,t.tickUpper,n.tickSpacing),l=x(t.liquidity,"liquidity");l===0n&&m("liquidity must be > 0 for mint");let d=x(t.amount0Max,"amount0Max",{max:C}),c=x(t.amount1Max,"amount1Max",{max:C}),u=O(t.owner,"owner"),h=z(t.hookData),b=n.currency0===L,S=[I.MINT_POSITION,I.SETTLE_PAIR],f=[v("MINT_POSITION",[n,i,s,l,d,c,u,h]),v("SETTLE_PAIR",[n.currency0,n.currency1])];b&&(S.push(I.SWEEP),f.push(v("SWEEP",[L,u])));let w=b?d:0n,T=`mint v4 LP ${n.currency0}/${n.currency1} fee ${n.fee} ticks [${i}, ${s}] liquidity ${l} (max ${d} / ${c}) to ${u}${b?" paying native value":""}${n.hooks!==L?` hooked ${n.hooks}`:""}`;return V({chainId:e,positionManager:r,actions:S,params:f,deadline:o,value:w,summary:T,extra:{poolKey:n,tickLower:i,tickUpper:s,owner:u,requiresApproval:_e(n,{amount0Max:d,amount1Max:c})}})}function Te(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=x(t.tokenId,"tokenId"),i=x(t.liquidity,"liquidity"),s=x(t.amount0Min,"amount0Min",{max:C}),l=x(t.amount1Min,"amount1Min",{max:C}),{currency0:d,currency1:c}=Ne(t),u=O(t.recipient??t.owner,"recipient"),h=z(t.hookData),b=[I.DECREASE_LIQUIDITY,I.TAKE_PAIR],S=[v("DECREASE_LIQUIDITY",[n,i,s,l,h]),v("TAKE_PAIR",[d,c,u])],f=i===0n?`collect fees on v4 LP #${n} to ${u}`:`decrease v4 LP #${n} by ${i} liquidity (min ${s} / ${l}) to ${u}`;return V({chainId:e,positionManager:r,actions:b,params:S,deadline:o,value:0n,summary:f,extra:{tokenId:n.toString(),recipient:u,currency0:d,currency1:c}})}function Gt(t={}){return Te({...t,liquidity:0n,amount0Min:0n,amount1Min:0n})}function Xt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=x(t.tokenId,"tokenId"),i=x(t.amount0Min,"amount0Min",{max:C}),s=x(t.amount1Min,"amount1Min",{max:C}),{currency0:l,currency1:d}=Ne(t),c=O(t.recipient??t.owner,"recipient"),u=z(t.hookData),h=[I.BURN_POSITION,I.TAKE_PAIR],b=[v("BURN_POSITION",[n,i,s,u]),v("TAKE_PAIR",[l,d,c])];return V({chainId:e,positionManager:r,actions:h,params:b,deadline:o,value:0n,summary:`burn v4 LP #${n} (min ${i} / ${s}) to ${c}`,extra:{tokenId:n.toString(),recipient:c,currency0:l,currency1:d}})}function Qt(t={}){let{chainId:e,positionManager:r,deadline:o}=K(t),n=t.burn||{},i=t.mint||{},s=x(n.tokenId,"burn.tokenId"),l=x(n.amount0Min??0n,"burn.amount0Min",{max:C}),d=x(n.amount1Min??0n,"burn.amount1Min",{max:C}),c=ve(i.poolKey);c.currency0===L&&m("rebalance refuses native currency pools: shortfall msg.value cannot be sized offline");let{tickLower:u,tickUpper:h}=Oe(i.tickLower,i.tickUpper,c.tickSpacing),b=x(i.liquidity,"mint.liquidity");b===0n&&m("mint.liquidity must be > 0 for rebalance");let S=x(i.amount0Max,"mint.amount0Max",{max:C}),f=x(i.amount1Max,"mint.amount1Max",{max:C}),w=O(i.owner??t.owner,"owner"),T=z(i.hookData??n.hookData),G=[I.BURN_POSITION,I.MINT_POSITION,I.CLOSE_CURRENCY,I.CLOSE_CURRENCY],X=[v("BURN_POSITION",[s,l,d,T]),v("MINT_POSITION",[c,u,h,b,S,f,w,T]),v("CLOSE_CURRENCY",[c.currency0]),v("CLOSE_CURRENCY",[c.currency1])];return V({chainId:e,positionManager:r,actions:G,params:X,deadline:o,value:0n,summary:`rebalance v4 LP: burn #${s} then mint ${c.currency0}/${c.currency1} fee ${c.fee} ticks [${u}, ${h}] liquidity ${b} (max ${S} / ${f}) to ${w}, one unlock`,extra:{burnTokenId:s.toString(),poolKey:c,tickLower:u,tickUpper:h,owner:w,requiresApproval:_e(c,{amount0Max:S,amount1Max:f})}})}function Ne(t){let e=t.poolKey&&typeof t.poolKey=="object"?t.poolKey:t,r=e.currency0==null||e.currency0===""?L:O(e.currency0,"currency0"),o=O(e.currency1,"currency1");return BigInt(r)>=BigInt(o)&&m("currency0 must sort below currency1"),{currency0:r,currency1:o}}function _e(t,{amount0Max:e,amount1Max:r}){let o=[];return t.currency0!==L&&o.push({token:t.currency0,spender:we,amount:e.toString()}),o.push({token:t.currency1,spender:we,amount:r.toString()}),{note:"PositionManager settles ERC-20 debt via Permit2; token\u2192Permit2 approval and a Permit2 allowance for PositionManager are both required",approvals:o}}var Jt=Object.freeze({mint:Yt,decrease:Te,collect:Gt,burn:Xt,rebalance:Qt});function Re(t={},e={}){let r=e.chains||ge,o=Number(t.chainId);(!Number.isInteger(o)||o<=0)&&m("chainId required");let n=r[o];n||m(`unsupported chainId ${o} (supported: ${Object.keys(r).join(", ")})`),n.positionManager||m(`no v4 PositionManager registered for chain ${o} (${n.name||"unnamed"})`);let i=String(t.kind||"").toLowerCase(),s=Jt[i];s||m(`unknown kind ${t.kind} (expected ${Ht.join("|")})`);let l=Number(t.deadlineSec);(!Number.isInteger(l)||l<Se||l>ke)&&m(`deadlineSec must be an integer from ${Se} through ${ke}`);let c=Number(e.nowSeconds??Math.floor(Date.now()/1e3))+l,u=t.params&&typeof t.params=="object"?t.params:{},h=s({...u,chainId:o,positionManager:Ae(n.positionManager),deadline:c}),b=t.from??u.owner??u.recipient??null,S=b?O(b,"from"):null,f={...h},{to:w,data:T,value:G,summary:X,actions:et,actionsHex:tt,requiresApproval:rt=null}=h;for(let nt of["to","data","value","summary","actions","actionsHex","requiresApproval","chainId","deadline"])delete f[nt];return re({provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,lpKind:i,prepareReady:!0,calldataReady:!0,executionReady:!1,executionAllowed:!1,requiresUserSignature:!0,requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,signingReady:!1,broadcastReady:!1,simulate:null,chainId:o,chainName:n.name||null,deadline:c,summary:X,plan:{actions:et,actionsHex:tt,selector:jt},detail:f,requiresApproval:rt,transaction:{chainId:o,from:S,to:w,data:T,value:G},notes:["prepare-only: user wallet must sign","one modifyLiquidities unlock; Telegram never sends","action bytes verified against v4-periphery Actions.sol; simulate before signing"]},{provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,env:e.env,nowMs:e.nowMs})}var Pe=1e3,k="unknown",Zt=/^[a-z0-9-]{4,40}$/i;function A(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!==""&&t.trim().toLowerCase()!==k:!0}function q(t,{estimate:e=!0,signed:r=!1}={}){if(!A(t))return k;let o=Number(t);if(!Number.isFinite(o))return k;let n=Math.abs(o),i=n>=1e3?n.toLocaleString("en-US",{maximumFractionDigits:0}):n.toFixed(2),s=o<0?"-":r&&o>0?"+":"";return`${e?"~":""}${s}$${i}`}function oe(t){if(!A(t))return k;let e=Number(t);return Number.isFinite(e)?e===0?"0":e>=1e3?e.toLocaleString("en-US",{maximumFractionDigits:2}):e>=1?e.toFixed(4):e.toPrecision(4):k}function er(t){if(!A(t))return k;let e=Number(t);return Number.isFinite(e)?`${(e/1e4).toFixed(e%100===0?2:3)}%`:a(t)}function tr(t){let e={1:"Ethereum",10:"Optimism",56:"BSC",137:"Polygon",8453:"Base",42161:"Arbitrum",43114:"Avalanche",4663:"Robinhood"},r=Number(t);return Number.isInteger(r)?e[r]?`${e[r]} (${r})`:`chain ${r}`:k}function rr(t){if(!t||typeof t!="object")return`Decision: ${k}`;let e=A(t.action)?String(t.action).toUpperCase():k,r=A(t.mode)?String(t.mode):"alert_only",o=A(t.reason)?a(t.reason):k;return`Decision: ${a(e)} (${a(r)}) \u2014 ${o}`}function Le(t={}){let r=[`*LP ${A(t.pair)?a(t.pair):k} \xB7 ${a(tr(t.chainId))}*`,`Net: ${q(t.netUsd,{signed:!0})}`,`Fees ${q(t.feesUsd)} \xB7 IL ${q(t.ilUsd)} \xB7 Gas ${q(t.gasUsd)} \xB7 Slip ${q(t.slippageUsd)}`,`Range: ${oe(t.rangeLower)} \u2013 ${oe(t.rangeUpper)} \xB7 now ${oe(t.priceNow)} \xB7 ${typeof t.inRange=="boolean"?t.inRange?"IN range":"OUT of range":`range ${k}`}`,`Fee tier: ${er(t.feeTier)}`,rr(t.decision)];(A(t.source)||A(t.observedAt))&&r.push(`Source: ${A(t.source)?a(t.source):k} at ${A(t.observedAt)?a(t.observedAt):k}`),r.push("Buttons open the graph or queue an unsigned prepare. Telegram never sends.");let o=r.join(`
|
|
3
3
|
`);return o.length>Pe&&(o=`${o.slice(0,Pe-1)}\u2026`),o}function Me({platform:t="telegram",artifactId:e,hasGrant:r=!1,openUrl:o,collectUrl:n}={}){let i=String(e||"").trim().toLowerCase();if(!Zt.test(i))return{kind:"text_menu",text:"no LP artifact to continue",cancelHint:""};let s=[];A(o)&&s.push({text:"Open",url:String(o)}),s.push({text:"Refresh",callback_data:`oracle:card:refresh:${i}`});let l=[A(n)?{text:"Collect",url:String(n)}:{text:"Collect",callback_data:`oracle:card:collect:${i}`}];r&&l.push({text:"Rebalance",callback_data:`oracle:card:rebalance:${i}`}),l.push({text:"Exit",callback_data:`oracle:card:exit:${i}`});let d=[s,l].filter(h=>h.length>0),c=r?"Collect/Rebalance/Exit queue unsigned prepares. Sign in your wallet. Telegram never sends.":"Collect/Exit queue unsigned prepares. Rebalance needs a local grant. Telegram never sends.";return String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:d},cancelHint:c}:{kind:"text_menu",text:d.flat().map(h=>h.text).join(" / "),cancelHint:c}}var De=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny","bag","follow","rebalance","exit","collect"]),Ue=Object.freeze({rebalance:"rebalance",exit:"burn",collect:"collect"}),lr=new Set(De),se=/^[a-z0-9-]{4,40}$/i,Fe=/^[0-9a-f]{32}$/,qe=/^\d+$/,dr=new RegExp(`^oracle:card:(${De.join("|")}):([a-z0-9-]{4,40})$`,"i");function ae(t=process.env){return Be(t.ORACLE_CONFIG_DIR||Be(cr(),".config","oracle"),"telegram-cards.json")}function D(){return{links:{},artifacts:{},threads:{}}}var H=D();function ce(){return H}function He(t,{readFile:e=sr}={}){try{let r=JSON.parse(String(e(t)));H={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{H=D()}return H}function je(t,e=H,{writeFile:r=ar,mkdir:o=ir}={}){o(ur(t),{recursive:!0,mode:448}),r(t,JSON.stringify(e),{mode:384})}function R(t){return t==null?!1:typeof t=="string"?t.trim()!=="":!0}function ze(t){return nr("sha256").update(String(t)).digest("hex")}var pr=new Set(["tokenId","poolKey","burnTokenId"]);function ie(t){if(Array.isArray(t))return t.map(ie);if(!t||typeof t!="object")return t;let e={};for(let[r,o]of Object.entries(t))!pr.has(r)&&/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(r)||(e[r]=ie(o));return e}function Ve(t){return String(t?.kind||"").toLowerCase()==="lp"}function fr(t){let r=String(t||"").trim().match(dr);return r?{action:r[1].toLowerCase(),artifactId:r[2].toLowerCase()}:null}function mr({platform:t="telegram",artifactId:e,openUrl:r,hasGrant:o=!1}={}){let n=String(e||"").trim().toLowerCase();if(!se.test(n))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let i=[],s=[{text:"TA",callback_data:`oracle:card:ta:${n}`},{text:"FA",callback_data:`oracle:card:fa:${n}`}],l=h=>pe(r,{side:h}),d=l("long"),c=l("short"),u=d&&c?[{text:"LONG",url:d},{text:"SHORT",url:c}]:[{text:"LONG",callback_data:`oracle:card:long:${n}`},{text:"SHORT",callback_data:`oracle:card:short:${n}`}];return R(r)?(i.push([{text:"Open",url:String(r)},s[0]]),i.push(u),i.push(o?[s[1],{text:"Prep",callback_data:`oracle:card:prepare:${n}`}]:[s[1]])):(i.push(s),i.push(u),o&&i.push([{text:"Prep",callback_data:`oracle:card:prepare:${n}`}])),String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:i.filter(h=>h.length>0)},cancelHint:"LONG/SHORT open the graph. CONFIRM there. Telegram never sends."}:{kind:"text_menu",text:"TA / FA / LONG / SHORT",cancelHint:""}}function Ke(t,e){return Ve(t)?Me({artifactId:t.id,openUrl:t.openUrl,collectUrl:t.payload?.lp?.collectUrl,hasGrant:e}):mr({artifactId:t.id,openUrl:t.openUrl,hasGrant:e})}function We(t={}){if(Ve(t)&&t.payload?.lp?.card&&typeof t.payload.lp.card=="object")return Le(t.payload.lp.card);let r=[`*${R(t.title)?a(t.title):"Oracle artifact"}*`,`Kind: ${R(t.kind)?a(t.kind):p}`,`Id: ${R(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:p}`,`Summary: ${R(t.summary)?a(t.summary):p}`],o=ee(t.confidence);o!==p&&r.push(`Confidence: ${o}`),(R(t.source)||R(t.fetchedAt))&&r.push(`Source: ${a(t.source)} at ${a(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(i=>a(i)).join("; ")}`);let n=F(t);return r.push(n.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${a(n.reason)}`),r.join(`
|
|
4
|
-
`)}function hr(t,e={},{now:r=Date.now()}={}){let o=t||D(),n=String(e.id||"").trim().toLowerCase();if(!se.test(n))throw new TypeError("artifact id required");let i={id:n,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:R(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:ie(e.payload||{}),wallet:/^0x[0-9a-f]{40}$/i.test(String(e.wallet||""))?String(e.wallet).toLowerCase():null,walletLabel:R(e.walletLabel)?String(e.walletLabel).slice(0,64):null,chainId:Number.isInteger(Number(e.chainId))&&Number(e.chainId)>0?Number(e.chainId):null,createdAt:new Date(r).toISOString()};return o.artifacts[n]=i,i}function ue(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let n=t||D(),i=String(e||"").trim(),s=String(r||"").trim().toLowerCase();if(!i)throw new TypeError("chat id required");if(!se.test(s))throw new TypeError("artifact id required");return n.threads[i]={artifactId:s,updatedAt:o},n.threads[i]}function
|
|
4
|
+
`)}function hr(t,e={},{now:r=Date.now()}={}){let o=t||D(),n=String(e.id||"").trim().toLowerCase();if(!se.test(n))throw new TypeError("artifact id required");let i={id:n,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:R(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:ie(e.payload||{}),wallet:/^0x[0-9a-f]{40}$/i.test(String(e.wallet||""))?String(e.wallet).toLowerCase():null,walletLabel:R(e.walletLabel)?String(e.walletLabel).slice(0,64):null,chainId:Number.isInteger(Number(e.chainId))&&Number(e.chainId)>0?Number(e.chainId):null,createdAt:new Date(r).toISOString()};return o.artifacts[n]=i,i}function ue(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let n=t||D(),i=String(e||"").trim(),s=String(r||"").trim().toLowerCase();if(!i)throw new TypeError("chat id required");if(!se.test(s))throw new TypeError("artifact id required");return n.threads[i]={artifactId:s,updatedAt:o},n.threads[i]}function Ye(t,{chatId:e,text:r}={}){let o=String(e||"").trim(),n=String(r||"").trim();if(!o||!n||/^\//.test(n))return null;let i=t?.threads?.[o];if(!i?.artifactId)return null;let s=t.artifacts?.[i.artifactId];return s?`Continue artifact ${s.id} (${s.kind}). Prior: ${s.summary||s.title}. User: ${n}`:null}function Ge(t,{ownerId:e,botUsername:r,now:o=Date.now(),ttlMs:n=600*1e3,token:i,randomBytes:s=or}={}){let l=t||D(),d=String(e||"").trim(),c=String(r||"").replace(/^@/,"").trim();if(!qe.test(d))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(c))throw new TypeError("bot username required");let u=i||s(16).toString("hex");if(!Fe.test(u))throw new TypeError("link token must be 32 hex chars");return l.links[ze(u)]={ownerId:d,expiresAt:o+Number(n)},{token:u,url:`https://t.me/${c}?start=${u}`,expiresAt:o+Number(n)}}function Xe(t,{token:e,telegramUserId:r,now:o=Date.now()}={}){let n=t||D(),i=String(e||"").trim(),s=String(r||"").trim();if(!Fe.test(i))return{ok:!1,error:"invalid start token"};if(!qe.test(s))return{ok:!1,error:"invalid telegram user"};let l=ze(i),d=n.links[l];return d?(delete n.links[l],Number(d.expiresAt)<=o?{ok:!1,error:"start token expired"}:String(d.ownerId)!==s?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:s}):{ok:!1,error:"unknown or already used start token"}}function br(t,e,{now:r,prepareLp:o=Re}={}){let n=Ue[e],i=t.payload?.lp&&typeof t.payload.lp=="object"?t.payload.lp:{},s=i[n]&&typeof i[n]=="object"?i[n]:null,l={artifactId:t.id,action:e,lpKind:n,unsigned:!0,broadcast:!1};if(!s||i.chainId==null)return{...l,envelope:null,reason:`artifact carries no ${n} params; desk must gather them`};try{let d=o({chainId:i.chainId,kind:n,params:s,deadlineSec:i.deadlineSec??300,from:i.owner??s.owner??s.recipient},{nowSeconds:Math.floor(Number(r)/1e3),nowMs:r});return{...l,envelope:d,reason:null}}catch(d){return{...l,envelope:null,reason:String(d?.message||d)}}}function W(t){let e=String(t||"");return e.length>=12?`${e.slice(0,6)}\u2026${e.slice(-4)}`:e}function Qe(t,{data:e,chatId:r,grant:o=null,now:n=Date.now(),prepareLp:i,guest:s=!1,followStore:l=null,bagReader:d=null}={}){let c=fr(e);if(!c)return null;if(!lr.has(c.action))return{text:"That card action is not available.",buttons:null};let u=t?.artifacts?.[c.artifactId];if(!u)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};if(r&&ue(t,{chatId:r,artifactId:u.id,now:n}),c.action==="follow"||c.action==="bag"){if(s)return{text:"Owner only.",buttons:null,prompt:null};let f=String(u.wallet||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(f))return{text:"No wallet on this card.",buttons:null,prompt:null};if(c.action==="follow"){if(!l||typeof l.add!="function")return{text:"Follow list is not available here.",buttons:null,prompt:null};let w=l.add({address:f,chainId:u.chainId??null,label:u.walletLabel??null,source:"tap"});return w.added?{text:`Following ${W(f)}. Alerts on its buys and sells from now.`,buttons:null,prompt:null,follow:w}:w.reason==="already-following"?{text:`Already following ${W(f)}.`,buttons:null,prompt:null,follow:w}:{text:`Not following ${W(f)}: ${w.reason}.`,buttons:null,prompt:null,follow:w}}return typeof d!="function"?{text:"Bag is not available here.",buttons:null,prompt:null}:{text:`Reading bag for ${W(f)}\u2026`,buttons:null,prompt:null,bag:d({chainId:u.chainId??null,address:f})}}let h=F({grant:o},{now:n}),b=Ke(u,h.allowed);if(c.action==="refresh")return{text:We(u),buttons:b,prompt:null};if(c.action==="deepen")return{text:null,buttons:null,prompt:`Deepen artifact ${u.id} (${u.kind}). Prior: ${u.summary||u.title}. Be terse. Do not sign or broadcast.`};if(c.action==="ta")return{text:null,buttons:null,prompt:`TA artifact ${u.id}. Prior: ${u.summary||u.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.`};if(c.action==="fa")return{text:null,buttons:null,prompt:`FA artifact ${u.id}. Prior: ${u.summary||u.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.`};if(c.action==="allow")return{text:"Allow is the graph. Open the ticket there and CONFIRM. Telegram did not send.",buttons:null,prompt:null};if(c.action==="deny")return{text:`Denied ${u.id}. Ticket cancelled. Nothing signed.`,buttons:null,prompt:null};if(c.action==="long"||c.action==="short")return{text:null,buttons:null,prompt:`Open the live graph ticket for a ${c.action} on artifact ${u.id}. Prior: ${u.summary||u.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`};let S=c.action==="prepare"?"Prepare":c.action[0].toUpperCase()+c.action.slice(1);if(!h.allowed)return{text:`${S} blocked \u2014 ${h.reason}. Deepen and Refresh still work.`,buttons:b,prompt:null};if(c.action in Ue){let f=br(u,c.action,{now:n,prepareLp:i});return{text:f.envelope?`Queued unsigned ${f.lpKind} for LP ${u.id} (${f.envelope.plan.actions.join("+")}, one modifyLiquidities). Nothing signed. Sign in your wallet.`:`${S} for ${u.id} needs inputs \u2014 ${f.reason}. Nothing signed.`,buttons:b,prompt:null,prepare:f}}return{text:`Queued unsigned prepare for ${u.id}. Nothing signed. Allow/Deny still required.`,buttons:b,prompt:null,prepare:{artifactId:u.id,unsigned:!0,broadcast:!1}}}function Je(t={},{grant:e=null,now:r=Date.now(),state:o}={}){let n=o||ce(),i=String(t.id||`art-${Math.abs(Number(r)).toString(36)}`).toLowerCase().slice(0,40),s=hr(n,{...t,id:i},{now:r}),l=F({grant:e},{now:r});return{text:We({...s,grant:e}),replyMarkup:Ke(s,l.allowed).replyMarkup,artifact:s,state:n}}var le=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
|
|
5
5
|
|
|
6
6
|
oracle telegram link --owner <tg-id> --bot <username>
|
|
7
7
|
oracle telegram redeem --token <32hex> --user <tg-id>
|
|
@@ -11,10 +11,10 @@ import{createHash as nr,randomBytes as or}from"node:crypto";import{mkdirSync as
|
|
|
11
11
|
|
|
12
12
|
Native oracle-gateway uses the same module. Hermes is an optional adapter that
|
|
13
13
|
must call this CLI instead of owning card state. Prepare is unsigned. Execute
|
|
14
|
-
stays on Allow/Deny.`;function E(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function Ze(t,e){return t.includes(e)}function gr(){return He(ae()),ce()}function
|
|
14
|
+
stays on Allow/Deny.`;function E(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function Ze(t,e){return t.includes(e)}function gr(){return He(ae()),ce()}function Y(t){je(ae(),t)}function U(t,e){t.write(JSON.stringify(e)+`
|
|
15
15
|
`)}async function wr(t=[],e={}){let r=e.out??process.stdout,o=e.err??process.stderr,n=t[0];if(!n||n==="--help"||n==="-h"||n==="help")return r.write(le+`
|
|
16
|
-
`),0;let i=gr();if(n==="link")try{let s=
|
|
17
|
-
`),1}if(n==="redeem"){let s=Xe(i,{token:E(t,"--token"),telegramUserId:E(t,"--user")});return
|
|
18
|
-
`),1}if(n==="callback"){let s=Qe(i,{data:E(t,"--data"),chatId:E(t,"--chat"),grant:Ze(t,"--grant")?{local:!0}:null});return
|
|
16
|
+
`),0;let i=gr();if(n==="link")try{let s=Ge(i,{ownerId:E(t,"--owner"),botUsername:E(t,"--bot")});return Y(i),U(r,{ok:!0,...s}),0}catch(s){return o.write(String(s.message||s)+`
|
|
17
|
+
`),1}if(n==="redeem"){let s=Xe(i,{token:E(t,"--token"),telegramUserId:E(t,"--user")});return Y(i),U(r,s),s.ok?0:1}if(n==="wrap")try{let s=Je({id:E(t,"--id"),kind:E(t,"--kind")||"thesis",title:E(t,"--title")||"Oracle artifact",summary:E(t,"--summary")||"",openUrl:E(t,"--url"),source:"oracle-telegram"},{grant:Ze(t,"--grant")?{local:!0}:null,state:i}),l=E(t,"--chat");return l&&ue(i,{chatId:l,artifactId:s.artifact.id}),Y(i),U(r,{ok:!0,text:s.text,replyMarkup:s.replyMarkup||null,artifactId:s.artifact.id,fallback:`Reply: deepen ${s.artifact.id} | refresh ${s.artifact.id}`}),0}catch(s){return o.write(String(s.message||s)+`
|
|
18
|
+
`),1}if(n==="callback"){let s=Qe(i,{data:E(t,"--data"),chatId:E(t,"--chat"),grant:Ze(t,"--grant")?{local:!0}:null});return Y(i),s?(U(r,{ok:!0,...s}),0):(U(r,{ok:!1,error:"not an interactive card callback"}),1)}if(n==="continue"){let s=Ye(i,{chatId:E(t,"--chat"),text:E(t,"--text")});return U(r,{ok:!0,prompt:s}),0}return o.write(`unknown telegram verb '${n}'
|
|
19
19
|
${le}
|
|
20
20
|
`),1}var Eo={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:le,run:t=>wr(t.argv||[])};export{Eo as default,wr as run};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var d=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(o){throw t=[o],o}};var E,Y=d(()=>{E={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}}});var rr,X=d(()=>{Y();rr=new Map(Object.values(E).map(e=>[e.chainId,e]))});var Z=d(()=>{});import{AsyncLocalStorage as Ve}from"node:async_hooks";var Nn,ee=d(()=>{Nn=new Ve});var te=d(()=>{});var Fn,Mn,qn,Hn,zn,Un,Wn,Vn,P=d(()=>{ee();te();Fn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Mn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qn=AbortSignal.prototype.throwIfAborted,Hn=EventTarget.prototype.addEventListener,zn=EventTarget.prototype.removeEventListener,Un=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Wn=64*1024,Vn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024})});var Ro,Lo,S=d(()=>{Ro=300*1e3,Lo=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{wordlists as Ns}from"ethers";var j=d(()=>{});var da,fa,pa,xe=d(()=>{da=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),fa=Object.freeze(["read","simulate"]),pa=1440*60});var Sa,Aa,va,Se=d(()=>{xe();Sa=Object.freeze(["privkey","wif","xprv","seed"]),Aa=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),va=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import k from"node:fs";import Bt from"node:os";import m from"node:path";import{fileURLToPath as Dt}from"node:url";function Te(){return process.env.ORACLE_FAKE_HOME||Bt.homedir()}function Ft(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function O(){return Ft()?process.env.ORACLE_CONFIG_DIR||m.join(Te(),".config","oracle"):m.join(Te(),".config","oracle")}function Mt(){return m.join(O(),"desk.json")}function qt(){return m.join(O(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._done=!0;let r={},t=(i,n)=>{if(n==null)return;let c=String(n).trim();c&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=c,r[i]=c))};try{let i=qt();if(k.existsSync(i))for(let n of k.readFileSync(i,"utf8").split(/\r?\n/)){let c=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!c||c[2].startsWith("#"))continue;let s=c[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),t(c[1],s)}}catch{}try{let i=Mt();if(k.existsSync(i)){let n=JSON.parse(k.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)),p._result=Object.keys(r).length?r:null,p._result}var jt,Bd,Ne=d(()=>{jt=m.dirname(Dt(import.meta.url)),Bd=m.resolve(jt,"../..");try{p()}catch{}});X();import K from"node:fs";import Oe from"node:path";import{homedir as $t}from"node:os";function _(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 u from"node:path";import Rt from"node:os";import{createHash as Lt,randomBytes as Bl}from"node:crypto";import{Interface as V,keccak256 as jl}from"ethers";import{Transaction as Ml}from"@scure/btc-signer";import{ed25519 as Hl}from"@noble/curves/ed25519.js";import{Interface as Me,MaxUint256 as jr,isAddress as Fr,keccak256 as Mr,toUtf8Bytes as qr}from"ethers";import{Interface as je,isAddress as br}from"ethers";import{isAddress as pr}from"ethers";var Ar=new je(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Fe,isAddress as kr}from"ethers";var Cr=new Fe(["function approve(address spender,uint256 amount) returns (bool)"]),_r=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Kr=new Me(["function approve(address spender,uint256 amount) returns (bool)"]);Z();import{readFileSync as Xr,readdirSync as Zr,existsSync as qe}from"node:fs";import{dirname as He,join as g}from"node:path";import{fileURLToPath as ze}from"node:url";var y=He(ze(import.meta.url));function Ue(){let e=[g(y,"descriptors"),g(y,"clear-sign","descriptors"),g(y,"..","clear-sign","descriptors"),g(y,"..","..","clear-sign","descriptors"),g(y,"..","..","..","clear-sign","descriptors")];for(let r of e)if(qe(r))return r;return e[0]}var rn=Ue();var nn=(1n<<256n)-1n;import{Address as pn,NETWORK as mn,OutScript as wn,RawTx as hn,SigHash as gn,TEST_NETWORK as yn,Transaction as bn}from"@scure/btc-signer";import{createHash as We}from"node:crypto";import{base58 as An}from"@scure/base";import{getCompiledTransactionMessageDecoder as In}from"@solana/transaction-messages";var Q=e=>We("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),kn=new Map([[Q("route"),{name:"route",prefixBytes:0}],[Q("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);P();var ro=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var ao=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"}),co=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 fo="0x"+"00".repeat(32);var Je=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),go=Object.freeze(Je.map(e=>e[0]));import{base58 as hs}from"@scure/base";import{Interface as ue}from"ethers";S();import{TypedDataEncoder as li,getAddress as di}from"ethers";S();import{TypedDataEncoder as jo,getAddress as Fo,isAddress as Mo}from"ethers";var Ye=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Xe=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"}]});P();import{TypedDataEncoder as Xo,getAddress as Zo,isAddress as Qo}from"ethers";var zo=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});S();var Ze=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),si=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var Qe=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"}]}),ai=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var mi=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var rt=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var _i=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 nt=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"}}),Ri=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Li=new ue(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),$i=new ue(["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"]),Pi=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 ot=Object.freeze([...rt]),Bi=Object.freeze({...nt});import{ed25519 as Zi}from"@noble/curves/ed25519.js";import{base58 as es}from"@scure/base";import{RawTx as rs,SigHash as ns,Transaction as os}from"@scure/btc-signer";import{Transaction as ss,keccak256 as as,verifyTypedData as cs}from"ethers";import{encode as Fi}from"@msgpack/msgpack";import{keccak256 as qi,verifyTypedData as Hi}from"ethers";var zi=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Ui=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});import{closeSync as Rs,constants as ct,fchmodSync as Ls,fsyncSync as $s,lstatSync as Ps,mkdirSync as Bs,openSync as Ds,readFileSync as js,renameSync as Fs,rmSync as Ms,writeFileSync as qs}from"node:fs";j();var Us=ct.O_NOFOLLOW??0;j();import{wordlists as Ks}from"ethers";var de=64*1024;var Gs=32*1024;var dt=["schemaVersion","buildVersion","recordType","execution","custody"],Zs=[...dt,"recordHash"];var Qs=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])});var ft=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Ee=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),oa=new Set(Ee);var yt=64*1024*1024;Se();var z=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Ta=Object.freeze(Object.fromEntries(z.map((e,r)=>[e,Object.freeze(r+1<z.length?[z[r+1]]:[])])));var bt=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"});var xt=Object.freeze(["owner","operator","agent","viewer"]),St=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),At=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),fc=Object.freeze(["owner"]),pc=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),mc=new Set(xt),wc=new Set(St),hc=new Set(Object.values(At));var vt=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),gc=Object.freeze(Object.fromEntries(Object.entries(vt).map(([e,r])=>[e,Object.freeze([...r])])));var It=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),kt=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),Ot=Object.freeze(["taskId","intentId","planId","runId","eventId"]);var xc=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),Sc=new Set(It),Ac=new Set(kt),vc=new Set(Ot);var Ic=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]);var kc=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"});var Rc=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"});var jc=32*1024*1024;var Mc=Object.freeze({N:1<<17,r:8,p:1}),qc=256*1024*1024,Hc=16*1024;var Uc=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 U}from"node:os";import{join as W}from"node:path";var Ae=process.env.ORACLE_PUBLIC_DESKTOP==="1",Tt=Ae?process.env.ORACLE_CONFIG_DIR||W(U(),".config","oracle"):W(U(),".config","oracle"),Jc=Ae?Tt:W(U(),".config","mad-desk");var Qc="0".repeat(64),eu=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 tu=Promise.resolve();import{Wallet as du}from"ethers";import{base58 as pu}from"@scure/base";import{ed25519 as wu}from"@noble/curves/ed25519.js";import{NETWORK as gu,TEST_NETWORK as yu,WIF as bu,p2wpkh as Eu}from"@scure/btc-signer";import{pubECDSA as Su}from"@scure/btc-signer/utils.js";var Iu=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),ku=Object.freeze(["binance","bybit","okx","coinbase"]),Ou=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),Tu=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),Nu=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Cu=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),_u=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Ru=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),Lu=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),$u=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Pu=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var _t=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}"]})}),Ie=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Wu=256*1024;var hd=new V(["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"]),gd=new V(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),yd=new V(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function ke(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||u.join(process.env.XDG_STATE_HOME||u.join(Rt.homedir(),".local","state"),"oracle"),t=Lt("sha256").update(u.resolve(e)).digest("hex").slice(0,16);return{vault:u.join(e,"vault.json"),policy:u.join(e,"signer-policy.json"),policyKey:u.join(e,"policy-integrity-key"),policyAnchor:u.join(r,`signer-policy-${t}.high-water`),ledger:u.join(e,"signer-ledger.json"),ledgerAnchor:u.join(r,`signer-ledger-${t}.high-water`),executionOutbox:u.join(e,"signer-execution-outbox.json"),cexOrders:u.join(e,"cex-orders.json"),cexOrdersAnchor:u.join(r,`cex-orders-${t}.high-water`),token:u.join(e,"signer-token"),lock:u.join(r,`signer-${t}.lock`),workflowLedger:u.join(e,"workflow-events.jsonl")}}function Pt(){return process.env.ORACLE_CONFIG_DIR||Oe.join($t(),".config","oracle")}function I(){let e=ke(Oe.join(Pt(),"signer")),r=K.existsSync(e.vault),t=K.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:K.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 Cd=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_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}}}]);Ne();import _e from"node:fs";import Vt from"node:path";var Ht=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function T(e){return String(e||"").trim()||void 0}function zt(e,{required:r=!1}={}){let t=T(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!Ht.has(t))throw new Error(`unsupported provider: ${t}`);return t}function Ut(e,{required:r=!1}={}){let t=T(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 Wt(e){let r=T(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 Ce({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=zt(e),n=Ut(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Wt(t)};if(T(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var Kt=new Set(["auto","standalone","hermes","remote","arch"]);function Jt(){return Vt.join(O(),"model.json")}function w(e){return String(e||"").trim()||void 0}function Gt(e={}){let r=w(e.backend)?.toLowerCase()||"auto",t=Ce({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=w(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=Object.fromEntries(Object.entries(e.contextByModel||{}).filter(([,f])=>Number.isSafeInteger(f)&&f>0)),c=w(e.reasoningEffort),s=w(e.computeHost||e.remoteHost),a=w(e.computeUser||e.remoteUser),h=w(e.computePath||e.remotePath);if(!Kt.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"&&!s)throw new Error("remote backend requires computeHost");return{backend:r,...t,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...Object.keys(n).length?{contextByModel:n}:{},...c?{reasoningEffort:c}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...h?{computePath:h}:{}}}function Re(){let e=Jt();if(!_e.existsSync(e))return null;try{return Gt(JSON.parse(_e.readFileSync(e,"utf8")))}catch{return null}}var Yt=new Set(["127.0.0.1","::1","localhost"]);function J({env:e=process.env,vault:r=null}={}){let t=r||I(),o=[];for(let[i,n]of Object.entries(E)){let c=(n.rpcEnv||[]).some(a=>String(e[a]||"").trim()),s="prepare";n.evm?c&&(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:c?"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 Xt({env:e=process.env,model:r=Re(),vault:t=I(),signerReachable:o=!1,quote:i=null,reviewAvailable:n=!1,receiptAvailable:c=!1}={}){let s=[],a=(l,C,$e,Pe=null)=>s.push({id:l,status:C,detail:$e,fix:Pe}),h=(()=>{let[l,C]=process.versions.node.split(".").map(Number);return l>20||l===20&&C>=19})();a("node",h?"ok":"fail",`node ${process.versions.node}`,h?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 f=e.ORACLE_SIGNER_HOST||"127.0.0.1";if(Yt.has(f)?a("signer",o?"ok":"warn",o?`loopback ${f}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${f} is not loopback`,"unset ORACLE_SIGNER_HOST"),!i)a("quote","warn","quote not probed",null);else if(i.ok){let l=String(i.detail||"net quote returned");a("quote","ok",l.length>140?`${l.slice(0,140)}\u2026`:l)}else a("quote","warn",i.detail||"quote unavailable","check network / oracle data serve");a("review",n?"ok":"fail",n?"sign-time review renders decoded action, policy hits, approval deltas":"sign-time review module missing from this build",n?null:"reinstall @oracle-agent/oracle (src/control/sign-time-review.mjs)"),a("receipt",c?"ok":"fail",c?"oracle receipt verifies on-chain state (SUCCESS/FAIL/UNKNOWN, finality-pinned)":"verified-receipt observer missing from this build",c?null:"reinstall @oracle-agent/oracle (src/desk/observe-receipt.mjs)");let Le=s.some(l=>l.status==="fail"),G=s.filter(l=>l.status==="ok").length;return{ok:!Le,checks:s,firstRunScore:{ok:G,total:s.length,label:`${G}/${s.length} first-run hops green`},venues:J({env:e,vault:t})}}async function Zd(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}}function N(e){let r=String(e??"?").replace(/[^\w.$-]/g,"");return r.length>12?`${r.slice(0,12)}...`:r||"?"}function Zt(e,r=120){let t=String(e??"").replace(/[\u0000-\u001f\u007f-\u009f]/g," ").replace(/\s+/g," ").trim();return t?t.length>r?`${t.slice(0,r)}...`:t:"quote failed"}async function Qd(){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:`${N(t.chainId)} ${N(t.baseToken?.symbol)}/${N(t.quoteToken?.symbol)} $${N(t.priceUsd)}`}}catch(e){return{ok:!1,detail:Zt(e instanceof Error?e.message:"quote failed")}}}var ef={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=J();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
|
|
1
|
+
var d=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(o){throw t=[o],o}};var E,Y=d(()=>{E={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});var rr,X=d(()=>{Y();rr=new Map(Object.values(E).map(e=>[e.chainId,e]))});var Z=d(()=>{});import{AsyncLocalStorage as Ve}from"node:async_hooks";var Nn,ee=d(()=>{Nn=new Ve});var te=d(()=>{});var Fn,Mn,qn,Hn,zn,Un,Wn,Vn,P=d(()=>{ee();te();Fn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Mn=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qn=AbortSignal.prototype.throwIfAborted,Hn=EventTarget.prototype.addEventListener,zn=EventTarget.prototype.removeEventListener,Un=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Wn=64*1024,Vn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024})});var Ro,Lo,S=d(()=>{Ro=300*1e3,Lo=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{wordlists as Ns}from"ethers";var j=d(()=>{});var da,fa,pa,xe=d(()=>{da=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),fa=Object.freeze(["read","simulate"]),pa=1440*60});var Sa,Aa,va,Se=d(()=>{xe();Sa=Object.freeze(["privkey","wif","xprv","seed"]),Aa=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),va=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import k from"node:fs";import Bt from"node:os";import m from"node:path";import{fileURLToPath as Dt}from"node:url";function Te(){return process.env.ORACLE_FAKE_HOME||Bt.homedir()}function Ft(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function O(){return Ft()?process.env.ORACLE_CONFIG_DIR||m.join(Te(),".config","oracle"):m.join(Te(),".config","oracle")}function Mt(){return m.join(O(),"desk.json")}function qt(){return m.join(O(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._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=qt();if(k.existsSync(i))for(let n of k.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=Mt();if(k.existsSync(i)){let n=JSON.parse(k.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)),p._result=Object.keys(r).length?r:null,p._result}var jt,Bd,Ne=d(()=>{jt=m.dirname(Dt(import.meta.url)),Bd=m.resolve(jt,"../..");try{p()}catch{}});X();import K from"node:fs";import Oe from"node:path";import{homedir as $t}from"node:os";function _(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 u from"node:path";import Rt from"node:os";import{createHash as Lt,randomBytes as Bl}from"node:crypto";import{Interface as V,keccak256 as jl}from"ethers";import{Transaction as Ml}from"@scure/btc-signer";import{ed25519 as Hl}from"@noble/curves/ed25519.js";import{Interface as Me,MaxUint256 as jr,isAddress as Fr,keccak256 as Mr,toUtf8Bytes as qr}from"ethers";import{Interface as je,isAddress as br}from"ethers";import{isAddress as pr}from"ethers";var Ar=new je(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Fe,isAddress as kr}from"ethers";var Cr=new Fe(["function approve(address spender,uint256 amount) returns (bool)"]),_r=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Kr=new Me(["function approve(address spender,uint256 amount) returns (bool)"]);Z();import{readFileSync as Xr,readdirSync as Zr,existsSync as qe}from"node:fs";import{dirname as He,join as g}from"node:path";import{fileURLToPath as ze}from"node:url";var y=He(ze(import.meta.url));function Ue(){let e=[g(y,"descriptors"),g(y,"clear-sign","descriptors"),g(y,"..","clear-sign","descriptors"),g(y,"..","..","clear-sign","descriptors"),g(y,"..","..","..","clear-sign","descriptors")];for(let r of e)if(qe(r))return r;return e[0]}var rn=Ue();var nn=(1n<<256n)-1n;import{Address as pn,NETWORK as mn,OutScript as wn,RawTx as hn,SigHash as gn,TEST_NETWORK as yn,Transaction as bn}from"@scure/btc-signer";import{createHash as We}from"node:crypto";import{base58 as An}from"@scure/base";import{getCompiledTransactionMessageDecoder as In}from"@solana/transaction-messages";var Q=e=>We("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),kn=new Map([[Q("route"),{name:"route",prefixBytes:0}],[Q("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);P();var ro=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var ao=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"}),co=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 fo="0x"+"00".repeat(32);var Je=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),go=Object.freeze(Je.map(e=>e[0]));import{base58 as hs}from"@scure/base";import{Interface as ue}from"ethers";S();import{TypedDataEncoder as li,getAddress as di}from"ethers";S();import{TypedDataEncoder as jo,getAddress as Fo,isAddress as Mo}from"ethers";var Ye=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Xe=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"}]});P();import{TypedDataEncoder as Xo,getAddress as Zo,isAddress as Qo}from"ethers";var zo=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});S();var Ze=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),si=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var Qe=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"}]}),ai=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var mi=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var rt=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var _i=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 nt=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"}}),Ri=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Li=new ue(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),$i=new ue(["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"]),Pi=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 ot=Object.freeze([...rt]),Bi=Object.freeze({...nt});import{ed25519 as Zi}from"@noble/curves/ed25519.js";import{base58 as es}from"@scure/base";import{RawTx as rs,SigHash as ns,Transaction as os}from"@scure/btc-signer";import{Transaction as ss,keccak256 as as,verifyTypedData as cs}from"ethers";import{encode as Fi}from"@msgpack/msgpack";import{keccak256 as qi,verifyTypedData as Hi}from"ethers";var zi=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Ui=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});import{closeSync as Rs,constants as ct,fchmodSync as Ls,fsyncSync as $s,lstatSync as Ps,mkdirSync as Bs,openSync as Ds,readFileSync as js,renameSync as Fs,rmSync as Ms,writeFileSync as qs}from"node:fs";j();var Us=ct.O_NOFOLLOW??0;j();import{wordlists as Ks}from"ethers";var de=64*1024;var Gs=32*1024;var dt=["schemaVersion","buildVersion","recordType","execution","custody"],Zs=[...dt,"recordHash"];var Qs=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])});var ft=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Ee=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),oa=new Set(Ee);var yt=64*1024*1024;Se();var z=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Ta=Object.freeze(Object.fromEntries(z.map((e,r)=>[e,Object.freeze(r+1<z.length?[z[r+1]]:[])])));var bt=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"});var xt=Object.freeze(["owner","operator","agent","viewer"]),St=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),At=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),fc=Object.freeze(["owner"]),pc=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),mc=new Set(xt),wc=new Set(St),hc=new Set(Object.values(At));var vt=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),gc=Object.freeze(Object.fromEntries(Object.entries(vt).map(([e,r])=>[e,Object.freeze([...r])])));var It=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),kt=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),Ot=Object.freeze(["taskId","intentId","planId","runId","eventId"]);var xc=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),Sc=new Set(It),Ac=new Set(kt),vc=new Set(Ot);var Ic=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]);var kc=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"});var Rc=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"});var jc=32*1024*1024;var Mc=Object.freeze({N:1<<17,r:8,p:1}),qc=256*1024*1024,Hc=16*1024;var Uc=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 U}from"node:os";import{join as W}from"node:path";var Ae=process.env.ORACLE_PUBLIC_DESKTOP==="1",Tt=Ae?process.env.ORACLE_CONFIG_DIR||W(U(),".config","oracle"):W(U(),".config","oracle"),Jc=Ae?Tt:W(U(),".config","mad-desk");var Qc="0".repeat(64),eu=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 tu=Promise.resolve();import{Wallet as du}from"ethers";import{base58 as pu}from"@scure/base";import{ed25519 as wu}from"@noble/curves/ed25519.js";import{NETWORK as gu,TEST_NETWORK as yu,WIF as bu,p2wpkh as Eu}from"@scure/btc-signer";import{pubECDSA as Su}from"@scure/btc-signer/utils.js";var Iu=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),ku=Object.freeze(["binance","bybit","okx","coinbase"]),Ou=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),Tu=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),Nu=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Cu=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),_u=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Ru=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),Lu=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),$u=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Pu=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var _t=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}"]})}),Ie=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Wu=256*1024;var hd=new V(["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"]),gd=new V(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),yd=new V(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function ke(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||u.join(process.env.XDG_STATE_HOME||u.join(Rt.homedir(),".local","state"),"oracle"),t=Lt("sha256").update(u.resolve(e)).digest("hex").slice(0,16);return{vault:u.join(e,"vault.json"),policy:u.join(e,"signer-policy.json"),policyKey:u.join(e,"policy-integrity-key"),policyAnchor:u.join(r,`signer-policy-${t}.high-water`),ledger:u.join(e,"signer-ledger.json"),ledgerAnchor:u.join(r,`signer-ledger-${t}.high-water`),executionOutbox:u.join(e,"signer-execution-outbox.json"),cexOrders:u.join(e,"cex-orders.json"),cexOrdersAnchor:u.join(r,`cex-orders-${t}.high-water`),token:u.join(e,"signer-token"),lock:u.join(r,`signer-${t}.lock`),workflowLedger:u.join(e,"workflow-events.jsonl")}}function Pt(){return process.env.ORACLE_CONFIG_DIR||Oe.join($t(),".config","oracle")}function I(){let e=ke(Oe.join(Pt(),"signer")),r=K.existsSync(e.vault),t=K.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:K.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 Cd=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_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}}}]);Ne();import _e from"node:fs";import Vt from"node:path";var Ht=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function T(e){return String(e||"").trim()||void 0}function zt(e,{required:r=!1}={}){let t=T(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!Ht.has(t))throw new Error(`unsupported provider: ${t}`);return t}function Ut(e,{required:r=!1}={}){let t=T(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 Wt(e){let r=T(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 Ce({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=zt(e),n=Ut(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Wt(t)};if(T(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var Kt=new Set(["auto","standalone","hermes","remote","arch"]);function Jt(){return Vt.join(O(),"model.json")}function w(e){return String(e||"").trim()||void 0}function Gt(e={}){let r=w(e.backend)?.toLowerCase()||"auto",t=Ce({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=w(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=Object.fromEntries(Object.entries(e.contextByModel||{}).filter(([,f])=>Number.isSafeInteger(f)&&f>0)),a=w(e.reasoningEffort),s=w(e.computeHost||e.remoteHost),c=w(e.computeUser||e.remoteUser),h=w(e.computePath||e.remotePath);if(!Kt.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"&&!s)throw new Error("remote backend requires computeHost");return{backend:r,...t,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...Object.keys(n).length?{contextByModel:n}:{},...a?{reasoningEffort:a}:{},...s?{computeHost:s}:{},...c?{computeUser:c}:{},...h?{computePath:h}:{}}}function Re(){let e=Jt();if(!_e.existsSync(e))return null;try{return Gt(JSON.parse(_e.readFileSync(e,"utf8")))}catch{return null}}var Yt=new Set(["127.0.0.1","::1","localhost"]);function J({env:e=process.env,vault:r=null}={}){let t=r||I(),o=[];for(let[i,n]of Object.entries(E)){let a=(n.rpcEnv||[]).some(c=>String(e[c]||"").trim());if(n.readOnly===!0){o.push({key:i,chainId:n.chainId,name:n.name,family:"evm",status:"read-only",execute:!1,note:a?"rpc configured; reads only \u2014 no venue, no prepare, no signer":"public RPC reads only \u2014 no venue, no prepare, no signer"});continue}let 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 Xt({env:e=process.env,model:r=Re(),vault:t=I(),signerReachable:o=!1,quote:i=null,reviewAvailable:n=!1,receiptAvailable:a=!1}={}){let s=[],c=(l,C,$e,Pe=null)=>s.push({id:l,status:C,detail:$e,fix:Pe}),h=(()=>{let[l,C]=process.versions.node.split(".").map(Number);return l>20||l===20&&C>=19})();c("node",h?"ok":"fail",`node ${process.versions.node}`,h?null:"install node >= 20.19"),r?r.backend==="hermes"?c("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):c("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):c("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?c("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):c("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):c("vault","fail","no local vault","oracle sign init");let f=e.ORACLE_SIGNER_HOST||"127.0.0.1";if(Yt.has(f)?c("signer",o?"ok":"warn",o?`loopback ${f}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):c("signer","fail",`signer host ${f} is not loopback`,"unset ORACLE_SIGNER_HOST"),!i)c("quote","warn","quote not probed",null);else if(i.ok){let l=String(i.detail||"net quote returned");c("quote","ok",l.length>140?`${l.slice(0,140)}\u2026`:l)}else c("quote","warn",i.detail||"quote unavailable","check network / oracle data serve");c("review",n?"ok":"fail",n?"sign-time review renders decoded action, policy hits, approval deltas":"sign-time review module missing from this build",n?null:"reinstall @oracle-agent/oracle (src/control/sign-time-review.mjs)"),c("receipt",a?"ok":"fail",a?"oracle receipt verifies on-chain state (SUCCESS/FAIL/UNKNOWN, finality-pinned)":"verified-receipt observer missing from this build",a?null:"reinstall @oracle-agent/oracle (src/desk/observe-receipt.mjs)");let Le=s.some(l=>l.status==="fail"),G=s.filter(l=>l.status==="ok").length;return{ok:!Le,checks:s,firstRunScore:{ok:G,total:s.length,label:`${G}/${s.length} first-run hops green`},venues:J({env:e,vault:t})}}async function Zd(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}}function N(e){let r=String(e??"?").replace(/[^\w.$-]/g,"");return r.length>12?`${r.slice(0,12)}...`:r||"?"}function Zt(e,r=120){let t=String(e??"").replace(/[\u0000-\u001f\u007f-\u009f]/g," ").replace(/\s+/g," ").trim();return t?t.length>r?`${t.slice(0,r)}...`:t:"quote failed"}async function Qd(){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:`${N(t.chainId)} ${N(t.baseToken?.symbol)}/${N(t.quoteToken?.symbol)} $${N(t.priceUsd)}`}}catch(e){return{ok:!1,detail:Zt(e instanceof Error?e.message:"quote failed")}}}var ef={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=J();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
3
|
`);return 0}};export{_ as classifyReceipt,ef as default,Zt as detailText,Xt as firstHourReport,Qd as probeQuote,Zd as probeSigner,N as symbol,I as vaultStatus};
|