@oracle-agent/oracle 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +13 -516
  3. package/bin/oracle.mjs +19 -27
  4. package/package.json +15 -98
  5. package/CONTRIBUTING.md +0 -98
  6. package/SECURITY.md +0 -89
  7. package/SETUP.md +0 -381
  8. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  9. package/artifacts/inscription/oracle-was-here.svg +0 -1
  10. package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
  11. package/bin/desk-server.mjs +0 -440
  12. package/bin/oracle-data-mcp.mjs +0 -1019
  13. package/bin/oracle-init.mjs +0 -496
  14. package/bin/oracle-public-server.mjs +0 -36
  15. package/bin/oracle-route.mjs +0 -254
  16. package/bin/oracle-scan.mjs +0 -192
  17. package/bin/oracle-upgrade.mjs +0 -42
  18. package/docs/adding-a-chain.md +0 -229
  19. package/docs/architecture.md +0 -138
  20. package/docs/cli.md +0 -47
  21. package/docs/connectors.md +0 -13
  22. package/docs/oracle-pack-standard.md +0 -29
  23. package/docs/profiles.md +0 -151
  24. package/docs/public-surface.md +0 -133
  25. package/examples/add-a-chain.mjs +0 -65
  26. package/examples/oracle-pack-template.mjs +0 -38
  27. package/examples/research-a-token.mjs +0 -70
  28. package/plugins/oracle-owner-gate/__init__.py +0 -227
  29. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  30. package/profiles/_template/SOUL.md +0 -54
  31. package/profiles/_template/profile.json +0 -22
  32. package/profiles/bitcoin-agent/SOUL.md +0 -31
  33. package/profiles/bitcoin-agent/profile.json +0 -32
  34. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  35. package/profiles/hyperliquid-agent/profile.json +0 -37
  36. package/profiles/oracle/SOUL.md +0 -107
  37. package/profiles/oracle/profile.json +0 -39
  38. package/profiles/polymarket-agent/SOUL.md +0 -35
  39. package/profiles/polymarket-agent/profile.json +0 -34
  40. package/profiles/profile.schema.json +0 -90
  41. package/profiles/protocol-builder/SOUL.md +0 -57
  42. package/profiles/protocol-builder/profile.json +0 -39
  43. package/profiles/robinhood-agent/SOUL.md +0 -53
  44. package/profiles/robinhood-agent/profile.json +0 -40
  45. package/profiles/solana-agent/SOUL.md +0 -37
  46. package/profiles/solana-agent/profile.json +0 -37
  47. package/profiles/stable-agent/SOUL.md +0 -43
  48. package/profiles/stable-agent/profile.json +0 -37
  49. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  50. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  51. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  52. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  53. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  54. package/public/agent-connect/app.js +0 -84
  55. package/public/agent-connect/index.html +0 -83
  56. package/public/agent-connect/styles.css +0 -70
  57. package/public/index.html +0 -12
  58. package/public/oracle-console/app.js +0 -272
  59. package/public/oracle-console/bitcoin-wallets.js +0 -206
  60. package/public/oracle-console/index.html +0 -91
  61. package/public/oracle-console/styles.css +0 -239
  62. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  63. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  64. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  65. package/public/oracle-splash/assets/llms/claude.svg +0 -1
  66. package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
  67. package/public/oracle-splash/assets/llms/codex.svg +0 -1
  68. package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
  69. package/public/oracle-splash/assets/llms/cursor.svg +0 -17
  70. package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
  71. package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
  72. package/public/oracle-splash/assets/llms/gemini.svg +0 -1
  73. package/public/oracle-splash/assets/llms/grok.svg +0 -8
  74. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  75. package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
  76. package/public/oracle-splash/assets/llms/kimi.svg +0 -1
  77. package/public/oracle-splash/assets/llms/manus.svg +0 -18
  78. package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
  79. package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
  80. package/public/oracle-splash/assets/llms/qwen.svg +0 -1
  81. package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
  82. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  83. package/public/oracle-splash/assets/protocols/across.png +0 -0
  84. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  85. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  86. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  87. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  88. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  89. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  90. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  91. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  92. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  93. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  94. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  95. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  96. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  97. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  98. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  99. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  100. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  101. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  102. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  103. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  104. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  106. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  107. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  108. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  109. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  110. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  111. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  112. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  113. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  114. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  115. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  116. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  117. package/public/oracle-splash/assets/wordmarks/across.svg +0 -4
  118. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
  119. package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
  120. package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
  121. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  122. package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
  123. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  124. package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
  125. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
  126. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
  127. package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
  128. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
  129. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  130. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  131. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +0 -1
  132. package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
  133. package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
  134. package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
  135. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  136. package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
  137. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
  138. package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
  139. package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
  140. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
  141. package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
  142. package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
  143. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  144. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  145. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  146. package/public/oracle-splash/assets/wordmarks/relay.svg +0 -8
  147. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  148. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  149. package/public/oracle-splash/assets/wordmarks/stargate.svg +0 -15
  150. package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
  151. package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
  152. package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
  153. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  154. package/public/oracle-splash/brand/aave.webp +0 -0
  155. package/public/oracle-splash/brand/aavev2.webp +0 -0
  156. package/public/oracle-splash/brand/aborean.webp +0 -0
  157. package/public/oracle-splash/brand/across.webp +0 -0
  158. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  159. package/public/oracle-splash/brand/afi.webp +0 -0
  160. package/public/oracle-splash/brand/arcus.webp +0 -0
  161. package/public/oracle-splash/brand/aster.webp +0 -0
  162. package/public/oracle-splash/brand/avant.webp +0 -0
  163. package/public/oracle-splash/brand/balancer.webp +0 -0
  164. package/public/oracle-splash/brand/beefy.webp +0 -0
  165. package/public/oracle-splash/brand/benqi.webp +0 -0
  166. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  167. package/public/oracle-splash/brand/bitfi.webp +0 -0
  168. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  169. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  170. package/public/oracle-splash/brand/camelot.webp +0 -0
  171. package/public/oracle-splash/brand/compound.webp +0 -0
  172. package/public/oracle-splash/brand/concrete.webp +0 -0
  173. package/public/oracle-splash/brand/cow.webp +0 -0
  174. package/public/oracle-splash/brand/curve.webp +0 -0
  175. package/public/oracle-splash/brand/derive.webp +0 -0
  176. package/public/oracle-splash/brand/dolomite.webp +0 -0
  177. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  178. package/public/oracle-splash/brand/ekubo.webp +0 -0
  179. package/public/oracle-splash/brand/ethena.webp +0 -0
  180. package/public/oracle-splash/brand/etherfi.webp +0 -0
  181. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  182. package/public/oracle-splash/brand/felix.webp +0 -0
  183. package/public/oracle-splash/brand/fluid.webp +0 -0
  184. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  185. package/public/oracle-splash/brand/folks.webp +0 -0
  186. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  187. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  188. package/public/oracle-splash/brand/gassss.webp +0 -0
  189. package/public/oracle-splash/brand/gmx.webp +0 -0
  190. package/public/oracle-splash/brand/harmonix.webp +0 -0
  191. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  192. package/public/oracle-splash/brand/hlp.webp +0 -0
  193. package/public/oracle-splash/brand/hop.webp +0 -0
  194. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  195. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  196. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  197. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  198. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  199. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  200. package/public/oracle-splash/brand/hypha.webp +0 -0
  201. package/public/oracle-splash/brand/joedex.webp +0 -0
  202. package/public/oracle-splash/brand/jupiter.webp +0 -0
  203. package/public/oracle-splash/brand/kelp.webp +0 -0
  204. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  205. package/public/oracle-splash/brand/kmhype.webp +0 -0
  206. package/public/oracle-splash/brand/kona.webp +0 -0
  207. package/public/oracle-splash/brand/konalend.webp +0 -0
  208. package/public/oracle-splash/brand/lfj.webp +0 -0
  209. package/public/oracle-splash/brand/lido.webp +0 -0
  210. package/public/oracle-splash/brand/lifi.webp +0 -0
  211. package/public/oracle-splash/brand/lighter.webp +0 -0
  212. package/public/oracle-splash/brand/lista.webp +0 -0
  213. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  214. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  215. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  216. package/public/oracle-splash/brand/magiceden.webp +0 -0
  217. package/public/oracle-splash/brand/mempool.png +0 -0
  218. package/public/oracle-splash/brand/meteora.webp +0 -0
  219. package/public/oracle-splash/brand/morpho.webp +0 -0
  220. package/public/oracle-splash/brand/myriad.webp +0 -0
  221. package/public/oracle-splash/brand/noxa.webp +0 -0
  222. package/public/oracle-splash/brand/odos.webp +0 -0
  223. package/public/oracle-splash/brand/oneinch.webp +0 -0
  224. package/public/oracle-splash/brand/openbook.webp +0 -0
  225. package/public/oracle-splash/brand/opensea.webp +0 -0
  226. package/public/oracle-splash/brand/orca.webp +0 -0
  227. package/public/oracle-splash/brand/ordinals.png +0 -0
  228. package/public/oracle-splash/brand/ostium.webp +0 -0
  229. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  230. package/public/oracle-splash/brand/pendle.webp +0 -0
  231. package/public/oracle-splash/brand/perena.webp +0 -0
  232. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  233. package/public/oracle-splash/brand/phoenix.webp +0 -0
  234. package/public/oracle-splash/brand/polymarket.webp +0 -0
  235. package/public/oracle-splash/brand/polynomial.webp +0 -0
  236. package/public/oracle-splash/brand/projectx.webp +0 -0
  237. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  238. package/public/oracle-splash/brand/quickswap.webp +0 -0
  239. package/public/oracle-splash/brand/rain.webp +0 -0
  240. package/public/oracle-splash/brand/raydium.webp +0 -0
  241. package/public/oracle-splash/brand/relay.webp +0 -0
  242. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  243. package/public/oracle-splash/brand/saber.webp +0 -0
  244. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  245. package/public/oracle-splash/brand/sanctum.webp +0 -0
  246. package/public/oracle-splash/brand/satflow.png +0 -0
  247. package/public/oracle-splash/brand/sierra.webp +0 -0
  248. package/public/oracle-splash/brand/sky.webp +0 -0
  249. package/public/oracle-splash/brand/solv.webp +0 -0
  250. package/public/oracle-splash/brand/spark.webp +0 -0
  251. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  252. package/public/oracle-splash/brand/sphere.webp +0 -0
  253. package/public/oracle-splash/brand/ssv.webp +0 -0
  254. package/public/oracle-splash/brand/stabble.webp +0 -0
  255. package/public/oracle-splash/brand/stableswap.webp +0 -0
  256. package/public/oracle-splash/brand/stakewise.webp +0 -0
  257. package/public/oracle-splash/brand/stargate.webp +0 -0
  258. package/public/oracle-splash/brand/sthype.webp +0 -0
  259. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  260. package/public/oracle-splash/brand/unisat.png +0 -0
  261. package/public/oracle-splash/brand/uniswap.webp +0 -0
  262. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  263. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  264. package/public/oracle-splash/brand/unit.webp +0 -0
  265. package/public/oracle-splash/brand/velodrome.webp +0 -0
  266. package/public/oracle-splash/brand/velora.webp +0 -0
  267. package/public/oracle-splash/brand/venus.webp +0 -0
  268. package/public/oracle-splash/brand/wbeth.webp +0 -0
  269. package/public/oracle-splash/brand/xsy.webp +0 -0
  270. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  271. package/public/oracle-splash/brand/zerobase.webp +0 -0
  272. package/public/oracle-splash/brand/zerox.webp +0 -0
  273. package/public/oracle-splash/favicon.ico +0 -0
  274. package/public/oracle-splash/favicon.svg +0 -6
  275. package/public/oracle-splash/index.html +0 -1558
  276. package/public/oracle-splash/mesh-graph.png +0 -0
  277. package/public/oracle-splash/mesh-graph.svg +0 -216
  278. package/scripts/adversarial-bench.mjs +0 -114
  279. package/scripts/build-inscription.py +0 -230
  280. package/scripts/check-doc-drift.mjs +0 -123
  281. package/scripts/check-test-count.mjs +0 -105
  282. package/scripts/e2e-hl-markets.mjs +0 -21
  283. package/scripts/e2e-hl-perps.mjs +0 -48
  284. package/scripts/e2e-hypercore-staking.mjs +0 -128
  285. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  286. package/scripts/protocol-template-gate.mjs +0 -15
  287. package/scripts/public-api-scan.mjs +0 -23
  288. package/scripts/secret-scan.mjs +0 -181
  289. package/scripts/verify-v3-venues.mjs +0 -192
  290. package/skills/balance/SKILL.md +0 -176
  291. package/skills/oracle-action-semantics/SKILL.md +0 -40
  292. package/skills/oracle-best-execution/SKILL.md +0 -127
  293. package/skills/oracle-bitcoin/SKILL.md +0 -53
  294. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  295. package/skills/oracle-chat/SKILL.md +0 -61
  296. package/skills/oracle-chat/chain.SKILL.md +0 -31
  297. package/skills/oracle-chat/setup.SKILL.md +0 -37
  298. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  299. package/skills/oracle-contract-research/SKILL.md +0 -55
  300. package/skills/oracle-desk/SKILL.md +0 -58
  301. package/skills/oracle-dex-launch/SKILL.md +0 -38
  302. package/skills/oracle-grants/SKILL.md +0 -69
  303. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  304. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  305. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  306. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  307. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  308. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  309. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  310. package/skills/oracle-polymarket/SKILL.md +0 -60
  311. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  312. package/skills/oracle-protocol-security/SKILL.md +0 -60
  313. package/skills/oracle-public-product/SKILL.md +0 -44
  314. package/skills/oracle-receipts/SKILL.md +0 -52
  315. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  316. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  317. package/skills/oracle-solana/SKILL.md +0 -65
  318. package/skills/oracle-solana-nft/SKILL.md +0 -54
  319. package/skills/oracle-token-research/SKILL.md +0 -67
  320. package/skins/oracle.yaml +0 -56
  321. package/src/action-receipts.mjs +0 -265
  322. package/src/action-semantics.mjs +0 -62
  323. package/src/address-book.mjs +0 -208
  324. package/src/agent-auth.mjs +0 -206
  325. package/src/approval-guard.mjs +0 -282
  326. package/src/attestation-secret.mjs +0 -88
  327. package/src/audit-log.mjs +0 -196
  328. package/src/auth/oauth.mjs +0 -672
  329. package/src/auto-slippage.mjs +0 -378
  330. package/src/capability-posture.mjs +0 -125
  331. package/src/chains.mjs +0 -62
  332. package/src/cli/chain-catalog.mjs +0 -215
  333. package/src/cli/chain-state.mjs +0 -74
  334. package/src/cli/commands/auth.mjs +0 -193
  335. package/src/cli/commands/bootstrap.mjs +0 -87
  336. package/src/cli/commands/chain.mjs +0 -143
  337. package/src/cli/commands/chat.mjs +0 -434
  338. package/src/cli/commands/credential.mjs +0 -9
  339. package/src/cli/commands/data-mcp.mjs +0 -18
  340. package/src/cli/commands/data.mjs +0 -75
  341. package/src/cli/commands/doctor.mjs +0 -136
  342. package/src/cli/commands/help.mjs +0 -7
  343. package/src/cli/commands/init.mjs +0 -27
  344. package/src/cli/commands/mcp.mjs +0 -142
  345. package/src/cli/commands/model.mjs +0 -99
  346. package/src/cli/commands/prepare.mjs +0 -12
  347. package/src/cli/commands/public.mjs +0 -20
  348. package/src/cli/commands/route.mjs +0 -12
  349. package/src/cli/commands/runner.mjs +0 -9
  350. package/src/cli/commands/scan.mjs +0 -12
  351. package/src/cli/commands/setup.mjs +0 -275
  352. package/src/cli/commands/sign.mjs +0 -21
  353. package/src/cli/commands/signer.mjs +0 -9
  354. package/src/cli/commands/upgrade.mjs +0 -12
  355. package/src/cli/commands/vault.mjs +0 -9
  356. package/src/cli/commands/version.mjs +0 -22
  357. package/src/cli/first-run.mjs +0 -23
  358. package/src/cli/kernel.mjs +0 -239
  359. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  360. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  361. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  362. package/src/cli/mcp-targets/codex.mjs +0 -41
  363. package/src/cli/mcp-targets/shared.mjs +0 -61
  364. package/src/cli/messaging-platforms.mjs +0 -209
  365. package/src/cli/model-config.mjs +0 -70
  366. package/src/cli/operator-dispatch.mjs +0 -258
  367. package/src/cli/oracle-harness.py +0 -415
  368. package/src/cli/paths.mjs +0 -83
  369. package/src/cli/runtime.mjs +0 -351
  370. package/src/cli/setup-state.mjs +0 -168
  371. package/src/cli/spawn-child.mjs +0 -43
  372. package/src/data/catalog.mjs +0 -585
  373. package/src/data/desk-data.mjs +0 -695
  374. package/src/data/http.mjs +0 -253
  375. package/src/data/provider-endpoint.mjs +0 -94
  376. package/src/data/providers/aerodrome.mjs +0 -245
  377. package/src/data/providers/balancer.mjs +0 -209
  378. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  379. package/src/data/providers/bitcoin-meta.mjs +0 -378
  380. package/src/data/providers/blockscout.mjs +0 -14
  381. package/src/data/providers/bridges.mjs +0 -242
  382. package/src/data/providers/cowswap.mjs +0 -415
  383. package/src/data/providers/curve.mjs +0 -201
  384. package/src/data/providers/defillama.mjs +0 -88
  385. package/src/data/providers/dexscreener.mjs +0 -43
  386. package/src/data/providers/evm-rpc.mjs +0 -225
  387. package/src/data/providers/geckoterminal.mjs +0 -34
  388. package/src/data/providers/gmx.mjs +0 -496
  389. package/src/data/providers/hl-assets.mjs +0 -165
  390. package/src/data/providers/hl-info.mjs +0 -108
  391. package/src/data/providers/hl-markets.mjs +0 -210
  392. package/src/data/providers/hl-outcome.mjs +0 -61
  393. package/src/data/providers/hl-perps.mjs +0 -387
  394. package/src/data/providers/hl-staking.mjs +0 -353
  395. package/src/data/providers/hl-ws.mjs +0 -119
  396. package/src/data/providers/hyperevm-dex.mjs +0 -49
  397. package/src/data/providers/jupiter-venues.mjs +0 -119
  398. package/src/data/providers/jupiter.mjs +0 -315
  399. package/src/data/providers/lifi.mjs +0 -151
  400. package/src/data/providers/magiceden-sol.mjs +0 -406
  401. package/src/data/providers/morpho.mjs +0 -177
  402. package/src/data/providers/nft-gallery.mjs +0 -163
  403. package/src/data/providers/nft-portfolio.mjs +0 -494
  404. package/src/data/providers/odos.mjs +0 -156
  405. package/src/data/providers/oneinch.mjs +0 -174
  406. package/src/data/providers/opensea-multichain.mjs +0 -136
  407. package/src/data/providers/opensea-nft.mjs +0 -371
  408. package/src/data/providers/paraswap.mjs +0 -118
  409. package/src/data/providers/pendle.mjs +0 -188
  410. package/src/data/providers/poly-clob.mjs +0 -283
  411. package/src/data/providers/poly-public.mjs +0 -96
  412. package/src/data/providers/poly-ws.mjs +0 -103
  413. package/src/data/providers/portfolio-history.mjs +0 -394
  414. package/src/data/providers/portfolio.mjs +0 -594
  415. package/src/data/providers/rfq.mjs +0 -15
  416. package/src/data/providers/rh-agent.mjs +0 -59
  417. package/src/data/providers/satflow.mjs +0 -341
  418. package/src/data/providers/signed-material-guard.mjs +0 -108
  419. package/src/data/providers/solana-rpc.mjs +0 -197
  420. package/src/data/providers/uniswap-v3.mjs +0 -349
  421. package/src/data/providers/uniswap-v4.mjs +0 -414
  422. package/src/data/providers/zerox.mjs +0 -167
  423. package/src/data/public-api-scan.mjs +0 -61
  424. package/src/data/quote-placeholder.mjs +0 -31
  425. package/src/exact-integer.mjs +0 -72
  426. package/src/exec-policy.mjs +0 -455
  427. package/src/flags.mjs +0 -15
  428. package/src/fresh-window.mjs +0 -76
  429. package/src/gmx-attestation.mjs +0 -176
  430. package/src/index.mjs +0 -100
  431. package/src/nft-gas-war-guard.mjs +0 -139
  432. package/src/onboarding/agent-keys.mjs +0 -161
  433. package/src/onboarding/harness-configs.mjs +0 -102
  434. package/src/onboarding/index.mjs +0 -18
  435. package/src/onboarding/tiers.mjs +0 -139
  436. package/src/oracle-env.mjs +0 -47
  437. package/src/portfolio-risk.mjs +0 -170
  438. package/src/prepare-envelope.mjs +0 -204
  439. package/src/profile-upgrade.mjs +0 -277
  440. package/src/protocol-execution.mjs +0 -84
  441. package/src/protocol-templates/gate.mjs +0 -179
  442. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  443. package/src/public-api/buzz-integration.mjs +0 -256
  444. package/src/public-api/connect-agent.mjs +0 -416
  445. package/src/public-api/grants.mjs +0 -142
  446. package/src/public-api/http.mjs +0 -389
  447. package/src/public-control/aa-adapter.mjs +0 -402
  448. package/src/public-control/build-registry.mjs +0 -227
  449. package/src/public-control/bundler-client.mjs +0 -357
  450. package/src/public-control/grant-indexer.mjs +0 -296
  451. package/src/public-control/policy-render.mjs +0 -69
  452. package/src/public-control/policy-schema.mjs +0 -318
  453. package/src/public-control/runtime-config.mjs +0 -275
  454. package/src/public-control/session-key-model.mjs +0 -374
  455. package/src/public-control/session-orchestrator.mjs +0 -412
  456. package/src/rfq/intent.mjs +0 -180
  457. package/src/rfq/sources.mjs +0 -181
  458. package/src/route-attestation.mjs +0 -132
  459. package/src/router/best-execution.mjs +0 -326
  460. package/src/router/index.mjs +0 -226
  461. package/src/router/prepare-bridge.mjs +0 -289
  462. package/src/router/prepare-route.mjs +0 -398
  463. package/src/router/proposal.mjs +0 -311
  464. package/src/router/risk-classifier.mjs +0 -119
  465. package/src/router/route-sources.mjs +0 -364
  466. package/src/scanner/chains.config.mjs +0 -430
  467. package/src/scanner/contract.mjs +0 -270
  468. package/src/scanner/evm-scanner.mjs +0 -394
  469. package/src/scanner/index.mjs +0 -9
  470. package/src/scanner/v2-venue.mjs +0 -335
  471. package/src/scanner/v3-venue.mjs +0 -290
  472. package/src/scopes.mjs +0 -44
  473. package/src/sell-simulation.mjs +0 -167
  474. package/src/signals/engine.mjs +0 -146
  475. package/src/signals/index.mjs +0 -1
  476. package/src/token-transfer-guard.mjs +0 -188
  477. package/src/tui/app.mjs +0 -438
  478. package/src/tui/backend.mjs +0 -145
  479. package/src/tui/format.mjs +0 -272
  480. package/src/tui/gateway-client.mjs +0 -177
  481. package/src/tui/input.mjs +0 -501
  482. package/src/tui/renderer.mjs +0 -443
  483. package/src/tui/standalone-client.mjs +0 -666
  484. package/src/tui/theme.mjs +0 -81
  485. package/src/vault-attestation.mjs +0 -146
  486. package/src/venues.mjs +0 -206
  487. package/src/watch-preferences.mjs +0 -85
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env node
2
- // Pre-publication secret scan. Fails CLOSED: any hit is an error.
3
- //
4
- // Checks the working tree AND every blob in git history, because a secret
5
- // removed in a later commit is still public the moment the repo is.
6
-
7
- import { execFileSync } from "node:child_process";
8
-
9
- const ROOT = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd: process.cwd(), encoding: "utf8" }).trim();
10
-
11
- // Live values that must never appear. Sourced from the environment at scan
12
- // time so the scanner itself contains no secrets.
13
- function liveSecrets() {
14
- const out = [];
15
- const push = (label, value) => {
16
- const v = String(value || "").trim();
17
- if (v.length >= 8) out.push({ label, value: v });
18
- };
19
- for (const k of Object.keys(process.env)) {
20
- if (/(_KEY|_SECRET|_TOKEN|_PASSPHRASE|_WIF|PRIVATE_KEY)$/i.test(k)) {
21
- push(`env:${k}`, process.env[k]);
22
- }
23
- }
24
- return out;
25
- }
26
-
27
- // A representative slice of the BIP39 English wordlist. Full coverage is not
28
- // required: a real mnemonic is 12 or 24 words drawn ENTIRELY from the list, so
29
- // any genuine phrase will hit these common entries, while English prose will
30
- // not have every one of its words in the list.
31
- const BIP39_SAMPLE = new Set(
32
- ("abandon ability able about above absent absorb abstract absurd abuse access accident account accuse achieve acid " +
33
- "across act action actor actress actual adapt add addict address adjust admit adult advance advice aerobic affair " +
34
- "afford afraid again age agent agree ahead aim air airport aisle alarm album alcohol alert alien all alley allow " +
35
- "almost alone alpha already also alter always amateur amazing among amount amused analyst anchor ancient anger " +
36
- "angle angry animal ankle announce annual another answer antenna antique anxiety any apart apology appear apple " +
37
- "approve april arch arctic area arena argue arm armed armor army around arrange arrest arrive arrow art artefact " +
38
- "artist artwork ask aspect assault asset assist assume asthma athlete atom attack attend attitude attract auction " +
39
- "audit august aunt author auto autumn average avocado avoid awake aware away awesome awful awkward axis baby " +
40
- "bachelor bacon badge bag balance balcony ball bamboo banana banner bar barely bargain barrel base basic basket " +
41
- "battle beach bean beauty because become beef before begin behave behind believe below belt bench benefit best " +
42
- "betray better between beyond bicycle bid bike bind biology bird birth bitter black blade blame blanket blast " +
43
- "bleak bless blind blood blossom blouse blue blur blush board boat body boil bomb bone bonus book boost border " +
44
- "boring borrow boss bottom bounce box boy bracket brain brand brass brave bread breeze brick bridge brief bright " +
45
- "bring brisk broccoli broken bronze broom brother brown brush bubble buddy budget buffalo build bulb bulk bullet " +
46
- "bundle bunker burden burger burst bus business busy butter buyer buzz cabbage cabin cable cactus cage cake call " +
47
- "calm camera camp can canal cancel candy cannon canoe canvas canyon capable capital captain car carbon card cargo " +
48
- "carpet carry cart case cash casino castle casual cat catalog catch category cattle caught cause caution cave " +
49
- "ceiling celery cement census century cereal certain chair chalk champion change chaos chapter charge chase chat " +
50
- "cheap check cheese chef cherry chest chicken chief child chimney choice choose chronic chuckle chunk churn cigar " +
51
- "cinnamon circle citizen city civil claim clap clarify claw clay clean clerk clever click client cliff climb " +
52
- "clinic clip clock clog close cloth cloud clown club clump cluster clutch coach coast coconut code coffee coil " +
53
- "coin collect color column combine come comfort comic common company concert conduct confirm congress connect " +
54
- "consider control convince cook cool copper copy coral core corn correct cost cotton couch country couple course " +
55
- "cousin cover coyote crack cradle craft cram crane crash crater crawl crazy cream credit creek crew cricket crime " +
56
- "crisp critic crop cross crouch crowd crucial cruel cruise crumble crunch crush cry crystal cube culture cup " +
57
- "cupboard curious current curtain curve cushion custom cute cycle zoo zone zero youth young you yellow year " +
58
- "wrong write wrist wrap worth world work word wood wonder woman wolf wire winter wing wine window wind wild wife " +
59
- "why whisper white where when wheat what wet west welcome weird weekend week wedding web wealth wear weapon " +
60
- "weasel wear wave water watch waste wash warrior warm want walnut wall walk wait wagon void voice vote volume " +
61
- "vocal vivid virus violin virtual vintage view video vicious vibrant vessel very verify version verb vendor " +
62
- "vehicle vegetable vault various vast vase vanish valve valley valid vacuum vacant").split(/\s+/)
63
- );
64
-
65
- const PATTERNS = [
66
- { name: "private key (hex 64)", re: /\b(?:0x)?[0-9a-fA-F]{64}\b/, refine: (m, line) =>
67
- /priv|secret|wif|seed|mnemonic|signer|wallet/i.test(line) && !/hash|digest|sha256|txid|commit|blob|sha1|0x0{40,}/i.test(line) },
68
- { name: "BTC WIF", re: /\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/ },
69
- { name: "BIP39 seed phrase", re: /\b(?:[a-z]{3,8} ){11,23}[a-z]{3,8}\b/, refine: (m) => {
70
- // Ordinary English prose trivially matches "12-24 short lowercase words".
71
- // A scanner that cries wolf on comments is a scanner people switch off,
72
- // so require the words to actually be in the BIP39 wordlist.
73
- const words = m[0].trim().split(/\s+/);
74
- if (words.length !== 12 && words.length !== 24) return false;
75
- return words.every((w) => BIP39_SAMPLE.has(w));
76
- } },
77
- { name: "AWS access key", re: /\bAKIA[0-9A-Z]{16}\b/ },
78
- { name: "OpenAI key", re: /\bsk-[A-Za-z0-9_-]{20,}\b/ },
79
- { name: "Anthropic key", re: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/ },
80
- { name: "GitHub token", re: /\bgh[pousr]_[A-Za-z0-9]{36,}\b/ },
81
- { name: "Slack token", re: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/ },
82
- { name: "Telegram bot token", re: /\b\d{8,10}:[A-Za-z0-9_-]{35}\b/ },
83
- { name: "PEM private key", re: /-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/ },
84
- { name: "Solana keypair array", re: /\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/ },
85
- ];
86
-
87
- // Paths whose matches are known-safe test fixtures.
88
- const ALLOWED_PATHS = [
89
- /^scripts\/secret-scan\.mjs$/,
90
- /^package-lock\.json$/,
91
- ];
92
-
93
- // Literal strings that are documented, synthetic, or public by nature.
94
- const ALLOWED_VALUES = [
95
- "0x0123456789012345678901234567890123456789012345678901234567890123", // HL SDK public test vector
96
- "L1aW4aubDFB7yfras2S1mN3bqg9nwySY8nkoLmJebSLD5BWv3ENZ",
97
- "/-----BEGIN[A-Z ]*PRIVATE KEY-----/",
98
- '{ value: "-----BEGIN EC PRIVATE KEY-----" }',
99
- "0x0000000000000000000000000000000000000000",
100
- ];
101
-
102
- function sh(cmd, args) {
103
- return execFileSync(cmd, args, { cwd: ROOT, encoding: "utf8", maxBuffer: 256 * 1024 * 1024 });
104
- }
105
-
106
- function scanText(text, origin, findings) {
107
- const lines = text.split("\n");
108
- for (let i = 0; i < lines.length; i++) {
109
- const line = lines[i];
110
- if (line.length > 4000) continue;
111
- for (const p of PATTERNS) {
112
- const m = p.re.exec(line);
113
- if (!m) continue;
114
- if (ALLOWED_VALUES.some((v) => line.includes(v))) continue;
115
- if (p.refine && !p.refine(m, line)) continue;
116
- findings.push({ origin, line: i + 1, kind: p.name, sample: line.trim().slice(0, 100) });
117
- }
118
- for (const s of LIVE) {
119
- if (line.includes(s.value)) {
120
- findings.push({ origin, line: i + 1, kind: `LIVE SECRET ${s.label}`, sample: "[REDACTED — real credential]" });
121
- }
122
- }
123
- }
124
- }
125
-
126
- const LIVE = liveSecrets();
127
- const findings = [];
128
-
129
- // --- 1. working tree (tracked files only) ---
130
- const tracked = sh("git", ["ls-files"]).split("\n").filter(Boolean);
131
- for (const rel of tracked) {
132
- if (ALLOWED_PATHS.some((r) => r.test(rel))) continue;
133
- let content;
134
- try {
135
- content = sh("git", ["show", `:${rel}`]);
136
- } catch {
137
- continue; // binary or unreadable
138
- }
139
- if (content.includes("\u0000")) continue;
140
- scanText(content, rel, findings);
141
- }
142
-
143
- // --- 2. every blob in history ---
144
- const revs = sh("git", ["rev-list", "--all"]).split("\n").filter(Boolean);
145
- const seen = new Set();
146
- let historyBlobs = 0;
147
- for (const rev of revs) {
148
- const entries = sh("git", ["ls-tree", "-r", rev]).split("\n").filter(Boolean);
149
- for (const entry of entries) {
150
- const [meta, path] = entry.split("\t");
151
- const sha = meta.split(/\s+/)[2];
152
- if (!sha || seen.has(sha)) continue;
153
- seen.add(sha);
154
- if (ALLOWED_PATHS.some((r) => r.test(path))) continue;
155
- let content;
156
- try {
157
- content = sh("git", ["cat-file", "-p", sha]);
158
- } catch {
159
- continue;
160
- }
161
- if (content.includes("\u0000")) continue;
162
- historyBlobs++;
163
- scanText(content, `history:${rev.slice(0, 8)}:${path}`, findings);
164
- }
165
- }
166
-
167
- // --- 3. author identity leakage ---
168
- const authors = new Set(sh("git", ["log", "--all", "--format=%an <%ae>|%cn <%ce>"]).split(/[\n|]/).filter(Boolean));
169
-
170
- console.log(`scanned ${tracked.length} tracked files, ${historyBlobs} historical blobs, ${revs.length} commits`);
171
- console.log(`live env secrets checked: ${LIVE.length}`);
172
- console.log(`git identities: ${[...authors].join(", ") || "(none)"}`);
173
-
174
- if (findings.length) {
175
- console.error(`\nFAIL — ${findings.length} finding(s):`);
176
- for (const f of findings.slice(0, 40)) {
177
- console.error(` ${f.origin}:${f.line} [${f.kind}] ${f.sample}`);
178
- }
179
- process.exit(1);
180
- }
181
- console.log("\nPASS — no secrets found in tree or history");
@@ -1,192 +0,0 @@
1
- #!/usr/bin/env node
2
- // Functionally verify Uniswap V3 venue addresses on every chain.
3
- //
4
- // Codesize alone is NOT verification -- an unrelated contract also has bytecode, and
5
- // on Base the canonical mainnet addresses returned 2109 bytes for two different
6
- // contracts, which is exactly the kind of false positive a size check waves through.
7
- //
8
- // The real test is behavioural: ask the candidate quoter to price a pair we already
9
- // know the answer to. A contract that returns a sane WETH->USDC quote at a standard
10
- // fee tier IS a working V3 quoter, regardless of what any doc claims.
11
- //
12
- // Output is a provenance record per chain, ready to paste into chains.config.mjs.
13
-
14
- import { rpcCall } from "../src/data/providers/evm-rpc.mjs";
15
-
16
- // Candidates. Most chains share the canonical deployment; Base, BSC and Avalanche
17
- // have their own. All of these are CANDIDATES until the probe passes.
18
- const CANONICAL_QUOTER = "0x61fFE014bA17989E743c5F6cB21bF9697530B21e";
19
- const CANONICAL_ROUTER = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45";
20
-
21
- const CANDIDATES = {
22
- 1: {
23
- name: "ethereum",
24
- quoter: CANONICAL_QUOTER,
25
- router: CANONICAL_ROUTER,
26
- tokenIn: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // WETH
27
- tokenOut: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
28
- decIn: 18,
29
- decOut: 6,
30
- },
31
- 10: {
32
- name: "optimism",
33
- quoter: CANONICAL_QUOTER,
34
- router: CANONICAL_ROUTER,
35
- tokenIn: "0x4200000000000000000000000000000000000006",
36
- tokenOut: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
37
- decIn: 18,
38
- decOut: 6,
39
- },
40
- 56: {
41
- name: "bsc",
42
- quoter: "0x78D78E420Da98ad378D7799bE8f4AF69033EB077",
43
- router: "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",
44
- tokenIn: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", // WBNB
45
- tokenOut: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", // USDC (18dp on BSC)
46
- decIn: 18,
47
- decOut: 18,
48
- },
49
- 137: {
50
- name: "polygon",
51
- quoter: CANONICAL_QUOTER,
52
- router: CANONICAL_ROUTER,
53
- tokenIn: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // WMATIC
54
- tokenOut: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", // USDC native
55
- decIn: 18,
56
- decOut: 6,
57
- },
58
- 8453: {
59
- name: "base",
60
- quoter: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
61
- router: "0x2626664c2603336E57B271c5C0b26F421741e481",
62
- tokenIn: "0x4200000000000000000000000000000000000006",
63
- tokenOut: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
64
- decIn: 18,
65
- decOut: 6,
66
- },
67
- 42161: {
68
- name: "arbitrum",
69
- quoter: CANONICAL_QUOTER,
70
- router: CANONICAL_ROUTER,
71
- tokenIn: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
72
- tokenOut: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
73
- decIn: 18,
74
- decOut: 6,
75
- },
76
- 43114: {
77
- name: "avalanche",
78
- quoter: "0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",
79
- router: "0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",
80
- tokenIn: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", // WAVAX
81
- tokenOut: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", // USDC
82
- decIn: 18,
83
- decOut: 6,
84
- },
85
- };
86
-
87
- const FEE_TIERS = [500, 3000, 10000];
88
-
89
- const word = (v) => BigInt(v).toString(16).padStart(64, "0");
90
- const addrWord = (a) => a.slice(2).toLowerCase().padStart(64, "0");
91
-
92
- // QuoterV2.quoteExactInputSingle((address,address,uint256,uint24,uint160))
93
- // selector 0xc6a5026a -- struct is encoded inline as 5 words.
94
- function encodeQuote({ tokenIn, tokenOut, amountIn, fee }) {
95
- return (
96
- "0xc6a5026a" +
97
- addrWord(tokenIn) +
98
- addrWord(tokenOut) +
99
- word(amountIn) +
100
- word(fee) +
101
- word(0) // sqrtPriceLimitX96 = 0 (no limit)
102
- );
103
- }
104
-
105
- async function codesize(chainId, address) {
106
- const r = await rpcCall(chainId, "eth_getCode", [address, "latest"]).catch(() => null);
107
- const raw = r?.result ?? r;
108
- return raw && raw !== "0x" ? (raw.length - 2) / 2 : 0;
109
- }
110
-
111
- async function probe(chainId, cfg) {
112
- const result = {
113
- chainId: Number(chainId),
114
- name: cfg.name,
115
- quoter: cfg.quoter,
116
- router: cfg.router,
117
- quoterCodesize: 0,
118
- routerCodesize: 0,
119
- workingFeeTier: null,
120
- quotedOut: null,
121
- humanPrice: null,
122
- verdict: "FAIL",
123
- reason: "",
124
- };
125
-
126
- result.quoterCodesize = await codesize(chainId, cfg.quoter);
127
- result.routerCodesize = await codesize(chainId, cfg.router);
128
-
129
- if (!result.quoterCodesize || !result.routerCodesize) {
130
- result.reason = "no bytecode at candidate address on this chain";
131
- return result;
132
- }
133
-
134
- // Behavioural probe: does it actually price a pair we can sanity-check?
135
- const amountIn = 10n ** BigInt(cfg.decIn);
136
- for (const fee of FEE_TIERS) {
137
- const data = encodeQuote({
138
- tokenIn: cfg.tokenIn,
139
- tokenOut: cfg.tokenOut,
140
- amountIn,
141
- fee,
142
- });
143
- const r = await rpcCall(chainId, "eth_call", [{ to: cfg.quoter, data }, "latest"]).catch(
144
- () => null,
145
- );
146
- const raw = r?.result ?? r;
147
- if (!raw || raw === "0x" || raw.length < 66) continue;
148
-
149
- const out = BigInt(`0x${raw.slice(2, 66)}`);
150
- if (out === 0n) continue;
151
-
152
- result.workingFeeTier = fee;
153
- result.quotedOut = out.toString();
154
- result.humanPrice = Number(out) / 10 ** cfg.decOut;
155
- break;
156
- }
157
-
158
- if (result.workingFeeTier == null) {
159
- result.reason = "bytecode present but no fee tier returned a quote -- not a working V3 quoter";
160
- return result;
161
- }
162
-
163
- // Sanity band. A working quoter on a major pair should land in a plausible range;
164
- // a wildly wrong number means we are talking to the wrong contract or decoding it
165
- // wrong, and either way it must not be allowlisted.
166
- if (result.humanPrice <= 0 || !Number.isFinite(result.humanPrice)) {
167
- result.reason = `implausible quote ${result.humanPrice}`;
168
- return result;
169
- }
170
-
171
- result.verdict = "PASS";
172
- result.reason =
173
- `quoteExactInputSingle at fee ${result.workingFeeTier} returned ` +
174
- `${result.humanPrice} for 1 unit in -- a live, working V3 quote`;
175
- return result;
176
- }
177
-
178
- const out = [];
179
- for (const [chainId, cfg] of Object.entries(CANDIDATES)) {
180
- const r = await probe(chainId, cfg);
181
- out.push(r);
182
- const line =
183
- `${r.name.padEnd(10)} ${r.verdict.padEnd(5)} ` +
184
- `quoter=${String(r.quoterCodesize).padStart(6)} router=${String(r.routerCodesize).padStart(6)} ` +
185
- (r.workingFeeTier ? `fee=${String(r.workingFeeTier).padStart(5)} price=${r.humanPrice}` : r.reason);
186
- console.log(line);
187
- }
188
-
189
- console.log(`\n${out.filter((r) => r.verdict === "PASS").length}/${out.length} chains verified`);
190
- if (process.argv.includes("--json")) {
191
- console.log(JSON.stringify(out, null, 2));
192
- }
@@ -1,176 +0,0 @@
1
- ---
2
- name: balance
3
- description: Use when the user says balance, holdings, portfolio, wallet balance, or invokes /balance. Call the deterministic read-only multichain portfolio tool and report coverage honestly.
4
- ---
5
-
6
- # Balance
7
-
8
- Use `portfolio_snapshot` for every fresh balance request. It runs the deterministic
9
- multichain balance and NFT inventory reads once, then records one compact local
10
- observation so the user can build history without a separate tracker.
11
-
12
- Use `portfolio_history` for balance-history requests and `portfolio_value_graph`
13
- for charts. Use `portfolio_balance` only when the user explicitly asks for a
14
- non-recorded read or when local history storage is unavailable.
15
-
16
- This skill is read-only. Public addresses are identifiers, not signing rights.
17
- Never request a private key, seed phrase, wallet export, session key, or signature.
18
-
19
- ## Trigger
20
-
21
- Run this workflow when the user:
22
-
23
- - invokes `/balance`;
24
- - says `balance` by itself;
25
- - asks for holdings, wallet balance, portfolio, net assets, or assets across chains;
26
- - supplies one or more public wallet addresses and asks what they hold.
27
-
28
- ## Address routing
29
-
30
- Parse only public addresses supplied with the request:
31
-
32
- - `0x...` maps to `addresses.evm` and `addresses.hyperliquid` unless the user
33
- explicitly assigns different addresses;
34
- - a Solana base58 public key maps to `addresses.solana`;
35
- - a Bitcoin `bc1`, `1`, or `3` address maps to `addresses.bitcoin`;
36
- - explicit labels such as `evm:`, `solana:`, `bitcoin:`, and `hyperliquid:` win.
37
-
38
- If no addresses are in the request, call `portfolio_snapshot` with an empty object.
39
- The tool uses configured public-address defaults:
40
-
41
- - `ORACLE_EVM_ADDRESS`, with legacy fallback `ORACLE_DEFAULT_ADDRESS`;
42
- - `ORACLE_SOLANA_ADDRESS`;
43
- - `ORACLE_BITCOIN_ADDRESS`;
44
- - `ORACLE_HYPERLIQUID_ADDRESS`, with EVM fallback.
45
-
46
- If every family returns `not-configured`, ask only for the missing public addresses.
47
- Do not call a zero address a user wallet and do not report missing families as zero.
48
-
49
- ## Mandatory call
50
-
51
- Call `portfolio_snapshot`:
52
-
53
- ```json
54
- {
55
- "addresses": {
56
- "evm": "optional public address",
57
- "solana": "optional public key",
58
- "bitcoin": "optional public address",
59
- "hyperliquid": "optional public address"
60
- },
61
- "includeTokens": true,
62
- "includeCollectibles": true,
63
- "includePrices": true,
64
- "includeNfts": true
65
- }
66
- ```
67
-
68
- Omit address fields the user did not supply. Omit `evmChainIds` unless the user
69
- asks for a subset. The default queries every configured EVM chain. Read fungible
70
- and chain details from `result.balance`, NFT holdings from `result.nfts`, and the
71
- combined historical observation from `result.snapshot`.
72
-
73
- Never call a chain write, prepare, sign, send, submit, execute, or broadcast tool
74
- while answering a balance request. The compact profile-local history append made
75
- by `portfolio_snapshot` is allowed and contains no keys or executable payloads.
76
-
77
- ## Coverage contract
78
-
79
- The current aggregator covers:
80
-
81
- - native balances on every configured EVM chain;
82
- - Solana SOL plus SPL Token and Token-2022 accounts;
83
- - Bitcoin BTC plus Runes and inscriptions when an address indexer is configured;
84
- - Hyperliquid HyperCore spot balances and perp account state;
85
- - OpenSea-supported EVM/Solana NFT inventory and Bitcoin inscriptions where the
86
- configured providers expose owner data;
87
- - profile-local snapshots and an SVG known-value history graph.
88
-
89
- It must explicitly report unsupported or unavailable surfaces:
90
-
91
- - EVM token and NFT enumeration is unavailable without an address indexer;
92
- - Solana token accounts are unverified until metadata confirms symbol and spam
93
- status;
94
- - a Solana amount of one with zero decimals is only a collectible candidate;
95
- - Bitcoin Runes and inscriptions require an address-indexed provider;
96
- - Cosmos requires a chain-specific bech32 address and LCD/RPC adapter;
97
- - Sui and Aptos remain unsupported until their balance adapters are installed;
98
- - any provider failure is `unavailable`, never a zero balance;
99
- - NFT prices are provider estimates, not executable bids.
100
-
101
- ## History and graph
102
-
103
- For “balance history”, “portfolio history”, or a date range, call
104
- `portfolio_history` with the same public addresses and the requested `since`,
105
- `until`, and `limit`. Keep `null` values unavailable. Do not interpolate them.
106
-
107
- For “graph”, “chart”, or “show me performance”, call `portfolio_value_graph`.
108
- State the returned `summary.changeUsd`, `summary.changePct`, point count, and
109
- whether any plotted snapshots were incomplete. The image plots known priced
110
- value, not guaranteed liquidation value or net worth.
111
-
112
- ## Response format
113
-
114
- Start with:
115
-
116
- ```text
117
- Balance, <queriedAt>
118
- Known priced value: $<knownUsd> (not a complete total)
119
- Coverage: <ok>/<requestedSurfaces> surfaces live
120
- ```
121
-
122
- If `valuation.complete` is true, you may remove the parenthetical. Do not rename
123
- `knownUsd` to `total`, `net worth`, or `portfolio value` when coverage is partial.
124
-
125
- Then show nonzero assets first, grouped by family:
126
-
127
- ```text
128
- EVM
129
- Ethereum: 0.42 ETH $...
130
- Base: 18.1 ETH $...
131
-
132
- Solana
133
- SOL: ...
134
- SPL: <mint> <amount> unverified
135
-
136
- Bitcoin
137
- BTC: ...
138
- Runes: ...
139
- Inscriptions: ...
140
-
141
- Hyperliquid
142
- Spot: ...
143
- Perps account value: $...
144
- Positions: ...
145
- ```
146
-
147
- Collapse successful zero-native EVM chains into one line:
148
-
149
- ```text
150
- Zero native: Polygon, Optimism, Arbitrum
151
- ```
152
-
153
- End with concise exceptions:
154
-
155
- ```text
156
- Unavailable: <failed providers or unconfigured addresses>
157
- Unpriced: <nonzero assets without a price>
158
- Warnings: <spam, stale, unknown-not-empty, or incomplete discovery warnings>
159
- ```
160
-
161
- Do not dump raw RPC payloads unless the user asks. Keep exact public addresses in
162
- the response only when the user supplied multiple addresses and disambiguation is
163
- necessary.
164
-
165
- ## Truth rules
166
-
167
- - `0` means a provider successfully returned zero.
168
- - `unavailable` means the provider failed or the adapter is absent.
169
- - `not-configured` means the public address is missing.
170
- - `unknownNotEmpty` means the provider cannot tell whether assets exist. Never
171
- convert it to an empty portfolio.
172
- - Every USD figure must carry a price source and query timestamp in the tool
173
- result.
174
- - Do not sum Stable Mainnet native USDT0 with its mirrored ERC-20 representation.
175
- - Do not price unverified or spam tokens by symbol alone.
176
- - Do not hide failed chains to make the summary look complete.
@@ -1,40 +0,0 @@
1
- ---
2
- name: oracle-action-semantics
3
- description: Use for watch, ping, prepare, arm, sign, send, or execution-capability questions.
4
- ---
5
-
6
- # Oracle action semantics
7
-
8
- Keep these planes distinct:
9
-
10
- 1. **Public prepare plane**: reads, quotes, simulates, and prepares unsigned artifacts. It never signs or broadcasts.
11
- 2. **Generic Oracle signer**: the unattended daemon exposes six *bounded* surfaces — `hl`, `poly`, `evm-swap`, `evm-bridge`, `btc`, `sol`. Bounded is not generic chain authority: each surface decodes and validates its own envelope shape and refuses while its allowlists are empty. Enablement is never authority; every signature still needs one exact owner-confirmed grant.
12
- 3. **User-wallet EVM**: ordinary EVM preparations require the user's wallet signature.
13
- 4. **Optional bounded EVM execution**: a deployment may expose a separate same-host, owner-gated EVM executor such as MAD. Verify its status and policy before saying it is available. Never infer it from the public package or the generic signer.
14
-
15
- Do not turn a deployment fact into a universal claim. If no bounded EVM executor is installed or healthy, say the current deployment cannot execute EVM. Do not say Oracle can never execute EVM.
16
-
17
- ## Binding vocabulary
18
-
19
- - `watch`, `watch this`, `ping`, `ping me`, `alert`, and `notify` mean notification only.
20
- - Persist them as `active: true` and `actionMode: alert_only`.
21
- - `arm` means authorization intent for one exact bounded action.
22
- - Persist it as `active: true` and `actionMode: execute` only after the exact action and owner authorization are present.
23
- - Never convert `watch` into execution.
24
- - Never convert `arm` into a watch.
25
- - A status field such as `armed` is not action authority. Current records require explicit `active` and `actionMode` fields.
26
-
27
- Before accepting `arm`, require the exact chain, token pair, amount or fraction, trigger, recipient, router, deadline, slippage bound, and approval bound. Require the owner-gated executor to be healthy and disarmed until that exact action is authorized. Refuse global, implied, or reusable authorization.
28
-
29
- ## Execution states
30
-
31
- Report each state separately:
32
-
33
- - `executionReady`
34
- - `requiresUserSignature`
35
- - `signingReady`
36
- - `broadcastReady`
37
-
38
- A quote is not a preparation. A preparation is not a signature. A signature is not a broadcast. A broadcast is not mined execution. Claim success only after a transaction hash, successful receipt, and expected balance delta.
39
-
40
- ERC-20 approval is a separate transaction. Use an exact bounded amount unless the user explicitly authorizes another cap. Never silently create an unlimited approval.