@oracle-agent/oracle 0.14.1 → 0.16.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 (450) hide show
  1. package/README.md +2 -2
  2. package/SETUP.md +4 -4
  3. package/dist/action-receipts.mjs +1 -0
  4. package/dist/action-semantics.mjs +1 -0
  5. package/dist/address-book.mjs +2 -0
  6. package/dist/bin/desk-server.mjs +60 -0
  7. package/dist/bin/oracle-data-mcp.mjs +9 -0
  8. package/dist/bin/oracle-equities.mjs +20 -0
  9. package/dist/bin/oracle-init.mjs +24 -0
  10. package/dist/bin/oracle-public-server.mjs +5 -0
  11. package/dist/bin/oracle-route.mjs +22 -0
  12. package/dist/bin/oracle-scan.mjs +18 -0
  13. package/dist/bin/oracle-upgrade.mjs +21 -0
  14. package/dist/bin/oracle.mjs +63 -0
  15. package/dist/chains.mjs +1 -0
  16. package/dist/cli/commands/auth.mjs +16 -0
  17. package/dist/cli/commands/bootstrap.mjs +18 -0
  18. package/dist/cli/commands/chain.mjs +21 -0
  19. package/dist/cli/commands/chat.mjs +45 -0
  20. package/dist/cli/commands/credential.mjs +1 -0
  21. package/dist/cli/commands/data-mcp.mjs +2 -0
  22. package/dist/cli/commands/data.mjs +12 -0
  23. package/dist/cli/commands/doctor.mjs +5 -0
  24. package/dist/cli/commands/equities.mjs +15 -0
  25. package/dist/cli/commands/farm.mjs +59 -0
  26. package/dist/cli/commands/fees.mjs +10 -0
  27. package/dist/cli/commands/follow.mjs +28 -0
  28. package/dist/cli/commands/harness.mjs +15 -0
  29. package/dist/cli/commands/help.mjs +1 -0
  30. package/dist/cli/commands/init.mjs +3 -0
  31. package/dist/cli/commands/mcp.mjs +36 -0
  32. package/dist/cli/commands/model.mjs +54 -0
  33. package/dist/cli/commands/plugins.mjs +43 -0
  34. package/dist/cli/commands/prepare.mjs +2 -0
  35. package/dist/cli/commands/public.mjs +3 -0
  36. package/dist/cli/commands/resolve.mjs +23 -0
  37. package/dist/cli/commands/route.mjs +2 -0
  38. package/dist/cli/commands/runner.mjs +1 -0
  39. package/dist/cli/commands/scan.mjs +2 -0
  40. package/dist/cli/commands/setup.mjs +34 -0
  41. package/dist/cli/commands/sign.mjs +4 -0
  42. package/dist/cli/commands/signer.mjs +1 -0
  43. package/dist/cli/commands/strategy.mjs +18 -0
  44. package/dist/cli/commands/swap.mjs +36 -0
  45. package/dist/cli/commands/upgrade.mjs +2 -0
  46. package/dist/cli/commands/vault.mjs +1 -0
  47. package/dist/cli/commands/version.mjs +2 -0
  48. package/dist/data/desk-data.mjs +55 -0
  49. package/dist/data/names.mjs +2 -0
  50. package/dist/data/providers/farming.mjs +2 -0
  51. package/dist/equities/index.mjs +1 -0
  52. package/dist/index.mjs +60 -0
  53. package/dist/nft-gas-war-guard.mjs +1 -0
  54. package/dist/onboarding/harness-configs.mjs +4 -0
  55. package/dist/portfolio-risk.mjs +1 -0
  56. package/dist/prepare-envelope.mjs +1 -0
  57. package/dist/public-api/agent-grants.mjs +3 -0
  58. package/dist/public-control/policy-schema.mjs +1 -0
  59. package/dist/router/index.mjs +2 -0
  60. package/dist/scanner/index.mjs +4 -0
  61. package/dist/signals/index.mjs +1 -0
  62. package/dist/strategy/index.mjs +3 -0
  63. package/dist/watch-preferences.mjs +1 -0
  64. package/package.json +33 -78
  65. package/public/oracle-splash/_variants/ice.html +5 -18
  66. package/public/oracle-splash/_variants/ivory.html +5 -18
  67. package/public/oracle-splash/downloads/index.html +4 -4
  68. package/public/oracle-splash/index.html +113 -34
  69. package/CONTRIBUTING.md +0 -99
  70. package/bin/desk-server.mjs +0 -473
  71. package/bin/oracle-data-mcp.mjs +0 -1252
  72. package/bin/oracle-equities.mjs +0 -168
  73. package/bin/oracle-init.mjs +0 -525
  74. package/bin/oracle-public-server.mjs +0 -36
  75. package/bin/oracle-route.mjs +0 -254
  76. package/bin/oracle-scan.mjs +0 -192
  77. package/bin/oracle-upgrade.mjs +0 -42
  78. package/bin/oracle.mjs +0 -34
  79. package/docs/adding-a-chain.md +0 -229
  80. package/docs/architecture.md +0 -139
  81. package/docs/buzz-integration.md +0 -115
  82. package/docs/cli.md +0 -143
  83. package/docs/connectors.md +0 -13
  84. package/docs/hyperliquid-builder-code.md +0 -50
  85. package/docs/locals-only-fee-waiver.md +0 -34
  86. package/docs/oracle-pack-standard.md +0 -29
  87. package/docs/profiles.md +0 -151
  88. package/docs/public-surface.md +0 -206
  89. package/examples/add-a-chain.mjs +0 -65
  90. package/examples/oracle-pack-template.mjs +0 -38
  91. package/examples/research-a-token.mjs +0 -70
  92. package/plugins/oracle-owner-gate/__init__.py +0 -288
  93. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  94. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  95. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  96. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  97. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  98. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  99. package/scripts/adversarial-bench.mjs +0 -114
  100. package/scripts/build-dist.mjs +0 -119
  101. package/scripts/build-inscription.py +0 -230
  102. package/scripts/check-doc-drift.mjs +0 -123
  103. package/scripts/check-test-count.mjs +0 -105
  104. package/scripts/e2e-hl-markets.mjs +0 -21
  105. package/scripts/e2e-hl-perps.mjs +0 -48
  106. package/scripts/e2e-hypercore-staking.mjs +0 -128
  107. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  108. package/scripts/guard-publish.mjs +0 -22
  109. package/scripts/protocol-template-gate.mjs +0 -15
  110. package/scripts/public-api-scan.mjs +0 -23
  111. package/scripts/publish-dist.mjs +0 -67
  112. package/scripts/record-hero-cli.sh +0 -80
  113. package/scripts/secret-scan.mjs +0 -169
  114. package/scripts/smoke-dist-bins.mjs +0 -89
  115. package/scripts/verify-dist.mjs +0 -29
  116. package/scripts/verify-v3-venues.mjs +0 -233
  117. package/skins/oracle.yaml +0 -56
  118. package/src/action-receipts.mjs +0 -265
  119. package/src/action-semantics.mjs +0 -62
  120. package/src/address-book.mjs +0 -208
  121. package/src/agent-auth.mjs +0 -206
  122. package/src/approval-guard.mjs +0 -282
  123. package/src/attestation-secret.mjs +0 -94
  124. package/src/audit-log.mjs +0 -196
  125. package/src/auth/oauth.mjs +0 -672
  126. package/src/auto-slippage.mjs +0 -378
  127. package/src/capability-posture.mjs +0 -125
  128. package/src/cards.mjs +0 -422
  129. package/src/chains.mjs +0 -62
  130. package/src/cli/chain-catalog.mjs +0 -215
  131. package/src/cli/chain-state.mjs +0 -74
  132. package/src/cli/commands/auth.mjs +0 -193
  133. package/src/cli/commands/bootstrap.mjs +0 -87
  134. package/src/cli/commands/chain.mjs +0 -143
  135. package/src/cli/commands/chat.mjs +0 -465
  136. package/src/cli/commands/credential.mjs +0 -9
  137. package/src/cli/commands/data-mcp.mjs +0 -18
  138. package/src/cli/commands/data.mjs +0 -75
  139. package/src/cli/commands/doctor.mjs +0 -136
  140. package/src/cli/commands/equities.mjs +0 -41
  141. package/src/cli/commands/farm.mjs +0 -129
  142. package/src/cli/commands/fees.mjs +0 -109
  143. package/src/cli/commands/follow.mjs +0 -130
  144. package/src/cli/commands/harness.mjs +0 -63
  145. package/src/cli/commands/help.mjs +0 -7
  146. package/src/cli/commands/init.mjs +0 -27
  147. package/src/cli/commands/mcp.mjs +0 -154
  148. package/src/cli/commands/model.mjs +0 -106
  149. package/src/cli/commands/plugins.mjs +0 -275
  150. package/src/cli/commands/prepare.mjs +0 -12
  151. package/src/cli/commands/public.mjs +0 -20
  152. package/src/cli/commands/resolve.mjs +0 -64
  153. package/src/cli/commands/route.mjs +0 -12
  154. package/src/cli/commands/runner.mjs +0 -9
  155. package/src/cli/commands/scan.mjs +0 -12
  156. package/src/cli/commands/setup.mjs +0 -294
  157. package/src/cli/commands/sign.mjs +0 -21
  158. package/src/cli/commands/signer.mjs +0 -9
  159. package/src/cli/commands/swap.mjs +0 -102
  160. package/src/cli/commands/upgrade.mjs +0 -12
  161. package/src/cli/commands/vault.mjs +0 -9
  162. package/src/cli/commands/version.mjs +0 -22
  163. package/src/cli/first-run.mjs +0 -23
  164. package/src/cli/kernel.mjs +0 -262
  165. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  166. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  167. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  168. package/src/cli/mcp-targets/codex.mjs +0 -41
  169. package/src/cli/mcp-targets/cursor.mjs +0 -32
  170. package/src/cli/mcp-targets/shared.mjs +0 -71
  171. package/src/cli/mcp-targets/vscode.mjs +0 -39
  172. package/src/cli/messaging-platforms.mjs +0 -217
  173. package/src/cli/model-config.mjs +0 -78
  174. package/src/cli/operator-dispatch.mjs +0 -194
  175. package/src/cli/oracle-harness.py +0 -415
  176. package/src/cli/paths.mjs +0 -107
  177. package/src/cli/runtime.mjs +0 -351
  178. package/src/cli/setup-state.mjs +0 -168
  179. package/src/cli/spawn-child.mjs +0 -43
  180. package/src/data/catalog.mjs +0 -858
  181. package/src/data/desk-data.mjs +0 -877
  182. package/src/data/http.mjs +0 -253
  183. package/src/data/names.mjs +0 -188
  184. package/src/data/provider-endpoint.mjs +0 -94
  185. package/src/data/providers/aave-v3.mjs +0 -139
  186. package/src/data/providers/across-bridge.mjs +0 -41
  187. package/src/data/providers/aerodrome.mjs +0 -245
  188. package/src/data/providers/aevo.mjs +0 -33
  189. package/src/data/providers/approval-indexer.mjs +0 -133
  190. package/src/data/providers/approvals.mjs +0 -594
  191. package/src/data/providers/babylon-staking.mjs +0 -149
  192. package/src/data/providers/balancer.mjs +0 -209
  193. package/src/data/providers/beefy-yields.mjs +0 -45
  194. package/src/data/providers/birdeye-tokens.mjs +0 -33
  195. package/src/data/providers/bisq-markets.mjs +0 -145
  196. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  197. package/src/data/providers/bitcoin-meta.mjs +0 -378
  198. package/src/data/providers/blockscout.mjs +0 -14
  199. package/src/data/providers/bob-rootstock.mjs +0 -198
  200. package/src/data/providers/braiins-insights.mjs +0 -103
  201. package/src/data/providers/bridge-aggregator.mjs +0 -259
  202. package/src/data/providers/bridges.mjs +0 -242
  203. package/src/data/providers/bungee.mjs +0 -29
  204. package/src/data/providers/celestia-da.mjs +0 -38
  205. package/src/data/providers/changenow.mjs +0 -135
  206. package/src/data/providers/compound.mjs +0 -32
  207. package/src/data/providers/connext.mjs +0 -28
  208. package/src/data/providers/convex.mjs +0 -30
  209. package/src/data/providers/cow-protocol.mjs +0 -110
  210. package/src/data/providers/cowswap.mjs +0 -415
  211. package/src/data/providers/curve.mjs +0 -201
  212. package/src/data/providers/das-assets.mjs +0 -59
  213. package/src/data/providers/debridge.mjs +0 -109
  214. package/src/data/providers/defillama.mjs +0 -88
  215. package/src/data/providers/dexscreener.mjs +0 -43
  216. package/src/data/providers/drift.mjs +0 -32
  217. package/src/data/providers/dydx.mjs +0 -41
  218. package/src/data/providers/evm-rpc.mjs +0 -225
  219. package/src/data/providers/farming.mjs +0 -291
  220. package/src/data/providers/geckoterminal.mjs +0 -34
  221. package/src/data/providers/gmx.mjs +0 -496
  222. package/src/data/providers/hiro-stacks.mjs +0 -150
  223. package/src/data/providers/hl-assets.mjs +0 -165
  224. package/src/data/providers/hl-info.mjs +0 -108
  225. package/src/data/providers/hl-markets.mjs +0 -210
  226. package/src/data/providers/hl-outcome.mjs +0 -61
  227. package/src/data/providers/hl-perps.mjs +0 -419
  228. package/src/data/providers/hl-staking.mjs +0 -353
  229. package/src/data/providers/hl-ws.mjs +0 -119
  230. package/src/data/providers/hyperevm-dex.mjs +0 -49
  231. package/src/data/providers/jito-mev.mjs +0 -117
  232. package/src/data/providers/jupiter-venues.mjs +0 -119
  233. package/src/data/providers/jupiter.mjs +0 -315
  234. package/src/data/providers/kamino-strategies.mjs +0 -143
  235. package/src/data/providers/l2beat-tvl.mjs +0 -42
  236. package/src/data/providers/lifi.mjs +0 -166
  237. package/src/data/providers/liquid-esplora.mjs +0 -152
  238. package/src/data/providers/magiceden-ordinals.mjs +0 -141
  239. package/src/data/providers/magiceden-sol.mjs +0 -406
  240. package/src/data/providers/mempool-lightning.mjs +0 -144
  241. package/src/data/providers/mempool-mining.mjs +0 -142
  242. package/src/data/providers/meteora-dlmm.mjs +0 -168
  243. package/src/data/providers/morpho.mjs +0 -177
  244. package/src/data/providers/nft-gallery.mjs +0 -163
  245. package/src/data/providers/nft-portfolio.mjs +0 -494
  246. package/src/data/providers/odos.mjs +0 -156
  247. package/src/data/providers/ondo.mjs +0 -31
  248. package/src/data/providers/oneinch.mjs +0 -174
  249. package/src/data/providers/opensea-multichain.mjs +0 -136
  250. package/src/data/providers/opensea-nft.mjs +0 -371
  251. package/src/data/providers/orca.mjs +0 -29
  252. package/src/data/providers/ordinals-runes.mjs +0 -180
  253. package/src/data/providers/pancakeswap.mjs +0 -28
  254. package/src/data/providers/paraswap.mjs +0 -125
  255. package/src/data/providers/pendle.mjs +0 -188
  256. package/src/data/providers/poly-clob.mjs +0 -283
  257. package/src/data/providers/poly-public.mjs +0 -96
  258. package/src/data/providers/poly-ws.mjs +0 -103
  259. package/src/data/providers/polygon-staking.mjs +0 -227
  260. package/src/data/providers/portfolio-history.mjs +0 -394
  261. package/src/data/providers/portfolio.mjs +0 -600
  262. package/src/data/providers/pyth-price-feeds.mjs +0 -172
  263. package/src/data/providers/raydium.mjs +0 -35
  264. package/src/data/providers/relayscan-mev.mjs +0 -72
  265. package/src/data/providers/rfq.mjs +0 -15
  266. package/src/data/providers/rh-agent.mjs +0 -59
  267. package/src/data/providers/sanctum-lst.mjs +0 -180
  268. package/src/data/providers/satflow.mjs +0 -341
  269. package/src/data/providers/signed-material-guard.mjs +0 -108
  270. package/src/data/providers/solana-rpc.mjs +0 -197
  271. package/src/data/providers/solend-lending.mjs +0 -166
  272. package/src/data/providers/spark-lend.mjs +0 -42
  273. package/src/data/providers/squid-router.mjs +0 -29
  274. package/src/data/providers/stargate.mjs +0 -29
  275. package/src/data/providers/sushiswap.mjs +0 -30
  276. package/src/data/providers/symbiotic-restaking.mjs +0 -41
  277. package/src/data/providers/thorchain.mjs +0 -36
  278. package/src/data/providers/traderjoe.mjs +0 -28
  279. package/src/data/providers/twap.mjs +0 -152
  280. package/src/data/providers/uniswap-v3.mjs +0 -457
  281. package/src/data/providers/uniswap-v4.mjs +0 -414
  282. package/src/data/providers/vertex.mjs +0 -41
  283. package/src/data/providers/wallet-watch.mjs +0 -264
  284. package/src/data/providers/wormhole.mjs +0 -28
  285. package/src/data/providers/yearn.mjs +0 -31
  286. package/src/data/providers/zerox.mjs +0 -167
  287. package/src/data/public-api-scan.mjs +0 -61
  288. package/src/data/quote-placeholder.mjs +0 -31
  289. package/src/desk/swap-prepare.mjs +0 -194
  290. package/src/equities/bridge.mjs +0 -388
  291. package/src/equities/fixtures/bridge_routes.json +0 -159
  292. package/src/equities/fixtures/dst_transitions.json +0 -29
  293. package/src/equities/fixtures/equity_dex_pools.json +0 -154
  294. package/src/equities/fixtures/hip3_l2books.json +0 -2711
  295. package/src/equities/fixtures/nyse_holidays.json +0 -1
  296. package/src/equities/fixtures/oracles.json +0 -100
  297. package/src/equities/fixtures/rh_pool_state.json +0 -244
  298. package/src/equities/fixtures/solana_xstocks.json +0 -704
  299. package/src/equities/fixtures/ton_xstocks.json +0 -35
  300. package/src/equities/fixtures/universe.json +0 -411
  301. package/src/equities/fixtures/venues.json +0 -3542
  302. package/src/equities/fixtures.mjs +0 -405
  303. package/src/equities/funding.mjs +0 -142
  304. package/src/equities/index.mjs +0 -166
  305. package/src/equities/liveness.mjs +0 -148
  306. package/src/equities/marketHours.mjs +0 -249
  307. package/src/equities/normalize.mjs +0 -295
  308. package/src/equities/num.mjs +0 -146
  309. package/src/equities/prepare.mjs +0 -95
  310. package/src/equities/rank.mjs +0 -260
  311. package/src/equities/sourceNum.mjs +0 -69
  312. package/src/equities/types.mjs +0 -220
  313. package/src/equities/venues/arcus-perp.mjs +0 -84
  314. package/src/equities/venues/arcus-spot.mjs +0 -105
  315. package/src/equities/venues/hyperliquid-hip3.mjs +0 -224
  316. package/src/equities/venues/rh-uniswap.mjs +0 -216
  317. package/src/equities/venues/solana-xstocks.mjs +0 -139
  318. package/src/equities/venues/ton-stonfi.mjs +0 -139
  319. package/src/exact-integer.mjs +0 -72
  320. package/src/exec-policy.mjs +0 -419
  321. package/src/flags.mjs +0 -15
  322. package/src/fresh-window.mjs +0 -76
  323. package/src/gmx-attestation.mjs +0 -176
  324. package/src/index.mjs +0 -107
  325. package/src/licensing/locals-only.mjs +0 -25
  326. package/src/nft-gas-war-guard.mjs +0 -139
  327. package/src/onboarding/agent-keys.mjs +0 -161
  328. package/src/onboarding/harness-configs.mjs +0 -102
  329. package/src/onboarding/index.mjs +0 -18
  330. package/src/onboarding/tiers.mjs +0 -139
  331. package/src/oracle-env.mjs +0 -55
  332. package/src/package-manifest.mjs +0 -42
  333. package/src/plugins/agent-plugin-loader.mjs +0 -225
  334. package/src/portfolio-risk.mjs +0 -170
  335. package/src/prepare-envelope.mjs +0 -204
  336. package/src/profile-upgrade.mjs +0 -277
  337. package/src/protocol-execution.mjs +0 -84
  338. package/src/protocol-templates/gate.mjs +0 -179
  339. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  340. package/src/public-api/agent-grants.mjs +0 -57
  341. package/src/public-api/buzz-integration.mjs +0 -267
  342. package/src/public-api/connect-agent.mjs +0 -424
  343. package/src/public-api/grants.mjs +0 -142
  344. package/src/public-api/http.mjs +0 -707
  345. package/src/public-api/metering.mjs +0 -111
  346. package/src/public-control/aa-adapter.mjs +0 -402
  347. package/src/public-control/build-registry.mjs +0 -227
  348. package/src/public-control/bundler-client.mjs +0 -357
  349. package/src/public-control/grant-indexer.mjs +0 -296
  350. package/src/public-control/policy-render.mjs +0 -69
  351. package/src/public-control/policy-schema.mjs +0 -322
  352. package/src/public-control/runtime-config.mjs +0 -275
  353. package/src/public-control/session-key-model.mjs +0 -379
  354. package/src/public-control/session-orchestrator.mjs +0 -418
  355. package/src/rfq/intent.mjs +0 -180
  356. package/src/rfq/sources.mjs +0 -181
  357. package/src/route-attestation.mjs +0 -132
  358. package/src/router/best-execution.mjs +0 -326
  359. package/src/router/index.mjs +0 -250
  360. package/src/router/integrator-fee.mjs +0 -135
  361. package/src/router/prepare-bridge.mjs +0 -293
  362. package/src/router/prepare-route.mjs +0 -398
  363. package/src/router/proposal.mjs +0 -311
  364. package/src/router/risk-classifier.mjs +0 -119
  365. package/src/router/route-sources.mjs +0 -364
  366. package/src/scanner/chains.config.mjs +0 -543
  367. package/src/scanner/contract.mjs +0 -270
  368. package/src/scanner/evm-scanner.mjs +0 -394
  369. package/src/scanner/index.mjs +0 -9
  370. package/src/scanner/v2-venue.mjs +0 -351
  371. package/src/scanner/v3-venue.mjs +0 -308
  372. package/src/scopes.mjs +0 -44
  373. package/src/sell-simulation.mjs +0 -167
  374. package/src/signals/engine.mjs +0 -146
  375. package/src/signals/index.mjs +0 -1
  376. package/src/token-transfer-guard.mjs +0 -188
  377. package/src/tui/app.mjs +0 -438
  378. package/src/tui/backend.mjs +0 -215
  379. package/src/tui/format.mjs +0 -272
  380. package/src/tui/gateway-client.mjs +0 -177
  381. package/src/tui/input.mjs +0 -501
  382. package/src/tui/memory.mjs +0 -105
  383. package/src/tui/meta-learn.mjs +0 -85
  384. package/src/tui/renderer.mjs +0 -443
  385. package/src/tui/scheduler.mjs +0 -205
  386. package/src/tui/skills-loader.mjs +0 -140
  387. package/src/tui/standalone-client.mjs +0 -752
  388. package/src/tui/theme.mjs +0 -81
  389. package/src/vault-attestation.mjs +0 -146
  390. package/src/venues.mjs +0 -206
  391. package/src/watch-preferences.mjs +0 -85
  392. /package/{profiles → dist/assets/profiles}/_template/SOUL.md +0 -0
  393. /package/{profiles → dist/assets/profiles}/_template/profile.json +0 -0
  394. /package/{profiles → dist/assets/profiles}/bitcoin-agent/SOUL.md +0 -0
  395. /package/{profiles → dist/assets/profiles}/bitcoin-agent/profile.json +0 -0
  396. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/SOUL.md +0 -0
  397. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/profile.json +0 -0
  398. /package/{profiles → dist/assets/profiles}/oracle/SOUL.md +0 -0
  399. /package/{profiles → dist/assets/profiles}/oracle/profile.json +0 -0
  400. /package/{profiles → dist/assets/profiles}/polymarket-agent/SOUL.md +0 -0
  401. /package/{profiles → dist/assets/profiles}/polymarket-agent/profile.json +0 -0
  402. /package/{profiles → dist/assets/profiles}/profile.schema.json +0 -0
  403. /package/{profiles → dist/assets/profiles}/protocol-builder/SOUL.md +0 -0
  404. /package/{profiles → dist/assets/profiles}/protocol-builder/profile.json +0 -0
  405. /package/{profiles → dist/assets/profiles}/robinhood-agent/SOUL.md +0 -0
  406. /package/{profiles → dist/assets/profiles}/robinhood-agent/profile.json +0 -0
  407. /package/{profiles → dist/assets/profiles}/solana-agent/SOUL.md +0 -0
  408. /package/{profiles → dist/assets/profiles}/solana-agent/profile.json +0 -0
  409. /package/{profiles → dist/assets/profiles}/stable-agent/SOUL.md +0 -0
  410. /package/{profiles → dist/assets/profiles}/stable-agent/profile.json +0 -0
  411. /package/{skills → dist/assets/skills}/balance/SKILL.md +0 -0
  412. /package/{skills → dist/assets/skills}/bitcoin-l1.md +0 -0
  413. /package/{skills → dist/assets/skills}/chain-defi-ecosystem-profiling.md +0 -0
  414. /package/{skills → dist/assets/skills}/evm-contract-research.md +0 -0
  415. /package/{skills → dist/assets/skills}/hyperliquid.md +0 -0
  416. /package/{skills → dist/assets/skills}/multichain-exec-desk.md +0 -0
  417. /package/{skills → dist/assets/skills}/oracle-action-semantics/SKILL.md +0 -0
  418. /package/{skills → dist/assets/skills}/oracle-best-execution/SKILL.md +0 -0
  419. /package/{skills → dist/assets/skills}/oracle-best-execution.md +0 -0
  420. /package/{skills → dist/assets/skills}/oracle-bitcoin/SKILL.md +0 -0
  421. /package/{skills → dist/assets/skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
  422. /package/{skills → dist/assets/skills}/oracle-chat/SKILL.md +0 -0
  423. /package/{skills → dist/assets/skills}/oracle-chat/chain.SKILL.md +0 -0
  424. /package/{skills → dist/assets/skills}/oracle-chat/setup.SKILL.md +0 -0
  425. /package/{skills → dist/assets/skills}/oracle-circuit-breaker/SKILL.md +0 -0
  426. /package/{skills → dist/assets/skills}/oracle-contract-research/SKILL.md +0 -0
  427. /package/{skills → dist/assets/skills}/oracle-desk/SKILL.md +0 -0
  428. /package/{skills → dist/assets/skills}/oracle-desk.md +0 -0
  429. /package/{skills → dist/assets/skills}/oracle-dex-launch/SKILL.md +0 -0
  430. /package/{skills → dist/assets/skills}/oracle-equities/SKILL.md +0 -0
  431. /package/{skills → dist/assets/skills}/oracle-grants/SKILL.md +0 -0
  432. /package/{skills → dist/assets/skills}/oracle-hypercore-staking/SKILL.md +0 -0
  433. /package/{skills → dist/assets/skills}/oracle-hyperliquid/SKILL.md +0 -0
  434. /package/{skills → dist/assets/skills}/oracle-meme-token-sniper/SKILL.md +0 -0
  435. /package/{skills → dist/assets/skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
  436. /package/{skills → dist/assets/skills}/oracle-multichain-token-launch/SKILL.md +0 -0
  437. /package/{skills → dist/assets/skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
  438. /package/{skills → dist/assets/skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
  439. /package/{skills → dist/assets/skills}/oracle-polymarket/SKILL.md +0 -0
  440. /package/{skills → dist/assets/skills}/oracle-protocol-builder/SKILL.md +0 -0
  441. /package/{skills → dist/assets/skills}/oracle-protocol-security/SKILL.md +0 -0
  442. /package/{skills → dist/assets/skills}/oracle-public-product/SKILL.md +0 -0
  443. /package/{skills → dist/assets/skills}/oracle-receipts/SKILL.md +0 -0
  444. /package/{skills → dist/assets/skills}/oracle-receipts.md +0 -0
  445. /package/{skills → dist/assets/skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
  446. /package/{skills → dist/assets/skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
  447. /package/{skills → dist/assets/skills}/oracle-solana/SKILL.md +0 -0
  448. /package/{skills → dist/assets/skills}/oracle-solana-nft/SKILL.md +0 -0
  449. /package/{skills → dist/assets/skills}/oracle-token-research/SKILL.md +0 -0
  450. /package/{skills → dist/assets/skills}/solana.md +0 -0
@@ -1,34 +0,0 @@
1
- # Locals Only fee waiver
2
-
3
- Oracle is public to everyone. Source access, npm installation, CLI commands,
4
- desktop downloads, ordinary product use, and execution arming are not gated by
5
- an NFT.
6
-
7
- It does not gate Oracle downloads, access, source, CLI use, desktop use, or
8
- execution preparation.
9
-
10
- A wallet holding a Locals Only NFT receives a **0% Oracle integrator fee**. A
11
- non-holder can use the same product and routes, but the standard disclosed
12
- Oracle fee applies when fee collection is configured.
13
-
14
- ## Collection
15
-
16
- - Chain: HyperEVM, chain ID `999`
17
- - Contract: `0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75`
18
- - Check: read-only ERC-721 `balanceOf(address)`
19
-
20
- The balance check does not request a signature, approval, private key, seed
21
- phrase, or transaction. Run `oracle fees status` for the configured wallet or
22
- `oracle fees check <address>` for any public address.
23
-
24
- ## Fee behavior
25
-
26
- - No fee recipient configured: Oracle charges no integrator fee to anyone.
27
- - Fee recipient configured, non-holder: the configured fee applies, capped at
28
- 100 basis points.
29
- - Fee recipient configured, Locals Only holder: Oracle's integrator fee is 0%.
30
- - Hyperliquid builder fees are not waived. Provider fees, bridge fees, gas,
31
- slippage, LP fees, and network costs also remain separate.
32
-
33
- Fee resolution stays separate from custody. The public package remains keyless
34
- and prepare-only; the user's wallet reviews, signs, and submits.
@@ -1,29 +0,0 @@
1
- # Oracle protocol pack standard
2
-
3
- An Oracle protocol pack is a package-safe ESM module that turns an intent into an unsigned action and decodes independently obtained receipts. A pack is an adapter, not a wallet, signer, broadcaster, or authority. See `examples/oracle-pack-template.mjs` for the smallest complete shape.
4
-
5
- ## Required surface
6
-
7
- Every pack exports a default object with these members (named exports may mirror them):
8
-
9
- - `provider`: stable provider identity, semantic version, supported chain IDs, and provenance/trust metadata. Remote token names, symbols, descriptions, image fields, URLs, and NFT metadata remain untrusted data.
10
- - `prepare(intent)`: validates the intent and returns an unsigned transaction or typed action. It must not accept keys, sign, submit, broadcast, or report execution success.
11
- - `decode(receipt)`: validates and converts a chain/provider receipt into a documented result. Unknown or malformed receipts fail closed.
12
- - `riskRules`: an array or function describing enforceable limits and refusal conditions. Human-readable warnings alone are not rules.
13
- - `tests`: non-empty metadata naming the local test command and covered properties. Tests must be deterministic and require no credentials or network.
14
-
15
- ## Prompt-injection boundary
16
-
17
- Treat every provider response and token/NFT metadata string as inert data. Never concatenate metadata into system/developer instructions, interpret it as tool directions, or let it modify recipients, calldata, limits, and policy. Render or quote it through a data channel and retain its provenance. Packs should test adversarial values such as “ignore previous instructions,” requests for secrets, and demands to sign or invoke tools.
18
-
19
- ## Custody boundary
20
-
21
- Pack exports must not expose signers, wallets, private keys, seed phrases, signing functions, transaction submission, or broadcasting. `prepare` returns data to a separately authorized custody surface. Environment variables and provider credentials must not appear in prepared output, logs, errors, fixtures, or metadata. Imports should be side-effect free; merely loading a pack must not make network calls.
22
-
23
- ## Receipt gate
24
-
25
- Preparation is not execution. A prepared result declares a `receiptGate` and consumers must not mark an action successful until `decode` receives a receipt from an independent, trusted transport and verifies its chain, transaction identity, status, and required confirmations. Timeouts, pending receipts, mismatches, reverts, and undecodable responses are not success.
26
-
27
- ## Local adversarial benchmark
28
-
29
- Run `node scripts/adversarial-bench.mjs <pack.mjs> [...]`. It imports only the named local modules, invokes no pack functions, emits one deterministic JSON summary, and exits `1` when a gate fails (`2` for usage/load errors). It checks required surface fields, forbidden custody exports, missing test metadata, and prompt-injection strings nested in provider or pack metadata. This static public gate complements, rather than replaces, behavioral tests of preparation and receipt verification.
package/docs/profiles.md DELETED
@@ -1,151 +0,0 @@
1
- # Agent profiles
2
-
3
- Oracle is not one agent. It's a mesh of specialists with a router in front.
4
-
5
- ```
6
- you
7
- |
8
- Task
9
- |
10
- oracle <- routes, never authorizes custody
11
- |
12
- +------+------+------+------+------+------+------+
13
- | | | | | | | |
14
- poly hyper robin solana bitcoin stable protocol
15
- market liquid hood builder
16
- ```
17
-
18
- Each lane is a [Hermes](https://github.com/NousResearch/hermes-agent) **profile**:
19
- its own system prompt, skill set, memory, and session store. They share a wallet
20
- policy and a receipts discipline, nothing else.
21
-
22
- ## Why profiles instead of one big agent
23
-
24
- Three practical reasons, learned the hard way:
25
-
26
- 1. **Context stays small.** A Polymarket question shouldn't load Bitcoin
27
- ordinals knowledge. Smaller context is cheaper, faster, and more accurate.
28
- 2. **Memory doesn't cross-contaminate.** What the perps lane learned about
29
- funding rates should not leak into the NFT lane's judgment.
30
- 3. **Blast radius is bounded.** A grant scoped to one lane's venues can't be
31
- spent by another.
32
-
33
- ## The lanes
34
-
35
- | Profile | Owns | Typical grant |
36
- |---|---|---|
37
- | `oracle` | routing, synthesis, multi-chain comparison, `/balance` portfolio aggregation | read + simulate only |
38
- | `polymarket-agent` | prediction markets, event odds, CLOB cards/API-key order intents | read, quote, prepare |
39
- | `hyperliquid-agent` | perps, spot, HIP-3 builder dexs, HIP-4 outcomes | read, quote, prepare |
40
- | `robinhood-agent` | Robinhood Chain (4663) tokens, NFTs, tokenized Robinhood-style assets, capped NFT mints | read, quote, prepare |
41
- | `solana-agent` | Solana swaps, research, Jupiter routes | read, quote, prepare |
42
- | `bitcoin-agent` | Bitcoin L1, Ordinals/runes, inscriptions | read, prepare:inscription |
43
- | `stable-agent` | Stable (988), USDT-native gas quirks | read, quote, prepare |
44
- | `protocol-builder` | scaffold, review, prepare chain-family token/NFT collections, gacha, DEX, and protocol deploys | prepare:deploy, prepare:mint, simulate |
45
- | `_template` | your new lane | you decide |
46
-
47
- These grants describe the public prepare plane, not every capability an operator may install beside it. The generic unattended signer exposes six bounded surfaces (`hl`, `poly`, `evm-swap`, `evm-bridge`, `btc`, `sol`), each of which decodes its own envelope and refuses while its allowlists are empty. A separately installed, same-host, owner-gated EVM executor may expose one exact bounded action after explicit `arm`; profiles must verify it before claiming availability. `watch`, `watch this`, and `ping me` remain `alert_only` regardless of executor presence.
48
-
49
- `protocol-builder` classifies each launch by chain family, then designs and
50
- prepares unsigned token, NFT collection, protocol, or mint-bot transactions. It
51
- fails closed when no verified adapter exists, never house-signs, and keeps deploy,
52
- metadata, liquidity, mint, and authority actions as separate user approvals.
53
-
54
- The root `oracle` lane owns `/balance`, natural-language balance, and portfolio
55
- history requests. Its `balance` skill calls the read-only
56
- `portfolio_snapshot` MCP tool once, records a compact profile-local observation,
57
- reports partial coverage and unavailable providers, and labels `knownUsd` as
58
- incomplete instead of inventing a full portfolio total. `portfolio_history`
59
- reads those observations and `portfolio_value_graph` renders the known-value
60
- series while omitting unavailable values rather than plotting fake zeroes.
61
-
62
- ## Model choice is yours
63
-
64
- Oracle makes **no model calls**. It has no LLM client, no API key, no inference
65
- dependency — its runtime deps are `ethers`, `viem`, and three `@noble`/`@scure`
66
- crypto libraries. Every lane inherits whatever provider your Hermes is configured
67
- with.
68
-
69
- So there is nothing to sign up for. If Hermes already talks to a model, Oracle
70
- works.
71
-
72
- What profiles *do* give you is **per-lane** model choice, because each profile has
73
- its own `config.yaml`:
74
-
75
- ```yaml
76
- # ~/.hermes/profiles/<name>/config.yaml
77
- model:
78
- provider: anthropic # or openai-codex, nous, xai-oauth, a local model...
79
- default: claude-opus-5
80
- ```
81
-
82
- That lets you put a heavy reasoner on the router and something cheap and fast on
83
- a polling lane:
84
-
85
- | Lane | Wants | Why |
86
- |---|---|---|
87
- | `oracle` | strongest reasoner | routing and synthesis need judgment |
88
- | `protocol-builder` | strongest reasoner | contract review is unforgiving |
89
- | `hyperliquid-agent` | fast, numeric, tool-heavy | many small tool calls |
90
- | `polymarket-agent` | news-shaped reasoning | event pricing is narrative |
91
- | research fan-out | cheap and parallel | breadth over depth |
92
-
93
- Starting point, not doctrine. Benchmark on your own workload.
94
-
95
- ### If you want one login for many models
96
-
97
- Optional convenience, not a requirement: [Nous
98
- Portal](https://nousresearch.com) fronts the frontier set (Claude, GPT, Grok,
99
- DeepSeek, Qwen and more) behind a single Hermes credential, so each lane can pick
100
- a different model without five separate API keys and five bills.
101
-
102
- ```bash
103
- hermes auth add nous
104
- ```
105
-
106
- Any Hermes-supported provider works equally well. Oracle does not care.
107
-
108
- ## Creating a lane
109
-
110
- ```bash
111
- hermes profile create polymarket-agent
112
- ```
113
-
114
- Then give it a `SOUL.md` (who it is, what it owns, what it must refuse) and a
115
- `config.yaml` (model + provider). Point it at Oracle's MCP read plane.
116
-
117
- `oracle-init --apply` writes this for you. Manual form (Hermes wants command and
118
- args as separate tokens):
119
-
120
- ```bash
121
- # terminal 1 — local read plane the MCP tools call
122
- npx oracle-data
123
-
124
- # terminal 2 — wire MCP into a lane
125
- hermes -p polymarket-agent mcp add oracle-data --command oracle-data-mcp
126
- ```
127
-
128
- Now that lane can read 70 provider modules covering 219 protocols/venues across
129
- EVM, Solana, and Bitcoin, quote real routes, and
130
- prepare unsigned transactions — and it still cannot sign anything.
131
-
132
- ## Posture
133
-
134
- Every lane starts `DISARMED`. Arming is a deliberate, scoped, expiring act:
135
-
136
- ```
137
- grant:
138
- chain: 8453
139
- actions: [read:chain, simulate:tx, prepare:swap]
140
- targets: [<router address>]
141
- maxValueWei: <cap>
142
- expiresAt: <unix ts>
143
- ```
144
-
145
- An action outside the grant is refused, not negotiated. When the grant expires,
146
- the lane goes back to reading.
147
-
148
- ## A rule worth keeping
149
-
150
- Give a lane the narrowest grant that makes it useful, and let it expire. A
151
- permanent broad grant is just a hot wallet with extra steps.
@@ -1,206 +0,0 @@
1
- # Public surface
2
-
3
- Every supported import subpath, executable, and runtime environment variable in
4
- `@oracle-agent/oracle`. If something is in `exports`/`bin` it is a public
5
- contract and belongs here; if it is not meant to be public it should be removed
6
- from the manifest rather than left undocumented.
7
-
8
- Generated counts are asserted by `test/public-surface-doc.test.mjs`, so this
9
- file cannot silently drift from `package.json`.
10
-
11
- ## Import subpaths
12
-
13
- | Subpath | What it gives you |
14
- |---|---|
15
- | `@oracle-agent/oracle` | package root — re-exports the common surface |
16
- | `@oracle-agent/oracle/data` | provider catalog + `dataCall` read plane |
17
- | `@oracle-agent/oracle/policy` | grant policy schema: validation, canonicalization, caps constants |
18
- | `@oracle-agent/oracle/chains` | chain registry and per-chain metadata |
19
- | `@oracle-agent/oracle/scanner` | token/contract scanner capabilities |
20
- | `@oracle-agent/oracle/router` | route sources and quote routing |
21
- | `@oracle-agent/oracle/equities` | cross-chain on-chain equities best execution (HIP-3 / Arcus / RH / Solana / TON), prepare-only |
22
- | `@oracle-agent/oracle/action-semantics` | decoded-action semantics for review |
23
- | `@oracle-agent/oracle/address-book` | label store — refuses key material |
24
- | `@oracle-agent/oracle/agent-grants` | bounded, revocable, time-boxed agent permissions: `planConnection` builds the unsigned grant, `activateSession` accepts the owner's signature, `revokeSession` revokes, and `listActiveGrants`/`getGrant`/`classifyGrant` read it back. Reads are pure over an injected store with an explicit clock. Oracle prepares and validates; the user signs and Oracle never holds a key |
25
- | `@oracle-agent/oracle/names` | cross-chain name resolution: `.hl` (HLNames), `.hype` (dotHYPE), `.eth` (ENS), Basenames. Forward and reverse, keyless on-chain reads via the read-only RPC allowlist; never signs or broadcasts |
26
- | `@oracle-agent/oracle/nft-gas-war` | NFT mint/gas-war helpers |
27
- | `@oracle-agent/oracle/prepare-envelope` | `stampPrepared` / `assertPreparedEnvelope` |
28
- | `@oracle-agent/oracle/connect` | deterministic MCP harness configuration snippets for Hermes, Claude Code, Codex, Cursor, and generic clients |
29
- | `@oracle-agent/oracle/receipts` | caller-fact action-receipt normalization — refuses secret-bearing fields; does not verify chain success |
30
- | `@oracle-agent/oracle/risk` | risk scoring helpers |
31
- | `@oracle-agent/oracle/watch` | watch/alert subscriptions |
32
- | `@oracle-agent/oracle/signals` | signal feed helpers |
33
- | `@oracle-agent/oracle/farming` | farming method presets, live farm scoring (`discoverFarms`), and airdrop expected-value math (`airdropEV`) — read-only discovery and prepare-plan design; never signs or broadcasts |
34
-
35
- `./package.json` is deliberately **not** exported. Do not derive internal paths
36
- with `require.resolve('@oracle-agent/oracle/package.json')` — it throws
37
- `ERR_PACKAGE_PATH_NOT_EXPORTED`. Invoke the shipped bins by name instead.
38
-
39
- ## Executables
40
-
41
- | Bin | Purpose |
42
- |---|---|
43
- | `oracle` | main CLI |
44
- | `oracle-data` | local read-plane server (`oracle data serve`) |
45
- | `oracle-public` | public-plane server (`oracle public serve`) |
46
- | `oracle-data-mcp` | MCP stdio server for agent lanes |
47
- | `oracle-init` | write config + attestation secret (`oracle init --apply`) |
48
- | `oracle-upgrade` | in-place upgrade helper (`oracle upgrade`) |
49
- | `oracle-scan` | scanner entrypoint |
50
- | `oracle-route` | route/quote entrypoint |
51
- | `oracle-equities` | on-chain equities best execution (HIP-3 / Arcus / RH / Solana / TON) |
52
-
53
- ## Environment variables
54
-
55
- ### Arming flags — default OFF, enable only on literal `1`
56
-
57
- These are the gates that decide whether anything can ever be signed or
58
- broadcast. `envFlag` is strict: `true`, `yes`, `on`, or any other value leaves
59
- them OFF. Setting them is not sufficient to move funds — the signer's own
60
- policy and custody wall still apply.
61
-
62
- | Name | Default | Meaning |
63
- |---|---|---|
64
- | `ORACLE_EXECUTE_ENABLED` | off | allow the signing surface to arm at all |
65
- | `ORACLE_DEPLOY_ENABLED` | off | allow contract deployment paths to arm |
66
- | `ORACLE_ONBOARD_HTTP` | off | expose onboarding routes over HTTP |
67
- | `ORACLE_PUBLIC_API_MODE` | off | run the server in public-plane mode |
68
- | `ORACLE_ALLOW_CREATE` | off | allow create/deploy-shaped actions |
69
- | `ORACLE_ALLOW_EPHEMERAL_CAPS` | off | allow ephemeral cap grants |
70
-
71
- ### Guard rails — default ON, honor disable words
72
-
73
- | Name | Default | Meaning |
74
- |---|---|---|
75
- | `ORACLE_VALUE_CAPS_ENABLED` | on | per-transaction value caps. Uses strict `!== "0"` so a stray `false` leaves the cap wall standing |
76
-
77
- ### Integrity and attestation
78
-
79
- | Name | Meaning |
80
- |---|---|
81
- | `ORACLE_ROUTE_ATTESTATION_SECRET` | keyed route attestation HMAC. Written by `oracle init --apply` |
82
- | `MAD_ROUTE_ATTESTATION_SECRET` | legacy alias for the above |
83
- | `ORACLE_ATTESTATION_SECRET` | alternate attestation secret name |
84
- | `ORACLE_STAMP_HMAC_SECRET` | keyed MAC over prepared envelopes. A verifier holding this secret **requires** a valid MAC — an envelope with the MAC stripped is refused, so the keyed mode cannot be silently downgraded to the unkeyed checksum |
85
- | `ORACLE_STAMP_REQUIRE_MAC` | set `1` to require a MAC even when the verifier has no secret configured. With a secret set this is already implied |
86
- | `ORACLE_PREPARE_HARD_MAX_AGE_MS` | hard ceiling on prepared-envelope age |
87
-
88
- ### Servers and endpoints
89
-
90
- | Name | Default | Meaning |
91
- |---|---|---|
92
- | `ORACLE_INTEGRATOR_FEE_BPS` | unset (no fee) | Integrator fee in basis points on routed swaps, clamped to 100 (1%). Unset, zero, negative or malformed means **no fee**. Locals Only holders receive a 0% Oracle integrator-fee rate regardless of this value; ownership never changes product access |
93
- | `ORACLE_INTEGRATOR_FEE_RECIPIENT` | unset | EVM address that receives the fee. **Required**: a fee configured without a valid recipient fails closed to no fee, because otherwise the basis points are charged and silently kept by the aggregator |
94
- | `ORACLE_INTEGRATOR_ID` | `oracle` | Integrator/partner string sent to route providers. ParaSwap accepts any value with no registration; LI.FI requires the id to be registered at portal.li.fi or the quote 400s |
95
- | `ORACLE_DATA_HOST` | `127.0.0.1` | read-plane bind host (loopback enforced) |
96
- | `ORACLE_DATA_PORT` | `8787` | read-plane port |
97
- | `ORACLE_DATA_URL` | `http://127.0.0.1:8787` | where the CLI looks for the data server |
98
- | `ORACLE_PUBLIC_HOST` | `127.0.0.1` | public-plane bind host (loopback enforced) |
99
- | `ORACLE_PUBLIC_PORT` | — | public-plane port |
100
- | `ORACLE_TRUST_PROXY` | unset (off) | when `1`, read the caller IP from `X-Forwarded-For` for rate limiting. Set this ONLY when the service sits behind a proxy you control that overwrites the header. Enabling it on a directly-exposed server lets any client spoof a fresh identity per request and bypass the rate limit entirely. |
101
- | `ORACLE_INDEXER_RPC_<CHAINID>` | unset | optional `eth_getLogs`-capable endpoint for one chain, e.g. `ORACLE_INDEXER_RPC_1`. Enables full approval discovery on that chain instead of the curated candidate probe. |
102
- | `ORACLE_INDEXER_RPC_DEFAULT` | unset | fallback indexer endpoint for chains without a specific override. |
103
- | `ORACLE_INDEXER_CHUNK_SPAN` | `10000` | max block span per `eth_getLogs` query. Many endpoints refuse wider ranges; lower it if yours caps harder. |
104
-
105
- ### Approval discovery coverage
106
-
107
- Without an indexer endpoint, approval scanning probes a curated set of known
108
- routers and tokens with `allowance()`. That works on any public RPC but is
109
- scoped: an approval to a spender outside the list is not found, so an empty
110
- result means "nothing found in that scope", never "this wallet is safe". The UI
111
- states the scope rather than implying safety.
112
-
113
- Configuring `ORACLE_INDEXER_RPC_*` upgrades discovery to log-derived, covering
114
- all tokens and spenders. Liveness is still confirmed by re-reading
115
- `allowance()` / `isApprovedForAll()`, because log state alone reports
116
- long-revoked approvals as active.
117
-
118
- ### Rate limiting and admission
119
-
120
- #### `0.12.0` clock migration
121
-
122
- `buildConnectRequest`, `assembleUnsignedGrant`, and `planConnection` now require
123
- `opts.now` even when the input already supplies an absolute `expiresAt`. Callers
124
- migrating from `0.11.x` must pass a positive unix-seconds integer. This is an
125
- intentional fail-closed API change: live construction no longer silently falls
126
- back to shape-only validation. Hosted HTTP callers should not send a security
127
- clock; the server replaces caller time with its own clock.
128
-
129
- Live grants have a hard maximum TTL of 24 hours. Direct library calls to
130
- `buildConnectRequest` and `assembleUnsignedGrant` require an explicit
131
- `opts.now` so deterministic tests and offline clients cannot fall back to an
132
- implicit clock. At the HTTP boundary, caller-provided `opts.now` is ignored:
133
- the server clock is authoritative for connect, assemble, active-list, and
134
- grant-status routes. Caller-provided `allowWildcardActions` is also ignored;
135
- hosted grant routes always reject wildcard scope. Shape-only normalization
136
- without `now` is reserved for historical identification/indexing and does not
137
- establish live authority.
138
-
139
- The public plane is unauthenticated, so both planes are throttled per caller IP
140
- in fixed 60-second windows: 120 requests for cheap reads, and 10 for
141
- `/public/approvals`, which fans a single request out to many upstream RPC calls.
142
- A throttled caller gets `429` with `Retry-After` before any request body is
143
- parsed. `chainIds` is additionally capped at 12 per request so one call cannot
144
- cost as much as many.
145
-
146
- This limiter is an abuse brake, not authentication. Keep the server on loopback;
147
- a hosted service requires server-side authentication and per-user isolation.
148
- Buzz discovery, capability verification, and audit routes are documented in
149
- [buzz-integration.md](buzz-integration.md).
150
-
151
- Counters are in memory and reset on restart. That is sufficient for accidental
152
- hammering and casual abuse; a distributed flood still needs an edge/WAF in
153
- front.
154
-
155
- The data server serves `/health`; `/` intentionally returns 404 with a route
156
- list.
157
-
158
- ### Paths and config
159
-
160
- | Name | Meaning |
161
- |---|---|
162
- | `ORACLE_CONFIG_DIR` | config directory (default `~/.config/oracle`) |
163
- | `ORACLE_EXEC_ENV_FILE` | path to `exec.env` |
164
- | `ORACLE_AGENT_KEYS_PATH` | agent key store path |
165
- | `ORACLE_AUTH_FILE_STORE` | auth file store path |
166
- | `ORACLE_ADDRESS_BOOK` | address-book path |
167
- | `ORACLE_OPERATOR_BIN_DIR` | operator binary directory |
168
- | `ORACLE_AUDIT_STREAM` | audit stream destination |
169
-
170
- ### Packaged desktop mode
171
-
172
- The desktop app sets these itself. They are documented because they change
173
- security-relevant behavior, and an operator should be able to find out exactly
174
- what the bundled app does differently from a plain `npm i -g` install.
175
-
176
- | Name | Default | Meaning |
177
- |---|---|---|
178
- | `ORACLE_PUBLIC_DESKTOP` | off | Marks the process as the packaged public desktop. While on: the sign-plane operator is never resolved even if one is installed on the host, remote compute backends are refused, and legacy `~/.config/mad-desk` fallbacks resolve to the app-owned config dir instead of the host's. |
179
- | `ORACLE_REMOTE_COMPUTE_DISABLE` | off | Refuses any remote/SSH chat compute backend regardless of stored config. |
180
-
181
- ### Routing and defaults
182
-
183
- | Name | Meaning |
184
- |---|---|
185
- | `ORACLE_ALLOWED_CHAINS` | restrict routing to a chain allowlist |
186
- | `ORACLE_DEFAULT_ADDRESS` | default address for reads |
187
- | `ORACLE_PROFILE` | active profile name |
188
- | `ORACLE_PRIVY_APP_ID` | Privy app id for connect flows |
189
-
190
- ### Runtime integration
191
-
192
- | Name | Meaning |
193
- |---|---|
194
- | `ORACLE_HERMES_BIN` | path to the agent runtime binary |
195
- | `ORACLE_CLAUDE_CODE_VERSION` | pinned agent runtime version |
196
- | `ORACLE_PYTHON` / `ORACLE_UV_BIN` | interpreter overrides |
197
- | `ORACLE_NATIVE_TUI` / `ORACLE_FORCE_CHAT` / `ORACLE_PLAIN_HARNESS` | CLI presentation modes |
198
- | `ORACLE_NO_BOOTSTRAP` | skip bootstrap on start |
199
- | `ORACLE_CLI_DEBUG` | verbose CLI diagnostics |
200
-
201
- ### Test-only
202
-
203
- | Name | Meaning |
204
- |---|---|
205
- | `ORACLE_TEST_ISOLATE_SECRETS` | isolate secrets during tests |
206
- | `ORACLE_FAKE_HOME` | redirect `$HOME` during tests |
@@ -1,65 +0,0 @@
1
- // Example: register a chain Oracle has never seen, then use it.
2
- //
3
- // Run: node examples/add-a-chain.mjs
4
- //
5
- // The point of this example is that there is no adapter to write. A chain is a
6
- // config object; the generic EVM scanner supplies the capabilities.
7
-
8
- import { registerCustomChain } from "../src/scanner/chains.config.mjs";
9
- import { scannerCoverage } from "../src/scanner/contract.mjs";
10
-
11
- // 1. Describe the chain. Note rpcEnv holds VARIABLE NAMES, not URLs -- endpoints
12
- // stay in the environment so nothing sensitive lands in source control.
13
- const scanner = registerCustomChain({
14
- key: "examplechain",
15
- chainId: 424242,
16
- name: "Example Chain",
17
- rpcEnv: ["EXAMPLECHAIN_RPC_URL"],
18
- nativeCurrency: { symbol: "EXC", decimals: 18 },
19
- explorer: "https://explorer.example",
20
-
21
- // Omitted deliberately: dexscreenerSlug. Without it, pool discovery reports
22
- // UNAVAILABLE rather than guessing -- a wrong slug would return another chain's
23
- // pools, which is worse than no answer.
24
-
25
- // Omitted deliberately: venues. With none, the chain is read/research capable and
26
- // fail-closed for routing value. Adding one requires recorded provenance; see
27
- // docs/adding-a-chain.md.
28
- });
29
-
30
- console.log(`registered: ${scanner.name} (chain ${scanner.chainId})`);
31
-
32
- // 2. Ask what it can actually do. The answer is honest -- unimplemented
33
- // capabilities are listed as unsupported, not silently absent.
34
- const caps = scanner.capabilities();
35
- console.log(`\nsupported (${caps.supported.length}): ${caps.supported.join(", ")}`);
36
- console.log(`unsupported (${caps.unsupported.length}): ${caps.unsupported.join(", ")}`);
37
-
38
- // 3. An unimplemented capability throws with an actionable message. It never
39
- // returns undefined, which a caller could mistake for "no result".
40
- try {
41
- await scanner.quote({ from: "0x", to: "0x", amount: "1" });
42
- } catch (err) {
43
- console.log(`\nquote() correctly refused:\n ${err.message.split("\n")[0]}`);
44
- }
45
-
46
- // 4. Pool discovery is UNAVAILABLE, and says why.
47
- const pools = await scanner.resolvePools("0x1111111111111111111111111111111111111111");
48
- console.log(`\nresolvePools evidence: ${pools.evidence}`);
49
- console.log(` reason: ${pools.reason}`);
50
-
51
- // 5. Live reads need an RPC. Show the exact variable to set rather than failing
52
- // with a generic network error.
53
- console.log(`\nto make live reads, set one of: ${scanner.rpcEnv.join(", ")}`);
54
- try {
55
- const head = await scanner.blockNumber();
56
- console.log(` head: ${head.blockNumber} (${head.evidence})`);
57
- } catch {
58
- console.log(" (no RPC configured -- expected for this example chain)");
59
- }
60
-
61
- // 6. The coverage matrix now includes it alongside the built-ins.
62
- const cov = scannerCoverage();
63
- console.log(`\ncoverage: ${cov.chainCount} chain(s) registered`);
64
- const mine = cov.chains[424242];
65
- console.log(` examplechain failClosed for routing: ${mine.failClosed}`);
@@ -1,38 +0,0 @@
1
- import assert from "node:assert/strict";
2
-
3
- // Minimal Oracle protocol pack. It prepares unsigned actions; it never receives
4
- // keys, signs, broadcasts, or claims that untrusted metadata is an instruction.
5
-
6
- export const provider = Object.freeze({
7
- id: "example-protocol",
8
- version: "1.0.0",
9
- chains: [8453],
10
- metadata: { source: "on-chain", trust: "untrusted-data" },
11
- });
12
-
13
- export function prepare(intent) {
14
- assert.ok(intent && provider.chains.includes(intent.chainId), "unsupported chain");
15
- return {
16
- kind: "unsigned-transaction",
17
- chainId: intent.chainId,
18
- transaction: { to: intent.to, data: intent.data ?? "0x", value: intent.value ?? "0" },
19
- receiptGate: { required: true, confirmations: 1, match: ["chainId", "transaction.to"] },
20
- };
21
- }
22
-
23
- export function decode(receipt) {
24
- assert.ok(receipt && typeof receipt.status !== "undefined", "receipt required");
25
- return { success: receipt.status === 1 || receipt.status === "0x1", transactionHash: receipt.transactionHash };
26
- }
27
-
28
- export const riskRules = Object.freeze([
29
- { id: "explicit-recipient", field: "transaction.to", required: true },
30
- { id: "receipt-before-success", field: "receiptGate.required", equals: true },
31
- ]);
32
-
33
- export const tests = Object.freeze({
34
- command: "node --test test/oracle-pack-standard.test.mjs",
35
- covers: ["prepare-is-unsigned", "decode-requires-receipt", "metadata-is-untrusted"],
36
- });
37
-
38
- export default Object.freeze({ provider, prepare, decode, riskRules, tests });
@@ -1,70 +0,0 @@
1
- // Example: research a token end to end, honestly.
2
- //
3
- // Run: node examples/research-a-token.mjs
4
- // node examples/research-a-token.mjs base 0x<address>
5
- //
6
- // Demonstrates the discipline the desk is built around: read the identity off the
7
- // chain, find pools with real liquidity, and report UNKNOWN where a check could not
8
- // run rather than letting silence read as approval.
9
-
10
- import { registerBuiltinScanners } from "../src/scanner/chains.config.mjs";
11
- import { getScanner, listScanners, EVIDENCE, RISK } from "../src/scanner/contract.mjs";
12
-
13
- registerBuiltinScanners();
14
-
15
- const chainRef = process.argv[2] || "base";
16
- // Base USDC by default -- a token whose answers are easy to sanity-check.
17
- const token = process.argv[3] || "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
18
-
19
- const scanner =
20
- listScanners().find((s) => s.key === chainRef) || getScanner(Number(chainRef));
21
- if (!scanner) {
22
- console.error(`unknown chain "${chainRef}"`);
23
- process.exit(1);
24
- }
25
-
26
- console.log(`chain: ${scanner.name} (${scanner.chainId})`);
27
- console.log(`token: ${token}\n`);
28
-
29
- // 1. Identity from the CONTRACT, not a token list. A list can be stale or omit a
30
- // two-hour-old launch, and the on-chain answer is what governs a transfer.
31
- const meta = await scanner.resolveToken(token);
32
- if (meta.evidence !== EVIDENCE.LIVE) {
33
- console.log(`identity: ${meta.evidence} -- ${meta.warning ?? meta.error}`);
34
- console.log("stopping: without ERC-20 metadata there is nothing to price.");
35
- process.exit(0);
36
- }
37
- console.log(`identity: ${meta.symbol} (${meta.name}), ${meta.decimals} decimals`);
38
-
39
- // 2. Pools, ranked by liquidity. Depth is what determines your fill; the headline
40
- // price is a fiction for anything but the smallest clip.
41
- const pools = await scanner.resolvePools(token);
42
- console.log(`\npools: ${pools.evidence}`);
43
- if (pools.reason) console.log(` ${pools.reason}`);
44
- for (const p of pools.pools.slice(0, 5)) {
45
- const liq = p.liquidityUsd == null ? "unknown" : `$${Math.round(p.liquidityUsd).toLocaleString()}`;
46
- console.log(` ${p.dex.padEnd(14)} ${liq.padStart(14)} ${p.pair}`);
47
- }
48
-
49
- // 3. Structural risk. Read the verdict AND the individual checks -- an overall
50
- // UNKNOWN often hides several passes plus one unprovable item, and which item is
51
- // unprovable is the decision-relevant part.
52
- const risk = await scanner.scoreRisk(token);
53
- console.log(`\nrisk verdict: ${risk.verdict}`);
54
- for (const c of risk.checks) {
55
- console.log(` ${c.result.padEnd(8)} ${c.check.padEnd(16)} ${c.detail ?? ""}`);
56
- }
57
-
58
- // 4. The honest close. UNKNOWN is not PASS, and a buy path is not an exit path.
59
- console.log("");
60
- if (risk.verdict === RISK.FAIL) {
61
- console.log("FAIL: disqualifying finding above. Do not trade.");
62
- } else if (risk.verdict === RISK.UNKNOWN) {
63
- console.log(
64
- "UNKNOWN is not PASS. Structural checks looked fine, but sellability is\n" +
65
- "unproven without a verified router on this chain. Until a round-trip sell\n" +
66
- "simulation succeeds, treat this token as not exitable.",
67
- );
68
- } else {
69
- console.log(`${risk.verdict}: structural checks only -- still not a recommendation.`);
70
- }