@oracle-agent/oracle 0.10.0 → 0.12.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 (424) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +82 -91
  3. package/SECURITY.md +37 -12
  4. package/SETUP.md +207 -272
  5. package/dist/action-receipts.mjs +1 -0
  6. package/dist/action-semantics.mjs +1 -0
  7. package/dist/address-book.mjs +2 -0
  8. package/dist/bin/desk-server.mjs +14 -0
  9. package/dist/bin/oracle-data-mcp.mjs +8 -0
  10. package/dist/bin/oracle-init.mjs +24 -0
  11. package/dist/bin/oracle-public-server.mjs +5 -0
  12. package/dist/bin/oracle-route.mjs +22 -0
  13. package/dist/bin/oracle-scan.mjs +18 -0
  14. package/dist/bin/oracle-upgrade.mjs +21 -0
  15. package/dist/bin/oracle.mjs +68 -0
  16. package/dist/chains.mjs +1 -0
  17. package/dist/cli/commands/auth.mjs +16 -0
  18. package/dist/cli/commands/bootstrap.mjs +18 -0
  19. package/dist/cli/commands/chain.mjs +21 -0
  20. package/dist/cli/commands/chat.mjs +35 -0
  21. package/dist/cli/commands/credential.mjs +1 -0
  22. package/dist/cli/commands/data-mcp.mjs +2 -0
  23. package/dist/cli/commands/data.mjs +12 -0
  24. package/dist/cli/commands/doctor.mjs +5 -0
  25. package/dist/cli/commands/gate.mjs +13 -0
  26. package/dist/cli/commands/help.mjs +1 -0
  27. package/dist/cli/commands/init.mjs +3 -0
  28. package/dist/cli/commands/mcp.mjs +33 -0
  29. package/dist/cli/commands/model.mjs +44 -0
  30. package/dist/cli/commands/prepare.mjs +2 -0
  31. package/dist/cli/commands/public.mjs +3 -0
  32. package/dist/cli/commands/route.mjs +2 -0
  33. package/dist/cli/commands/runner.mjs +1 -0
  34. package/dist/cli/commands/scan.mjs +2 -0
  35. package/dist/cli/commands/setup.mjs +34 -0
  36. package/dist/cli/commands/sign.mjs +4 -0
  37. package/dist/cli/commands/signer.mjs +1 -0
  38. package/dist/cli/commands/upgrade.mjs +2 -0
  39. package/dist/cli/commands/vault.mjs +1 -0
  40. package/dist/cli/commands/version.mjs +2 -0
  41. package/dist/data/desk-data.mjs +12 -0
  42. package/dist/index.mjs +17 -0
  43. package/dist/nft-gas-war-guard.mjs +1 -0
  44. package/dist/onboarding/harness-configs.mjs +4 -0
  45. package/dist/portfolio-risk.mjs +1 -0
  46. package/dist/prepare-envelope.mjs +1 -0
  47. package/dist/public-control/policy-schema.mjs +1 -0
  48. package/dist/router/index.mjs +2 -0
  49. package/dist/scanner/index.mjs +4 -0
  50. package/dist/signals/index.mjs +1 -0
  51. package/dist/watch-preferences.mjs +1 -0
  52. package/package.json +27 -65
  53. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  54. package/public/oracle-splash/brand/aave.webp +0 -0
  55. package/public/oracle-splash/brand/aavev2.webp +0 -0
  56. package/public/oracle-splash/brand/aborean.webp +0 -0
  57. package/public/oracle-splash/brand/across.webp +0 -0
  58. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  59. package/public/oracle-splash/brand/afi.webp +0 -0
  60. package/public/oracle-splash/brand/arcus.webp +0 -0
  61. package/public/oracle-splash/brand/aster.webp +0 -0
  62. package/public/oracle-splash/brand/avant.webp +0 -0
  63. package/public/oracle-splash/brand/balancer.webp +0 -0
  64. package/public/oracle-splash/brand/beefy.webp +0 -0
  65. package/public/oracle-splash/brand/benqi.webp +0 -0
  66. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  67. package/public/oracle-splash/brand/bitfi.webp +0 -0
  68. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  69. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  70. package/public/oracle-splash/brand/camelot.webp +0 -0
  71. package/public/oracle-splash/brand/compound.webp +0 -0
  72. package/public/oracle-splash/brand/concrete.webp +0 -0
  73. package/public/oracle-splash/brand/cow.webp +0 -0
  74. package/public/oracle-splash/brand/curve.webp +0 -0
  75. package/public/oracle-splash/brand/derive.webp +0 -0
  76. package/public/oracle-splash/brand/dolomite.webp +0 -0
  77. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  78. package/public/oracle-splash/brand/ekubo.webp +0 -0
  79. package/public/oracle-splash/brand/ethena.webp +0 -0
  80. package/public/oracle-splash/brand/etherfi.webp +0 -0
  81. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  82. package/public/oracle-splash/brand/felix.webp +0 -0
  83. package/public/oracle-splash/brand/fluid.webp +0 -0
  84. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  85. package/public/oracle-splash/brand/folks.webp +0 -0
  86. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  87. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  88. package/public/oracle-splash/brand/gassss.webp +0 -0
  89. package/public/oracle-splash/brand/gmx.webp +0 -0
  90. package/public/oracle-splash/brand/harmonix.webp +0 -0
  91. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  92. package/public/oracle-splash/brand/hlp.webp +0 -0
  93. package/public/oracle-splash/brand/hop.webp +0 -0
  94. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  95. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  96. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  97. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  98. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  99. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  100. package/public/oracle-splash/brand/hypha.webp +0 -0
  101. package/public/oracle-splash/brand/joedex.webp +0 -0
  102. package/public/oracle-splash/brand/jupiter.webp +0 -0
  103. package/public/oracle-splash/brand/kelp.webp +0 -0
  104. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  105. package/public/oracle-splash/brand/kmhype.webp +0 -0
  106. package/public/oracle-splash/brand/kona.webp +0 -0
  107. package/public/oracle-splash/brand/konalend.webp +0 -0
  108. package/public/oracle-splash/brand/lfj.webp +0 -0
  109. package/public/oracle-splash/brand/lido.webp +0 -0
  110. package/public/oracle-splash/brand/lifi.webp +0 -0
  111. package/public/oracle-splash/brand/lighter.webp +0 -0
  112. package/public/oracle-splash/brand/lista.webp +0 -0
  113. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  114. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  115. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  116. package/public/oracle-splash/brand/magiceden.webp +0 -0
  117. package/public/oracle-splash/brand/mempool.png +0 -0
  118. package/public/oracle-splash/brand/meteora.webp +0 -0
  119. package/public/oracle-splash/brand/morpho.webp +0 -0
  120. package/public/oracle-splash/brand/myriad.webp +0 -0
  121. package/public/oracle-splash/brand/noxa.webp +0 -0
  122. package/public/oracle-splash/brand/odos.webp +0 -0
  123. package/public/oracle-splash/brand/oneinch.webp +0 -0
  124. package/public/oracle-splash/brand/openbook.webp +0 -0
  125. package/public/oracle-splash/brand/opensea.webp +0 -0
  126. package/public/oracle-splash/brand/orca.webp +0 -0
  127. package/public/oracle-splash/brand/ordinals.png +0 -0
  128. package/public/oracle-splash/brand/ostium.webp +0 -0
  129. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  130. package/public/oracle-splash/brand/pendle.webp +0 -0
  131. package/public/oracle-splash/brand/perena.webp +0 -0
  132. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  133. package/public/oracle-splash/brand/phoenix.webp +0 -0
  134. package/public/oracle-splash/brand/polymarket.webp +0 -0
  135. package/public/oracle-splash/brand/polynomial.webp +0 -0
  136. package/public/oracle-splash/brand/projectx.webp +0 -0
  137. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  138. package/public/oracle-splash/brand/quickswap.webp +0 -0
  139. package/public/oracle-splash/brand/rain.webp +0 -0
  140. package/public/oracle-splash/brand/raydium.webp +0 -0
  141. package/public/oracle-splash/brand/relay.webp +0 -0
  142. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  143. package/public/oracle-splash/brand/saber.webp +0 -0
  144. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  145. package/public/oracle-splash/brand/sanctum.webp +0 -0
  146. package/public/oracle-splash/brand/satflow.png +0 -0
  147. package/public/oracle-splash/brand/sierra.webp +0 -0
  148. package/public/oracle-splash/brand/sky.webp +0 -0
  149. package/public/oracle-splash/brand/solv.webp +0 -0
  150. package/public/oracle-splash/brand/spark.webp +0 -0
  151. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  152. package/public/oracle-splash/brand/sphere.webp +0 -0
  153. package/public/oracle-splash/brand/ssv.webp +0 -0
  154. package/public/oracle-splash/brand/stabble.webp +0 -0
  155. package/public/oracle-splash/brand/stableswap.webp +0 -0
  156. package/public/oracle-splash/brand/stakewise.webp +0 -0
  157. package/public/oracle-splash/brand/stargate.webp +0 -0
  158. package/public/oracle-splash/brand/sthype.webp +0 -0
  159. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  160. package/public/oracle-splash/brand/unisat.png +0 -0
  161. package/public/oracle-splash/brand/uniswap.webp +0 -0
  162. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  163. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  164. package/public/oracle-splash/brand/unit.webp +0 -0
  165. package/public/oracle-splash/brand/velodrome.webp +0 -0
  166. package/public/oracle-splash/brand/velora.webp +0 -0
  167. package/public/oracle-splash/brand/venus.webp +0 -0
  168. package/public/oracle-splash/brand/wbeth.webp +0 -0
  169. package/public/oracle-splash/brand/xsy.webp +0 -0
  170. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  171. package/public/oracle-splash/brand/zerobase.webp +0 -0
  172. package/public/oracle-splash/brand/zerox.webp +0 -0
  173. package/public/oracle-splash/index.html +246 -169
  174. package/CONTRIBUTING.md +0 -98
  175. package/bin/desk-server.mjs +0 -440
  176. package/bin/oracle-data-mcp.mjs +0 -1010
  177. package/bin/oracle-init.mjs +0 -496
  178. package/bin/oracle-public-server.mjs +0 -36
  179. package/bin/oracle-route.mjs +0 -254
  180. package/bin/oracle-scan.mjs +0 -192
  181. package/bin/oracle-upgrade.mjs +0 -42
  182. package/bin/oracle.mjs +0 -33
  183. package/docs/adding-a-chain.md +0 -229
  184. package/docs/architecture.md +0 -136
  185. package/docs/cli.md +0 -47
  186. package/docs/connectors.md +0 -13
  187. package/docs/oracle-pack-standard.md +0 -29
  188. package/docs/profiles.md +0 -154
  189. package/examples/add-a-chain.mjs +0 -65
  190. package/examples/oracle-pack-template.mjs +0 -38
  191. package/examples/research-a-token.mjs +0 -70
  192. package/plugins/oracle-owner-gate/__init__.py +0 -227
  193. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  194. package/profiles/_template/SOUL.md +0 -54
  195. package/profiles/_template/profile.json +0 -22
  196. package/profiles/bitcoin-agent/SOUL.md +0 -31
  197. package/profiles/bitcoin-agent/profile.json +0 -32
  198. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  199. package/profiles/hyperliquid-agent/profile.json +0 -37
  200. package/profiles/oracle/SOUL.md +0 -107
  201. package/profiles/oracle/profile.json +0 -39
  202. package/profiles/polymarket-agent/SOUL.md +0 -35
  203. package/profiles/polymarket-agent/profile.json +0 -34
  204. package/profiles/profile.schema.json +0 -90
  205. package/profiles/protocol-builder/SOUL.md +0 -57
  206. package/profiles/protocol-builder/profile.json +0 -39
  207. package/profiles/robinhood-agent/SOUL.md +0 -53
  208. package/profiles/robinhood-agent/profile.json +0 -40
  209. package/profiles/solana-agent/SOUL.md +0 -37
  210. package/profiles/solana-agent/profile.json +0 -37
  211. package/profiles/stable-agent/SOUL.md +0 -43
  212. package/profiles/stable-agent/profile.json +0 -37
  213. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  214. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  215. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  216. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  217. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  218. package/scripts/adversarial-bench.mjs +0 -114
  219. package/scripts/build-inscription.py +0 -230
  220. package/scripts/check-doc-drift.mjs +0 -112
  221. package/scripts/check-test-count.mjs +0 -105
  222. package/scripts/e2e-hl-markets.mjs +0 -21
  223. package/scripts/e2e-hl-perps.mjs +0 -48
  224. package/scripts/e2e-hypercore-staking.mjs +0 -128
  225. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  226. package/scripts/protocol-template-gate.mjs +0 -15
  227. package/scripts/public-api-scan.mjs +0 -23
  228. package/scripts/secret-scan.mjs +0 -181
  229. package/scripts/verify-v3-venues.mjs +0 -192
  230. package/skills/balance/SKILL.md +0 -176
  231. package/skills/oracle-action-semantics/SKILL.md +0 -40
  232. package/skills/oracle-best-execution/SKILL.md +0 -127
  233. package/skills/oracle-bitcoin/SKILL.md +0 -53
  234. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  235. package/skills/oracle-chat/SKILL.md +0 -61
  236. package/skills/oracle-chat/chain.SKILL.md +0 -31
  237. package/skills/oracle-chat/setup.SKILL.md +0 -37
  238. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  239. package/skills/oracle-contract-research/SKILL.md +0 -55
  240. package/skills/oracle-desk/SKILL.md +0 -58
  241. package/skills/oracle-dex-launch/SKILL.md +0 -38
  242. package/skills/oracle-grants/SKILL.md +0 -69
  243. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  244. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  245. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  246. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  247. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  248. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  249. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  250. package/skills/oracle-polymarket/SKILL.md +0 -60
  251. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  252. package/skills/oracle-protocol-security/SKILL.md +0 -60
  253. package/skills/oracle-public-product/SKILL.md +0 -44
  254. package/skills/oracle-receipts/SKILL.md +0 -52
  255. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  256. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  257. package/skills/oracle-solana/SKILL.md +0 -65
  258. package/skills/oracle-solana-nft/SKILL.md +0 -54
  259. package/skills/oracle-token-research/SKILL.md +0 -67
  260. package/skins/oracle.yaml +0 -56
  261. package/src/action-receipts.mjs +0 -168
  262. package/src/action-semantics.mjs +0 -62
  263. package/src/address-book.mjs +0 -208
  264. package/src/agent-auth.mjs +0 -206
  265. package/src/approval-guard.mjs +0 -282
  266. package/src/attestation-secret.mjs +0 -88
  267. package/src/audit-log.mjs +0 -196
  268. package/src/auth/oauth.mjs +0 -672
  269. package/src/auto-slippage.mjs +0 -378
  270. package/src/capability-posture.mjs +0 -125
  271. package/src/chains.mjs +0 -62
  272. package/src/cli/chain-catalog.mjs +0 -215
  273. package/src/cli/chain-state.mjs +0 -74
  274. package/src/cli/commands/auth.mjs +0 -193
  275. package/src/cli/commands/bootstrap.mjs +0 -87
  276. package/src/cli/commands/chain.mjs +0 -143
  277. package/src/cli/commands/chat.mjs +0 -434
  278. package/src/cli/commands/credential.mjs +0 -9
  279. package/src/cli/commands/data-mcp.mjs +0 -18
  280. package/src/cli/commands/data.mjs +0 -73
  281. package/src/cli/commands/doctor.mjs +0 -126
  282. package/src/cli/commands/help.mjs +0 -7
  283. package/src/cli/commands/init.mjs +0 -27
  284. package/src/cli/commands/mcp.mjs +0 -142
  285. package/src/cli/commands/model.mjs +0 -99
  286. package/src/cli/commands/prepare.mjs +0 -12
  287. package/src/cli/commands/public.mjs +0 -20
  288. package/src/cli/commands/route.mjs +0 -12
  289. package/src/cli/commands/runner.mjs +0 -9
  290. package/src/cli/commands/scan.mjs +0 -12
  291. package/src/cli/commands/setup.mjs +0 -275
  292. package/src/cli/commands/sign.mjs +0 -21
  293. package/src/cli/commands/signer.mjs +0 -9
  294. package/src/cli/commands/upgrade.mjs +0 -12
  295. package/src/cli/commands/vault.mjs +0 -9
  296. package/src/cli/commands/version.mjs +0 -22
  297. package/src/cli/first-run.mjs +0 -23
  298. package/src/cli/kernel.mjs +0 -239
  299. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  300. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  301. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  302. package/src/cli/mcp-targets/codex.mjs +0 -41
  303. package/src/cli/mcp-targets/shared.mjs +0 -61
  304. package/src/cli/messaging-platforms.mjs +0 -209
  305. package/src/cli/model-config.mjs +0 -70
  306. package/src/cli/operator-dispatch.mjs +0 -258
  307. package/src/cli/oracle-harness.py +0 -415
  308. package/src/cli/paths.mjs +0 -83
  309. package/src/cli/runtime.mjs +0 -351
  310. package/src/cli/setup-state.mjs +0 -168
  311. package/src/cli/spawn-child.mjs +0 -43
  312. package/src/data/catalog.mjs +0 -554
  313. package/src/data/desk-data.mjs +0 -683
  314. package/src/data/http.mjs +0 -253
  315. package/src/data/provider-endpoint.mjs +0 -94
  316. package/src/data/providers/aerodrome.mjs +0 -245
  317. package/src/data/providers/balancer.mjs +0 -209
  318. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  319. package/src/data/providers/bitcoin-meta.mjs +0 -378
  320. package/src/data/providers/blockscout.mjs +0 -14
  321. package/src/data/providers/bridges.mjs +0 -242
  322. package/src/data/providers/cowswap.mjs +0 -415
  323. package/src/data/providers/curve.mjs +0 -201
  324. package/src/data/providers/defillama.mjs +0 -88
  325. package/src/data/providers/dexscreener.mjs +0 -43
  326. package/src/data/providers/evm-rpc.mjs +0 -222
  327. package/src/data/providers/geckoterminal.mjs +0 -34
  328. package/src/data/providers/gmx.mjs +0 -496
  329. package/src/data/providers/hl-assets.mjs +0 -165
  330. package/src/data/providers/hl-info.mjs +0 -108
  331. package/src/data/providers/hl-markets.mjs +0 -210
  332. package/src/data/providers/hl-outcome.mjs +0 -61
  333. package/src/data/providers/hl-perps.mjs +0 -387
  334. package/src/data/providers/hl-staking.mjs +0 -353
  335. package/src/data/providers/hl-ws.mjs +0 -119
  336. package/src/data/providers/hyperevm-dex.mjs +0 -49
  337. package/src/data/providers/jupiter.mjs +0 -183
  338. package/src/data/providers/lifi.mjs +0 -151
  339. package/src/data/providers/magiceden-sol.mjs +0 -393
  340. package/src/data/providers/morpho.mjs +0 -173
  341. package/src/data/providers/nft-gallery.mjs +0 -163
  342. package/src/data/providers/nft-portfolio.mjs +0 -494
  343. package/src/data/providers/odos.mjs +0 -156
  344. package/src/data/providers/oneinch.mjs +0 -174
  345. package/src/data/providers/opensea-multichain.mjs +0 -136
  346. package/src/data/providers/opensea-nft.mjs +0 -371
  347. package/src/data/providers/paraswap.mjs +0 -118
  348. package/src/data/providers/pendle.mjs +0 -187
  349. package/src/data/providers/poly-clob.mjs +0 -283
  350. package/src/data/providers/poly-public.mjs +0 -96
  351. package/src/data/providers/poly-ws.mjs +0 -103
  352. package/src/data/providers/portfolio-history.mjs +0 -394
  353. package/src/data/providers/portfolio.mjs +0 -594
  354. package/src/data/providers/rfq.mjs +0 -15
  355. package/src/data/providers/rh-agent.mjs +0 -59
  356. package/src/data/providers/satflow.mjs +0 -338
  357. package/src/data/providers/solana-rpc.mjs +0 -197
  358. package/src/data/providers/uniswap-v3.mjs +0 -320
  359. package/src/data/providers/zerox.mjs +0 -167
  360. package/src/data/public-api-scan.mjs +0 -61
  361. package/src/data/quote-placeholder.mjs +0 -31
  362. package/src/exact-integer.mjs +0 -72
  363. package/src/exec-policy.mjs +0 -455
  364. package/src/flags.mjs +0 -15
  365. package/src/fresh-window.mjs +0 -76
  366. package/src/gmx-attestation.mjs +0 -176
  367. package/src/index.mjs +0 -100
  368. package/src/nft-gas-war-guard.mjs +0 -139
  369. package/src/onboarding/agent-keys.mjs +0 -161
  370. package/src/onboarding/harness-configs.mjs +0 -102
  371. package/src/onboarding/index.mjs +0 -18
  372. package/src/onboarding/tiers.mjs +0 -139
  373. package/src/oracle-env.mjs +0 -47
  374. package/src/portfolio-risk.mjs +0 -170
  375. package/src/prepare-envelope.mjs +0 -186
  376. package/src/profile-upgrade.mjs +0 -277
  377. package/src/protocol-execution.mjs +0 -84
  378. package/src/protocol-templates/gate.mjs +0 -179
  379. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  380. package/src/public-api/buzz-integration.mjs +0 -256
  381. package/src/public-api/connect-agent.mjs +0 -416
  382. package/src/public-api/grants.mjs +0 -142
  383. package/src/public-api/http.mjs +0 -389
  384. package/src/public-control/aa-adapter.mjs +0 -402
  385. package/src/public-control/build-registry.mjs +0 -227
  386. package/src/public-control/bundler-client.mjs +0 -357
  387. package/src/public-control/grant-indexer.mjs +0 -296
  388. package/src/public-control/policy-render.mjs +0 -69
  389. package/src/public-control/policy-schema.mjs +0 -318
  390. package/src/public-control/runtime-config.mjs +0 -275
  391. package/src/public-control/session-key-model.mjs +0 -374
  392. package/src/public-control/session-orchestrator.mjs +0 -412
  393. package/src/rfq/intent.mjs +0 -180
  394. package/src/rfq/sources.mjs +0 -181
  395. package/src/route-attestation.mjs +0 -132
  396. package/src/router/best-execution.mjs +0 -326
  397. package/src/router/index.mjs +0 -226
  398. package/src/router/prepare-bridge.mjs +0 -289
  399. package/src/router/prepare-route.mjs +0 -381
  400. package/src/router/proposal.mjs +0 -311
  401. package/src/router/risk-classifier.mjs +0 -119
  402. package/src/router/route-sources.mjs +0 -329
  403. package/src/scanner/chains.config.mjs +0 -430
  404. package/src/scanner/contract.mjs +0 -270
  405. package/src/scanner/evm-scanner.mjs +0 -394
  406. package/src/scanner/index.mjs +0 -9
  407. package/src/scanner/v2-venue.mjs +0 -335
  408. package/src/scanner/v3-venue.mjs +0 -290
  409. package/src/scopes.mjs +0 -44
  410. package/src/sell-simulation.mjs +0 -167
  411. package/src/signals/engine.mjs +0 -146
  412. package/src/signals/index.mjs +0 -1
  413. package/src/token-transfer-guard.mjs +0 -188
  414. package/src/tui/app.mjs +0 -438
  415. package/src/tui/backend.mjs +0 -145
  416. package/src/tui/format.mjs +0 -272
  417. package/src/tui/gateway-client.mjs +0 -177
  418. package/src/tui/input.mjs +0 -501
  419. package/src/tui/renderer.mjs +0 -443
  420. package/src/tui/standalone-client.mjs +0 -666
  421. package/src/tui/theme.mjs +0 -81
  422. package/src/vault-attestation.mjs +0 -146
  423. package/src/venues.mjs +0 -206
  424. package/src/watch-preferences.mjs +0 -85
@@ -1,320 +0,0 @@
1
- // Uniswap V3 QuoterV2 — exact-input quotes via eth_call (no API key).
2
- // Chains: Ethereum, Base, Arbitrum. Read-only; never signs or swaps.
3
-
4
- import { Interface, getAddress, isAddress } from "ethers";
5
- import { rpcCall } from "./evm-rpc.mjs";
6
- import { attachAutoSlippage, bindAutoSlippageGuardToCall } from "../../auto-slippage.mjs";
7
- import { stampPrepared } from "../../prepare-envelope.mjs";
8
-
9
- /** @type {Record<number, { quoter: string, weth: string, usdc: string, name: string }>} */
10
- export const UNI_V3_CHAINS = {
11
- 1: {
12
- name: "ethereum",
13
- quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
14
- router: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",
15
- weth: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
16
- usdc: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
17
- },
18
- 8453: {
19
- name: "base",
20
- quoter: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
21
- router: "0x2626664c2603336E57B271c5C0b26F421741e481",
22
- weth: "0x4200000000000000000000000000000000000006",
23
- usdc: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
24
- },
25
- 42161: {
26
- name: "arbitrum",
27
- quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
28
- router: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",
29
- weth: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
30
- usdc: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
31
- },
32
- // Robinhood Chain. Addresses mirror rhbot server/swap.js SWAP_CONFIG (the vetted
33
- // source) and were re-proved on the live chain before being added here:
34
- // eth_chainId == 4663, eth_getCode non-empty for every address below, and a real
35
- // quoteExactInputSingle returned 1 WETH -> 1866.58 USDG at fee 100 (2026-07-31).
36
- //
37
- // Why this entry matters: LI.FI / ParaSwap / CoW do not index 4663, so the router's
38
- // aggregator-only candidate list returned "no usable route" for every RH swap. The
39
- // on-chain QuoterV2 is the only source that can price this chain. `usdc` is USDG
40
- // (Global Dollar, 6-dec) — the stable quote RH pools actually use.
41
- 4663: {
42
- name: "robinhood",
43
- quoter: "0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",
44
- router: "0xcaf681a66d020601342297493863e78c959e5cb2",
45
- weth: "0x0bd7d308f8e1639fab988df18a8011f41eacad73",
46
- usdc: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
47
- },
48
- };
49
-
50
- export const UNI_V3_FEE_TIERS = [100, 500, 3000, 10000];
51
-
52
- const QUOTER_IFACE = new Interface([
53
- "function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)",
54
- "function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)",
55
- ]);
56
-
57
- const ROUTER_IFACE = new Interface([
58
- "function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)",
59
- "function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)",
60
- ]);
61
-
62
- const NATIVE = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
63
- const ZERO = "0x0000000000000000000000000000000000000000";
64
-
65
- function chainMeta(chainId) {
66
- const id = Number(chainId);
67
- const m = UNI_V3_CHAINS[id];
68
- if (!m) {
69
- throw new Error(
70
- `uniswap-v3: unsupported chainId ${chainId} (supported: ${Object.keys(UNI_V3_CHAINS).join(", ")})`
71
- );
72
- }
73
- return { chainId: id, ...m };
74
- }
75
-
76
- function normalizeToken(addr, chainId) {
77
- const meta = UNI_V3_CHAINS[Number(chainId)];
78
- if (!addr || addr === NATIVE || addr === ZERO || /^eth$/i.test(String(addr))) {
79
- return getAddress(meta.weth);
80
- }
81
- const s = String(addr);
82
- if (/^weth$/i.test(s)) return getAddress(meta.weth);
83
- if (/^usdc$/i.test(s)) return getAddress(meta.usdc);
84
- if (!isAddress(s)) throw new Error(`invalid token address: ${addr}`);
85
- return getAddress(s);
86
- }
87
-
88
- function encodePath(tokens, fees) {
89
- // path = token0 (20) + fee (3) + token1 (20) [+ fee + token2 ...]
90
- if (tokens.length !== fees.length + 1) {
91
- throw new Error("path: fees.length must be tokens.length - 1");
92
- }
93
- let hex = "0x";
94
- for (let i = 0; i < fees.length; i++) {
95
- hex += tokens[i].slice(2).toLowerCase();
96
- hex += Number(fees[i]).toString(16).padStart(6, "0");
97
- }
98
- hex += tokens[tokens.length - 1].slice(2).toLowerCase();
99
- return hex;
100
- }
101
-
102
- /**
103
- * Quote exact-input single hop via QuoterV2.
104
- * @param {object} q
105
- * @param {number} q.chainId
106
- * @param {string} [q.tokenIn] default WETH
107
- * @param {string} [q.tokenOut] default USDC
108
- * @param {string|number|bigint} q.amountIn raw wei/base units
109
- * @param {number} [q.fee] 100|500|3000|10000 — if omitted, tries tiers best-out
110
- */
111
- export async function uniV3QuoteExactIn(q = {}, opts = {}) {
112
- const { chainId, quoter, router } = chainMeta(q.chainId ?? 8453);
113
- const tokenIn = normalizeToken(q.tokenIn || "WETH", chainId);
114
- const tokenOut = normalizeToken(q.tokenOut || UNI_V3_CHAINS[chainId].usdc, chainId);
115
- const amountIn = BigInt(q.amountIn ?? 0);
116
- if (amountIn <= 0n) throw new Error("amountIn required (raw base units)");
117
-
118
- const fees =
119
- q.fee != null
120
- ? [Number(q.fee)]
121
- : q.tryFees === false
122
- ? [3000]
123
- : [...UNI_V3_FEE_TIERS];
124
-
125
- const results = [];
126
- let best = null;
127
-
128
- for (const fee of fees) {
129
- const data = QUOTER_IFACE.encodeFunctionData("quoteExactInputSingle", [
130
- {
131
- tokenIn,
132
- tokenOut,
133
- amountIn,
134
- fee,
135
- sqrtPriceLimitX96: 0n,
136
- },
137
- ]);
138
- try {
139
- const raw = await rpcCall(chainId, "eth_call", [{ to: quoter, data }, "latest"], opts);
140
- if (!raw || raw === "0x") {
141
- results.push({ fee, ok: false, error: "empty result" });
142
- continue;
143
- }
144
- const decoded = QUOTER_IFACE.decodeFunctionResult("quoteExactInputSingle", raw);
145
- const row = {
146
- fee,
147
- ok: true,
148
- amountOut: decoded[0].toString(),
149
- sqrtPriceX96After: decoded[1].toString(),
150
- initializedTicksCrossed: Number(decoded[2]),
151
- gasEstimate: decoded[3].toString(),
152
- };
153
- results.push(row);
154
- if (!best || BigInt(row.amountOut) > BigInt(best.amountOut)) best = row;
155
- } catch (e) {
156
- results.push({ fee, ok: false, error: String(e.message || e).slice(0, 160) });
157
- }
158
- }
159
-
160
- if (!best) {
161
- const err = results.map((r) => `${r.fee}:${r.error || "fail"}`).join("; ");
162
- throw new Error(`uniswap-v3 quote failed chain=${chainId}: ${err}`);
163
- }
164
-
165
- return attachAutoSlippage({
166
- venue: "uniswap-v3",
167
- chainId,
168
- chain: UNI_V3_CHAINS[chainId].name,
169
- quoter,
170
- tokenIn,
171
- tokenOut,
172
- amountIn: amountIn.toString(),
173
- fee: best.fee,
174
- amountOut: best.amountOut,
175
- gasEstimate: best.gasEstimate,
176
- sqrtPriceX96After: best.sqrtPriceX96After,
177
- initializedTicksCrossed: best.initializedTicksCrossed,
178
- triedFees: results,
179
- best: true,
180
- }, {
181
- chainId,
182
- venue: router,
183
- amountOut: best.amountOut,
184
- liquidityUsd: q.liquidityUsd,
185
- priceChange5m: q.priceChange5m,
186
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
187
- });
188
- }
189
-
190
- /**
191
- * Multi-hop exact input. pathTokens + pathFees.
192
- * e.g. tokens [WETH, USDC], fees [500]
193
- */
194
- export async function uniV3QuoteExactInPath(q = {}, opts = {}) {
195
- const { chainId, quoter, router } = chainMeta(q.chainId ?? 8453);
196
- const tokens = (q.tokens || []).map((t) => normalizeToken(t, chainId));
197
- const fees = (q.fees || []).map(Number);
198
- if (tokens.length < 2) throw new Error("tokens[] need at least 2 addresses");
199
- const amountIn = BigInt(q.amountIn ?? 0);
200
- if (amountIn <= 0n) throw new Error("amountIn required");
201
-
202
- const path = encodePath(tokens, fees);
203
- const data = QUOTER_IFACE.encodeFunctionData("quoteExactInput", [path, amountIn]);
204
- const raw = await rpcCall(chainId, "eth_call", [{ to: quoter, data }, "latest"], opts);
205
- const decoded = QUOTER_IFACE.decodeFunctionResult("quoteExactInput", raw);
206
-
207
- return attachAutoSlippage({
208
- venue: "uniswap-v3",
209
- chainId,
210
- chain: UNI_V3_CHAINS[chainId].name,
211
- quoter,
212
- tokens,
213
- fees,
214
- path,
215
- amountIn: amountIn.toString(),
216
- amountOut: decoded[0].toString(),
217
- gasEstimate: decoded[3].toString(),
218
- }, {
219
- chainId,
220
- venue: router,
221
- amountOut: decoded[0].toString(),
222
- liquidityUsd: q.liquidityUsd,
223
- priceChange5m: q.priceChange5m,
224
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
225
- });
226
- }
227
-
228
- /** Convenience: WETH → USDC for amountIn wei (default 0.001 ETH). */
229
- export async function uniV3EthUsdc(q = {}, opts = {}) {
230
- const chainId = Number(q.chainId ?? 8453);
231
- const amountIn = q.amountIn ?? "1000000000000000"; // 0.001 ether
232
- const quote = await uniV3QuoteExactIn(
233
- {
234
- chainId,
235
- tokenIn: UNI_V3_CHAINS[chainId].weth,
236
- tokenOut: UNI_V3_CHAINS[chainId].usdc,
237
- amountIn,
238
- fee: q.fee,
239
- },
240
- opts
241
- );
242
- const usdc = Number(quote.amountOut) / 1e6;
243
- return { ...quote, amountOutUsdc: usdc, pair: "WETH/USDC" };
244
- }
245
-
246
- export async function uniV3PrepareExactIn(q = {}, opts = {}) {
247
- const chainId = Number(q.chainId ?? 8453);
248
- const meta = chainMeta(chainId);
249
- const recipient = getAddress(q.recipient);
250
- const inputRaw = String(q.tokenIn || "WETH");
251
- const nativeInput = !q.tokenIn || inputRaw === NATIVE || inputRaw === ZERO || /^eth$/i.test(inputRaw);
252
- const quote = await uniV3QuoteExactIn(q, opts);
253
- const exact = ROUTER_IFACE.encodeFunctionData("exactInputSingle", [{
254
- tokenIn: quote.tokenIn,
255
- tokenOut: quote.tokenOut,
256
- fee: quote.fee,
257
- recipient,
258
- amountIn: BigInt(quote.amountIn),
259
- amountOutMinimum: BigInt(quote.amountOutMinimum),
260
- sqrtPriceLimitX96: 0n,
261
- }]);
262
- const deadlineWindow = Math.min(600, Math.max(30, Number(q.deadlineSeconds ?? 300)));
263
- const nowSeconds = Number(opts.nowSeconds ?? Math.floor(Date.now() / 1000));
264
- const deadline = nowSeconds + deadlineWindow;
265
- const data = ROUTER_IFACE.encodeFunctionData("multicall", [deadline, [exact]]);
266
- return stampPrepared({
267
- provider: "uniswap-v3",
268
- calldataReady: true,
269
- // NOT executable authority. The bytes are assembled but nothing is signed:
270
- // the user's wallet is still the only thing that can authorize this. The
271
- // previous `executionReady: true` read as "cleared to execute" and trained
272
- // agents to treat a quote as permission.
273
- requiresUserSignature: true,
274
- signingReady: false,
275
- broadcastReady: false,
276
- chainId,
277
- deadline,
278
- quote,
279
- autoSlippage: quote.autoSlippage,
280
- requiresApproval: nativeInput ? null : {
281
- token: quote.tokenIn,
282
- spender: meta.router,
283
- amount: quote.amountIn,
284
- },
285
- transaction: {
286
- chainId,
287
- from: recipient,
288
- to: meta.router,
289
- data,
290
- value: nativeInput ? quote.amountIn : "0",
291
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: meta.router, data }),
292
- },
293
- }, { provider: "uniswap-v3", kind: "univ3-swap-tx" });
294
- }
295
-
296
- export async function uniV3Health(opts = {}) {
297
- const chainId = Number(opts.chainId ?? 8453);
298
- try {
299
- const q = await uniV3EthUsdc({ chainId, amountIn: "1000000000000000" }, opts);
300
- return {
301
- ok: true,
302
- chainId,
303
- fee: q.fee,
304
- amountOutUsdc: q.amountOutUsdc,
305
- midPxHint: q.amountOutUsdc / 0.001,
306
- };
307
- } catch (e) {
308
- return { ok: false, chainId, error: String(e.message || e).slice(0, 200) };
309
- }
310
- }
311
-
312
- export async function uniV3Chains() {
313
- return Object.entries(UNI_V3_CHAINS).map(([id, m]) => ({
314
- chainId: Number(id),
315
- name: m.name,
316
- quoter: m.quoter,
317
- weth: m.weth,
318
- usdc: m.usdc,
319
- }));
320
- }
@@ -1,167 +0,0 @@
1
- // 0x Swap API v2 — price/quote. Requires ZEROX_API_KEY (or 0X_API_KEY).
2
-
3
- import { httpJson } from "../http.mjs";
4
- import { attachAutoSlippage, bindAutoSlippageGuardToCall, resolveAutoSlippage } from "../../auto-slippage.mjs";
5
- import { resolveProviderEndpoint, credentialedHeaders } from "../provider-endpoint.mjs";
6
- import { stampPrepared } from "../../prepare-envelope.mjs";
7
-
8
- export const ZEROX_API = "https://api.0x.org";
9
-
10
- function endpoint(opts = {}) {
11
- return resolveProviderEndpoint({
12
- provider: "zerox",
13
- defaultUrl: ZEROX_API,
14
- hosts: ["api.0x.org"],
15
- url: opts.baseUrl || process.env.ZEROX_API_URL,
16
- });
17
- }
18
-
19
- function base(opts = {}) {
20
- return endpoint(opts).baseUrl;
21
- }
22
-
23
- function apiKey(opts = {}) {
24
- return (
25
- opts.apiKey ||
26
- process.env.ZEROX_API_KEY ||
27
- process.env.OX_API_KEY ||
28
- process.env["0X_API_KEY"] ||
29
- ""
30
- );
31
- }
32
-
33
- function headers(opts = {}) {
34
- return credentialedHeaders(
35
- { "0x-version": "v2", accept: "application/json" },
36
- { "0x-api-key": apiKey(opts) },
37
- endpoint(opts).trusted
38
- );
39
- }
40
-
41
- export async function zeroxHealth(opts = {}) {
42
- if (!apiKey(opts)) {
43
- return { ok: false, configured: false, error: "ZEROX_API_KEY not set" };
44
- }
45
- try {
46
- const q = await zeroxPrice(
47
- {
48
- chainId: 8453,
49
- sellToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
50
- buyToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
51
- sellAmount: "1000000000000000",
52
- },
53
- opts
54
- );
55
- return { ok: true, configured: true, buyAmount: q.buyAmount || q.grossBuyAmount };
56
- } catch (e) {
57
- return { ok: false, configured: true, error: String(e.message || e).slice(0, 160) };
58
- }
59
- }
60
-
61
- /** Indicative price (no firm quote). */
62
- export async function zeroxPrice(q = {}, opts = {}) {
63
- if (!apiKey(opts)) throw new Error("ZEROX_API_KEY required for 0x");
64
- const {
65
- chainId = 8453,
66
- sellToken,
67
- buyToken,
68
- sellAmount,
69
- taker,
70
- } = q;
71
- if (!sellToken || !buyToken || !sellAmount) {
72
- throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");
73
- }
74
- const params = new URLSearchParams({
75
- chainId: String(chainId),
76
- sellToken,
77
- buyToken,
78
- sellAmount: String(sellAmount),
79
- });
80
- if (taker) params.set("taker", taker);
81
- return httpJson(`${base(opts)}/swap/allowance-holder/price?${params}`, {
82
- headers: headers(opts),
83
- fetchImpl: opts.fetchImpl,
84
- timeoutMs: opts.timeoutMs ?? 15_000,
85
- });
86
- }
87
-
88
- /** Firm quote (may include transaction). */
89
- export async function zeroxQuote(q = {}, opts = {}) {
90
- if (!apiKey(opts)) throw new Error("ZEROX_API_KEY required for 0x");
91
- const {
92
- chainId = 8453,
93
- sellToken,
94
- buyToken,
95
- sellAmount,
96
- taker,
97
- } = q;
98
- if (!sellToken || !buyToken || !sellAmount) {
99
- throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");
100
- }
101
- const selected = resolveAutoSlippage({
102
- liquidityUsd: q.liquidityUsd,
103
- priceChange5m: q.priceChange5m,
104
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
105
- });
106
- if (!selected.executable) {
107
- throw new Error(`0x: route requires ${selected.requiredBps} bps above cap ${selected.capBps}`);
108
- }
109
- const params = new URLSearchParams({
110
- chainId: String(chainId),
111
- sellToken,
112
- buyToken,
113
- sellAmount: String(sellAmount),
114
- slippageBps: String(selected.selectedBps),
115
- });
116
- if (taker) params.set("taker", taker);
117
- const result = await httpJson(`${base(opts)}/swap/allowance-holder/quote?${params}`, {
118
- headers: headers(opts),
119
- fetchImpl: opts.fetchImpl,
120
- timeoutMs: opts.timeoutMs ?? 15_000,
121
- });
122
- const amountOut = result?.buyAmount || result?.grossBuyAmount;
123
- if (!amountOut) return { ...result, autoSlippagePolicy: selected };
124
- return attachAutoSlippage(result, {
125
- chainId,
126
- venue: result?.transaction?.to || result?.to || "0x",
127
- amountOut,
128
- liquidityUsd: q.liquidityUsd,
129
- priceChange5m: q.priceChange5m,
130
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
131
- });
132
- }
133
-
134
- export async function zeroxPrepare(q = {}, opts = {}) {
135
- if (!q.taker) throw new Error("0x: taker required for executable prepare");
136
- const quote = await zeroxQuote(q, opts);
137
- const tx = quote?.transaction;
138
- if (!tx?.to || !tx?.data) throw new Error("0x: firm quote returned no transaction");
139
- const chainId = Number(q.chainId ?? 8453);
140
- const spender = quote?.issues?.allowance?.spender || quote?.allowanceTarget;
141
- return stampPrepared({
142
- provider: "zerox",
143
- calldataReady: true,
144
- // NOT executable authority. The bytes are assembled but nothing is signed:
145
- // the user's wallet is still the only thing that can authorize this. The
146
- // previous `executionReady: true` read as "cleared to execute" and trained
147
- // agents to treat a quote as permission.
148
- requiresUserSignature: true,
149
- signingReady: false,
150
- broadcastReady: false,
151
- chainId,
152
- quote,
153
- autoSlippage: quote.autoSlippage,
154
- requiresApproval: quote?.issues?.allowance?.actual != null && BigInt(quote.issues.allowance.actual) < BigInt(q.sellAmount)
155
- ? { token: q.sellToken, spender, amount: String(q.sellAmount) }
156
- : null,
157
- transaction: {
158
- chainId,
159
- from: q.taker,
160
- to: tx.to,
161
- data: tx.data,
162
- value: tx.value ?? "0x0",
163
- ...(tx.gas != null ? { gasLimit: tx.gas } : {}),
164
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: tx.to, data: tx.data }),
165
- },
166
- }, { provider: "zerox", kind: "zerox-tx" });
167
- }
@@ -1,61 +0,0 @@
1
- import { dataCatalog, dataHealth } from "./desk-data.mjs";
2
-
3
- export const COVERED_CHAINS = Object.freeze({
4
- 1: "Ethereum",
5
- 10: "Optimism",
6
- 56: "BNB Chain",
7
- 137: "Polygon",
8
- 988: "Stable",
9
- 999: "HyperEVM",
10
- 2741: "Abstract",
11
- 4663: "Robinhood Chain",
12
- 8453: "Base",
13
- 42161: "Arbitrum",
14
- 43114: "Avalanche",
15
- });
16
-
17
- function providerStatus(record) {
18
- if (!record) return "not-probed";
19
- if (!record.ok) return "down";
20
- if (record.detail?.configured === false) return "key-missing";
21
- if (record.detail?.ok === false) return "degraded";
22
- return "healthy";
23
- }
24
-
25
- export function buildPublicApiCoverage(catalog, health) {
26
- const globals = catalog.filter((p) => !p.chainIds.length).map((p) => p.id);
27
- const providers = Object.fromEntries(catalog.map((p) => [p.id, {
28
- venue: p.venue,
29
- auth: p.auth,
30
- chainIds: p.chainIds,
31
- ops: p.ops,
32
- description: p.description,
33
- status: providerStatus(health?.providers?.[p.id]),
34
- probe: health?.providers?.[p.id] || null,
35
- }]));
36
- const chains = {};
37
- for (const [chainId, name] of Object.entries(COVERED_CHAINS)) {
38
- const id = Number(chainId);
39
- const explicit = catalog.filter((p) => p.chainIds.includes(id)).map((p) => p.id);
40
- chains[chainId] = {
41
- name,
42
- providers: [...new Set([...globals, ...explicit])],
43
- explicitProviders: explicit,
44
- failClosed: explicit.length === 0,
45
- };
46
- }
47
- return {
48
- generatedAt: health?.when || new Date().toISOString(),
49
- coveredChainCount: Object.keys(COVERED_CHAINS).length,
50
- providerCount: catalog.length,
51
- globals,
52
- chains,
53
- providers,
54
- };
55
- }
56
-
57
- export async function scanPublicApis({ providers, timeoutMs = 12_000 } = {}) {
58
- const catalog = dataCatalog();
59
- const health = await dataHealth({ providers, timeoutMs });
60
- return buildPublicApiCoverage(catalog, health);
61
- }
@@ -1,31 +0,0 @@
1
- // Placeholder addresses for quote-only provider calls.
2
- //
3
- // Several aggregator APIs (LI.FI, CoW, bridge quoters) require a `from`/`user`
4
- // address to price a route, even when nothing will be signed. Hardcoding a real
5
- // operator wallet as that default is a privacy and correctness bug: public users
6
- // would silently quote against someone else's account, and balance-aware routers
7
- // can return routes tailored to that stranger's holdings.
8
- //
9
- // So: callers SHOULD pass their own address. When they don't, we fall back to a
10
- // well-known burn/zero-ish placeholder that holds nothing and signs nothing.
11
- //
12
- // vitalik.eth is deliberately NOT used here either -- a placeholder must be
13
- // obviously inert, not a real person's account.
14
-
15
- /**
16
- * ERC-191 "dead" address. Universally recognizable as a placeholder, holds no
17
- * meaningful balance, and cannot sign. Safe default for price-only queries.
18
- */
19
- export const QUOTE_PLACEHOLDER_ADDRESS =
20
- "0x000000000000000000000000000000000000dEaD";
21
-
22
- /**
23
- * Resolve the address to use for a quote-only request.
24
- *
25
- * @param {string} [preferred] caller-supplied address (their own wallet)
26
- * @returns {string} the caller's address when usable, else the inert placeholder
27
- */
28
- export function quoteAddress(preferred) {
29
- const v = String(preferred || "").trim();
30
- return /^0x[0-9a-fA-F]{40}$/.test(v) ? v : QUOTE_PLACEHOLDER_ADDRESS;
31
- }
@@ -1,72 +0,0 @@
1
- // Exact integer parsing for anything that bounds money.
2
- //
3
- // A JS number cannot represent every uint256, and above 2^53 it silently
4
- // rounds — usually UPWARD, which widens a cap past what the user wrote.
5
- // `9007199254740995` becomes `...996`. Every guard, allowance, and policy
6
- // ceiling must therefore refuse unsafe numbers rather than quietly storing a
7
- // different value than the caller asked for.
8
- //
9
- // This lives in one place because the same bug was found independently in
10
- // token-transfer-guard, approval-guard, session grants, and exec-policy.
11
-
12
- /**
13
- * Parse a value into an exact non-negative BigInt.
14
- * Accepts: decimal string, BigInt, or a safe-integer number.
15
- * Refuses: non-integers, unsafe numbers, and unparseable input.
16
- */
17
- export function exactBigInt(value, label = "amount") {
18
- if (typeof value === "bigint") return value;
19
-
20
- if (typeof value === "number") {
21
- if (!Number.isInteger(value)) {
22
- throw new Error(`${label} must be an integer`);
23
- }
24
- if (!Number.isSafeInteger(value)) {
25
- throw new Error(
26
- `${label} exceeds safe integer precision — pass it as a decimal string or BigInt so the exact value is preserved`
27
- );
28
- }
29
- return BigInt(value);
30
- }
31
-
32
- const text = String(value ?? "").trim();
33
- if (text === "") throw new Error(`${label} is required`);
34
- // Reject scientific notation and floats outright: BigInt("1e3") throws, but
35
- // Number("1e3") would silently succeed if a caller coerced first.
36
- if (!/^-?\d+$/.test(text) && !/^0x[0-9a-fA-F]+$/.test(text)) {
37
- throw new Error(`${label} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(text)}`);
38
- }
39
- try {
40
- return BigInt(text);
41
- } catch {
42
- throw new Error(`${label} must be an integer, got ${JSON.stringify(text)}`);
43
- }
44
- }
45
-
46
- /** As exactBigInt, but also requires the value to be strictly positive. */
47
- export function exactPositiveBigInt(value, label = "amount") {
48
- const n = exactBigInt(value, label);
49
- if (n <= 0n) throw new Error(`${label} must be positive`);
50
- return n;
51
- }
52
-
53
- /**
54
- * Convert a decimal string to a scaled integer WITHOUT floats.
55
- * `toScaledInteger("1.5", 6)` -> 1500000n, and `"01.5"` -> 1500000n.
56
- * Leading zeros, missing fractions, and long fractions are all handled by
57
- * string arithmetic, so magnitude never affects the scale.
58
- */
59
- export function toScaledInteger(value, decimals, label = "amount") {
60
- const text = String(value ?? "").trim();
61
- if (!/^-?\d*(\.\d+)?$/.test(text) || text === "" || text === "." || text === "-") {
62
- throw new Error(`${label} must be a decimal number, got ${JSON.stringify(text)}`);
63
- }
64
- const negative = text.startsWith("-");
65
- const body = negative ? text.slice(1) : text;
66
- const [intPart = "0", fracPart = ""] = body.split(".");
67
- if (fracPart.length > decimals) {
68
- throw new Error(`${label} has more than ${decimals} decimal places, which would lose precision`);
69
- }
70
- const scaled = BigInt((intPart || "0") + fracPart.padEnd(decimals, "0"));
71
- return negative ? -scaled : scaled;
72
- }