@oracle-agent/oracle 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +13 -516
  3. package/bin/oracle.mjs +19 -27
  4. package/package.json +15 -98
  5. package/CONTRIBUTING.md +0 -98
  6. package/SECURITY.md +0 -89
  7. package/SETUP.md +0 -381
  8. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  9. package/artifacts/inscription/oracle-was-here.svg +0 -1
  10. package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
  11. package/bin/desk-server.mjs +0 -440
  12. package/bin/oracle-data-mcp.mjs +0 -1019
  13. package/bin/oracle-init.mjs +0 -496
  14. package/bin/oracle-public-server.mjs +0 -36
  15. package/bin/oracle-route.mjs +0 -254
  16. package/bin/oracle-scan.mjs +0 -192
  17. package/bin/oracle-upgrade.mjs +0 -42
  18. package/docs/adding-a-chain.md +0 -229
  19. package/docs/architecture.md +0 -138
  20. package/docs/cli.md +0 -47
  21. package/docs/connectors.md +0 -13
  22. package/docs/oracle-pack-standard.md +0 -29
  23. package/docs/profiles.md +0 -151
  24. package/docs/public-surface.md +0 -133
  25. package/examples/add-a-chain.mjs +0 -65
  26. package/examples/oracle-pack-template.mjs +0 -38
  27. package/examples/research-a-token.mjs +0 -70
  28. package/plugins/oracle-owner-gate/__init__.py +0 -227
  29. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  30. package/profiles/_template/SOUL.md +0 -54
  31. package/profiles/_template/profile.json +0 -22
  32. package/profiles/bitcoin-agent/SOUL.md +0 -31
  33. package/profiles/bitcoin-agent/profile.json +0 -32
  34. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  35. package/profiles/hyperliquid-agent/profile.json +0 -37
  36. package/profiles/oracle/SOUL.md +0 -107
  37. package/profiles/oracle/profile.json +0 -39
  38. package/profiles/polymarket-agent/SOUL.md +0 -35
  39. package/profiles/polymarket-agent/profile.json +0 -34
  40. package/profiles/profile.schema.json +0 -90
  41. package/profiles/protocol-builder/SOUL.md +0 -57
  42. package/profiles/protocol-builder/profile.json +0 -39
  43. package/profiles/robinhood-agent/SOUL.md +0 -53
  44. package/profiles/robinhood-agent/profile.json +0 -40
  45. package/profiles/solana-agent/SOUL.md +0 -37
  46. package/profiles/solana-agent/profile.json +0 -37
  47. package/profiles/stable-agent/SOUL.md +0 -43
  48. package/profiles/stable-agent/profile.json +0 -37
  49. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  50. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  51. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  52. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  53. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  54. package/public/agent-connect/app.js +0 -84
  55. package/public/agent-connect/index.html +0 -83
  56. package/public/agent-connect/styles.css +0 -70
  57. package/public/index.html +0 -12
  58. package/public/oracle-console/app.js +0 -272
  59. package/public/oracle-console/bitcoin-wallets.js +0 -206
  60. package/public/oracle-console/index.html +0 -91
  61. package/public/oracle-console/styles.css +0 -239
  62. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  63. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  64. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  65. package/public/oracle-splash/assets/llms/claude.svg +0 -1
  66. package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
  67. package/public/oracle-splash/assets/llms/codex.svg +0 -1
  68. package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
  69. package/public/oracle-splash/assets/llms/cursor.svg +0 -17
  70. package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
  71. package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
  72. package/public/oracle-splash/assets/llms/gemini.svg +0 -1
  73. package/public/oracle-splash/assets/llms/grok.svg +0 -8
  74. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  75. package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
  76. package/public/oracle-splash/assets/llms/kimi.svg +0 -1
  77. package/public/oracle-splash/assets/llms/manus.svg +0 -18
  78. package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
  79. package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
  80. package/public/oracle-splash/assets/llms/qwen.svg +0 -1
  81. package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
  82. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  83. package/public/oracle-splash/assets/protocols/across.png +0 -0
  84. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  85. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  86. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  87. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  88. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  89. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  90. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  91. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  92. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  93. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  94. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  95. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  96. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  97. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  98. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  99. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  100. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  101. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  102. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  103. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  104. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  106. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  107. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  108. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  109. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  110. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  111. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  112. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  113. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  114. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  115. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  116. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  117. package/public/oracle-splash/assets/wordmarks/across.svg +0 -4
  118. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
  119. package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
  120. package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
  121. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  122. package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
  123. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  124. package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
  125. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
  126. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
  127. package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
  128. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
  129. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  130. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  131. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +0 -1
  132. package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
  133. package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
  134. package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
  135. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  136. package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
  137. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
  138. package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
  139. package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
  140. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
  141. package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
  142. package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
  143. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  144. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  145. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  146. package/public/oracle-splash/assets/wordmarks/relay.svg +0 -8
  147. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  148. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  149. package/public/oracle-splash/assets/wordmarks/stargate.svg +0 -15
  150. package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
  151. package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
  152. package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
  153. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  154. package/public/oracle-splash/brand/aave.webp +0 -0
  155. package/public/oracle-splash/brand/aavev2.webp +0 -0
  156. package/public/oracle-splash/brand/aborean.webp +0 -0
  157. package/public/oracle-splash/brand/across.webp +0 -0
  158. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  159. package/public/oracle-splash/brand/afi.webp +0 -0
  160. package/public/oracle-splash/brand/arcus.webp +0 -0
  161. package/public/oracle-splash/brand/aster.webp +0 -0
  162. package/public/oracle-splash/brand/avant.webp +0 -0
  163. package/public/oracle-splash/brand/balancer.webp +0 -0
  164. package/public/oracle-splash/brand/beefy.webp +0 -0
  165. package/public/oracle-splash/brand/benqi.webp +0 -0
  166. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  167. package/public/oracle-splash/brand/bitfi.webp +0 -0
  168. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  169. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  170. package/public/oracle-splash/brand/camelot.webp +0 -0
  171. package/public/oracle-splash/brand/compound.webp +0 -0
  172. package/public/oracle-splash/brand/concrete.webp +0 -0
  173. package/public/oracle-splash/brand/cow.webp +0 -0
  174. package/public/oracle-splash/brand/curve.webp +0 -0
  175. package/public/oracle-splash/brand/derive.webp +0 -0
  176. package/public/oracle-splash/brand/dolomite.webp +0 -0
  177. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  178. package/public/oracle-splash/brand/ekubo.webp +0 -0
  179. package/public/oracle-splash/brand/ethena.webp +0 -0
  180. package/public/oracle-splash/brand/etherfi.webp +0 -0
  181. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  182. package/public/oracle-splash/brand/felix.webp +0 -0
  183. package/public/oracle-splash/brand/fluid.webp +0 -0
  184. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  185. package/public/oracle-splash/brand/folks.webp +0 -0
  186. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  187. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  188. package/public/oracle-splash/brand/gassss.webp +0 -0
  189. package/public/oracle-splash/brand/gmx.webp +0 -0
  190. package/public/oracle-splash/brand/harmonix.webp +0 -0
  191. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  192. package/public/oracle-splash/brand/hlp.webp +0 -0
  193. package/public/oracle-splash/brand/hop.webp +0 -0
  194. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  195. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  196. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  197. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  198. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  199. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  200. package/public/oracle-splash/brand/hypha.webp +0 -0
  201. package/public/oracle-splash/brand/joedex.webp +0 -0
  202. package/public/oracle-splash/brand/jupiter.webp +0 -0
  203. package/public/oracle-splash/brand/kelp.webp +0 -0
  204. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  205. package/public/oracle-splash/brand/kmhype.webp +0 -0
  206. package/public/oracle-splash/brand/kona.webp +0 -0
  207. package/public/oracle-splash/brand/konalend.webp +0 -0
  208. package/public/oracle-splash/brand/lfj.webp +0 -0
  209. package/public/oracle-splash/brand/lido.webp +0 -0
  210. package/public/oracle-splash/brand/lifi.webp +0 -0
  211. package/public/oracle-splash/brand/lighter.webp +0 -0
  212. package/public/oracle-splash/brand/lista.webp +0 -0
  213. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  214. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  215. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  216. package/public/oracle-splash/brand/magiceden.webp +0 -0
  217. package/public/oracle-splash/brand/mempool.png +0 -0
  218. package/public/oracle-splash/brand/meteora.webp +0 -0
  219. package/public/oracle-splash/brand/morpho.webp +0 -0
  220. package/public/oracle-splash/brand/myriad.webp +0 -0
  221. package/public/oracle-splash/brand/noxa.webp +0 -0
  222. package/public/oracle-splash/brand/odos.webp +0 -0
  223. package/public/oracle-splash/brand/oneinch.webp +0 -0
  224. package/public/oracle-splash/brand/openbook.webp +0 -0
  225. package/public/oracle-splash/brand/opensea.webp +0 -0
  226. package/public/oracle-splash/brand/orca.webp +0 -0
  227. package/public/oracle-splash/brand/ordinals.png +0 -0
  228. package/public/oracle-splash/brand/ostium.webp +0 -0
  229. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  230. package/public/oracle-splash/brand/pendle.webp +0 -0
  231. package/public/oracle-splash/brand/perena.webp +0 -0
  232. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  233. package/public/oracle-splash/brand/phoenix.webp +0 -0
  234. package/public/oracle-splash/brand/polymarket.webp +0 -0
  235. package/public/oracle-splash/brand/polynomial.webp +0 -0
  236. package/public/oracle-splash/brand/projectx.webp +0 -0
  237. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  238. package/public/oracle-splash/brand/quickswap.webp +0 -0
  239. package/public/oracle-splash/brand/rain.webp +0 -0
  240. package/public/oracle-splash/brand/raydium.webp +0 -0
  241. package/public/oracle-splash/brand/relay.webp +0 -0
  242. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  243. package/public/oracle-splash/brand/saber.webp +0 -0
  244. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  245. package/public/oracle-splash/brand/sanctum.webp +0 -0
  246. package/public/oracle-splash/brand/satflow.png +0 -0
  247. package/public/oracle-splash/brand/sierra.webp +0 -0
  248. package/public/oracle-splash/brand/sky.webp +0 -0
  249. package/public/oracle-splash/brand/solv.webp +0 -0
  250. package/public/oracle-splash/brand/spark.webp +0 -0
  251. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  252. package/public/oracle-splash/brand/sphere.webp +0 -0
  253. package/public/oracle-splash/brand/ssv.webp +0 -0
  254. package/public/oracle-splash/brand/stabble.webp +0 -0
  255. package/public/oracle-splash/brand/stableswap.webp +0 -0
  256. package/public/oracle-splash/brand/stakewise.webp +0 -0
  257. package/public/oracle-splash/brand/stargate.webp +0 -0
  258. package/public/oracle-splash/brand/sthype.webp +0 -0
  259. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  260. package/public/oracle-splash/brand/unisat.png +0 -0
  261. package/public/oracle-splash/brand/uniswap.webp +0 -0
  262. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  263. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  264. package/public/oracle-splash/brand/unit.webp +0 -0
  265. package/public/oracle-splash/brand/velodrome.webp +0 -0
  266. package/public/oracle-splash/brand/velora.webp +0 -0
  267. package/public/oracle-splash/brand/venus.webp +0 -0
  268. package/public/oracle-splash/brand/wbeth.webp +0 -0
  269. package/public/oracle-splash/brand/xsy.webp +0 -0
  270. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  271. package/public/oracle-splash/brand/zerobase.webp +0 -0
  272. package/public/oracle-splash/brand/zerox.webp +0 -0
  273. package/public/oracle-splash/favicon.ico +0 -0
  274. package/public/oracle-splash/favicon.svg +0 -6
  275. package/public/oracle-splash/index.html +0 -1558
  276. package/public/oracle-splash/mesh-graph.png +0 -0
  277. package/public/oracle-splash/mesh-graph.svg +0 -216
  278. package/scripts/adversarial-bench.mjs +0 -114
  279. package/scripts/build-inscription.py +0 -230
  280. package/scripts/check-doc-drift.mjs +0 -123
  281. package/scripts/check-test-count.mjs +0 -105
  282. package/scripts/e2e-hl-markets.mjs +0 -21
  283. package/scripts/e2e-hl-perps.mjs +0 -48
  284. package/scripts/e2e-hypercore-staking.mjs +0 -128
  285. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  286. package/scripts/protocol-template-gate.mjs +0 -15
  287. package/scripts/public-api-scan.mjs +0 -23
  288. package/scripts/secret-scan.mjs +0 -181
  289. package/scripts/verify-v3-venues.mjs +0 -192
  290. package/skills/balance/SKILL.md +0 -176
  291. package/skills/oracle-action-semantics/SKILL.md +0 -40
  292. package/skills/oracle-best-execution/SKILL.md +0 -127
  293. package/skills/oracle-bitcoin/SKILL.md +0 -53
  294. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  295. package/skills/oracle-chat/SKILL.md +0 -61
  296. package/skills/oracle-chat/chain.SKILL.md +0 -31
  297. package/skills/oracle-chat/setup.SKILL.md +0 -37
  298. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  299. package/skills/oracle-contract-research/SKILL.md +0 -55
  300. package/skills/oracle-desk/SKILL.md +0 -58
  301. package/skills/oracle-dex-launch/SKILL.md +0 -38
  302. package/skills/oracle-grants/SKILL.md +0 -69
  303. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  304. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  305. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  306. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  307. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  308. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  309. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  310. package/skills/oracle-polymarket/SKILL.md +0 -60
  311. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  312. package/skills/oracle-protocol-security/SKILL.md +0 -60
  313. package/skills/oracle-public-product/SKILL.md +0 -44
  314. package/skills/oracle-receipts/SKILL.md +0 -52
  315. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  316. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  317. package/skills/oracle-solana/SKILL.md +0 -65
  318. package/skills/oracle-solana-nft/SKILL.md +0 -54
  319. package/skills/oracle-token-research/SKILL.md +0 -67
  320. package/skins/oracle.yaml +0 -56
  321. package/src/action-receipts.mjs +0 -265
  322. package/src/action-semantics.mjs +0 -62
  323. package/src/address-book.mjs +0 -208
  324. package/src/agent-auth.mjs +0 -206
  325. package/src/approval-guard.mjs +0 -282
  326. package/src/attestation-secret.mjs +0 -88
  327. package/src/audit-log.mjs +0 -196
  328. package/src/auth/oauth.mjs +0 -672
  329. package/src/auto-slippage.mjs +0 -378
  330. package/src/capability-posture.mjs +0 -125
  331. package/src/chains.mjs +0 -62
  332. package/src/cli/chain-catalog.mjs +0 -215
  333. package/src/cli/chain-state.mjs +0 -74
  334. package/src/cli/commands/auth.mjs +0 -193
  335. package/src/cli/commands/bootstrap.mjs +0 -87
  336. package/src/cli/commands/chain.mjs +0 -143
  337. package/src/cli/commands/chat.mjs +0 -434
  338. package/src/cli/commands/credential.mjs +0 -9
  339. package/src/cli/commands/data-mcp.mjs +0 -18
  340. package/src/cli/commands/data.mjs +0 -75
  341. package/src/cli/commands/doctor.mjs +0 -136
  342. package/src/cli/commands/help.mjs +0 -7
  343. package/src/cli/commands/init.mjs +0 -27
  344. package/src/cli/commands/mcp.mjs +0 -142
  345. package/src/cli/commands/model.mjs +0 -99
  346. package/src/cli/commands/prepare.mjs +0 -12
  347. package/src/cli/commands/public.mjs +0 -20
  348. package/src/cli/commands/route.mjs +0 -12
  349. package/src/cli/commands/runner.mjs +0 -9
  350. package/src/cli/commands/scan.mjs +0 -12
  351. package/src/cli/commands/setup.mjs +0 -275
  352. package/src/cli/commands/sign.mjs +0 -21
  353. package/src/cli/commands/signer.mjs +0 -9
  354. package/src/cli/commands/upgrade.mjs +0 -12
  355. package/src/cli/commands/vault.mjs +0 -9
  356. package/src/cli/commands/version.mjs +0 -22
  357. package/src/cli/first-run.mjs +0 -23
  358. package/src/cli/kernel.mjs +0 -239
  359. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  360. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  361. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  362. package/src/cli/mcp-targets/codex.mjs +0 -41
  363. package/src/cli/mcp-targets/shared.mjs +0 -61
  364. package/src/cli/messaging-platforms.mjs +0 -209
  365. package/src/cli/model-config.mjs +0 -70
  366. package/src/cli/operator-dispatch.mjs +0 -258
  367. package/src/cli/oracle-harness.py +0 -415
  368. package/src/cli/paths.mjs +0 -83
  369. package/src/cli/runtime.mjs +0 -351
  370. package/src/cli/setup-state.mjs +0 -168
  371. package/src/cli/spawn-child.mjs +0 -43
  372. package/src/data/catalog.mjs +0 -585
  373. package/src/data/desk-data.mjs +0 -695
  374. package/src/data/http.mjs +0 -253
  375. package/src/data/provider-endpoint.mjs +0 -94
  376. package/src/data/providers/aerodrome.mjs +0 -245
  377. package/src/data/providers/balancer.mjs +0 -209
  378. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  379. package/src/data/providers/bitcoin-meta.mjs +0 -378
  380. package/src/data/providers/blockscout.mjs +0 -14
  381. package/src/data/providers/bridges.mjs +0 -242
  382. package/src/data/providers/cowswap.mjs +0 -415
  383. package/src/data/providers/curve.mjs +0 -201
  384. package/src/data/providers/defillama.mjs +0 -88
  385. package/src/data/providers/dexscreener.mjs +0 -43
  386. package/src/data/providers/evm-rpc.mjs +0 -225
  387. package/src/data/providers/geckoterminal.mjs +0 -34
  388. package/src/data/providers/gmx.mjs +0 -496
  389. package/src/data/providers/hl-assets.mjs +0 -165
  390. package/src/data/providers/hl-info.mjs +0 -108
  391. package/src/data/providers/hl-markets.mjs +0 -210
  392. package/src/data/providers/hl-outcome.mjs +0 -61
  393. package/src/data/providers/hl-perps.mjs +0 -387
  394. package/src/data/providers/hl-staking.mjs +0 -353
  395. package/src/data/providers/hl-ws.mjs +0 -119
  396. package/src/data/providers/hyperevm-dex.mjs +0 -49
  397. package/src/data/providers/jupiter-venues.mjs +0 -119
  398. package/src/data/providers/jupiter.mjs +0 -315
  399. package/src/data/providers/lifi.mjs +0 -151
  400. package/src/data/providers/magiceden-sol.mjs +0 -406
  401. package/src/data/providers/morpho.mjs +0 -177
  402. package/src/data/providers/nft-gallery.mjs +0 -163
  403. package/src/data/providers/nft-portfolio.mjs +0 -494
  404. package/src/data/providers/odos.mjs +0 -156
  405. package/src/data/providers/oneinch.mjs +0 -174
  406. package/src/data/providers/opensea-multichain.mjs +0 -136
  407. package/src/data/providers/opensea-nft.mjs +0 -371
  408. package/src/data/providers/paraswap.mjs +0 -118
  409. package/src/data/providers/pendle.mjs +0 -188
  410. package/src/data/providers/poly-clob.mjs +0 -283
  411. package/src/data/providers/poly-public.mjs +0 -96
  412. package/src/data/providers/poly-ws.mjs +0 -103
  413. package/src/data/providers/portfolio-history.mjs +0 -394
  414. package/src/data/providers/portfolio.mjs +0 -594
  415. package/src/data/providers/rfq.mjs +0 -15
  416. package/src/data/providers/rh-agent.mjs +0 -59
  417. package/src/data/providers/satflow.mjs +0 -341
  418. package/src/data/providers/signed-material-guard.mjs +0 -108
  419. package/src/data/providers/solana-rpc.mjs +0 -197
  420. package/src/data/providers/uniswap-v3.mjs +0 -349
  421. package/src/data/providers/uniswap-v4.mjs +0 -414
  422. package/src/data/providers/zerox.mjs +0 -167
  423. package/src/data/public-api-scan.mjs +0 -61
  424. package/src/data/quote-placeholder.mjs +0 -31
  425. package/src/exact-integer.mjs +0 -72
  426. package/src/exec-policy.mjs +0 -455
  427. package/src/flags.mjs +0 -15
  428. package/src/fresh-window.mjs +0 -76
  429. package/src/gmx-attestation.mjs +0 -176
  430. package/src/index.mjs +0 -100
  431. package/src/nft-gas-war-guard.mjs +0 -139
  432. package/src/onboarding/agent-keys.mjs +0 -161
  433. package/src/onboarding/harness-configs.mjs +0 -102
  434. package/src/onboarding/index.mjs +0 -18
  435. package/src/onboarding/tiers.mjs +0 -139
  436. package/src/oracle-env.mjs +0 -47
  437. package/src/portfolio-risk.mjs +0 -170
  438. package/src/prepare-envelope.mjs +0 -204
  439. package/src/profile-upgrade.mjs +0 -277
  440. package/src/protocol-execution.mjs +0 -84
  441. package/src/protocol-templates/gate.mjs +0 -179
  442. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  443. package/src/public-api/buzz-integration.mjs +0 -256
  444. package/src/public-api/connect-agent.mjs +0 -416
  445. package/src/public-api/grants.mjs +0 -142
  446. package/src/public-api/http.mjs +0 -389
  447. package/src/public-control/aa-adapter.mjs +0 -402
  448. package/src/public-control/build-registry.mjs +0 -227
  449. package/src/public-control/bundler-client.mjs +0 -357
  450. package/src/public-control/grant-indexer.mjs +0 -296
  451. package/src/public-control/policy-render.mjs +0 -69
  452. package/src/public-control/policy-schema.mjs +0 -318
  453. package/src/public-control/runtime-config.mjs +0 -275
  454. package/src/public-control/session-key-model.mjs +0 -374
  455. package/src/public-control/session-orchestrator.mjs +0 -412
  456. package/src/rfq/intent.mjs +0 -180
  457. package/src/rfq/sources.mjs +0 -181
  458. package/src/route-attestation.mjs +0 -132
  459. package/src/router/best-execution.mjs +0 -326
  460. package/src/router/index.mjs +0 -226
  461. package/src/router/prepare-bridge.mjs +0 -289
  462. package/src/router/prepare-route.mjs +0 -398
  463. package/src/router/proposal.mjs +0 -311
  464. package/src/router/risk-classifier.mjs +0 -119
  465. package/src/router/route-sources.mjs +0 -364
  466. package/src/scanner/chains.config.mjs +0 -430
  467. package/src/scanner/contract.mjs +0 -270
  468. package/src/scanner/evm-scanner.mjs +0 -394
  469. package/src/scanner/index.mjs +0 -9
  470. package/src/scanner/v2-venue.mjs +0 -335
  471. package/src/scanner/v3-venue.mjs +0 -290
  472. package/src/scopes.mjs +0 -44
  473. package/src/sell-simulation.mjs +0 -167
  474. package/src/signals/engine.mjs +0 -146
  475. package/src/signals/index.mjs +0 -1
  476. package/src/token-transfer-guard.mjs +0 -188
  477. package/src/tui/app.mjs +0 -438
  478. package/src/tui/backend.mjs +0 -145
  479. package/src/tui/format.mjs +0 -272
  480. package/src/tui/gateway-client.mjs +0 -177
  481. package/src/tui/input.mjs +0 -501
  482. package/src/tui/renderer.mjs +0 -443
  483. package/src/tui/standalone-client.mjs +0 -666
  484. package/src/tui/theme.mjs +0 -81
  485. package/src/vault-attestation.mjs +0 -146
  486. package/src/venues.mjs +0 -206
  487. package/src/watch-preferences.mjs +0 -85
@@ -1,378 +0,0 @@
1
- // Bitcoin metaprotocol reads (ordinals / runes).
2
- // Pluggable indexer base. No keys in repo — optional API keys via env.
3
- //
4
- // Free keyless tier: ordinals.com recursive ("/r/*") endpoints. Verified live
5
- // 2026-07: blockheight, blockhash, blockinfo, inscription metadata, children,
6
- // sat. These are the ord node's own recursive API and need no key.
7
- //
8
- // Indexer landscape as probed (do not re-litigate without re-probing):
9
- // ordinals.com /r/* 200, keyless -> wired below
10
- // Hiro ordinals/brc20 410 GONE, deprecated -> dead, do not use
11
- // Ordiscan 402 payment required
12
- // UniSat open-api 403 without Bearer
13
- // BestInSlot 301 (moved; needs key)
14
- // Magic Eden BTC 503 "no healthy upstream" -> dead
15
- // Satflow 403 without x-api-key -> marketplace, separate provider
16
- //
17
- // Known gap: ordinals.com has NO address-indexed endpoint (/r/address 404).
18
- // Address -> inscriptions/runes REQUIRES a keyed indexer. Keyless mode can
19
- // answer "what is this inscription" but not "what does this wallet hold".
20
-
21
- import { btcAddress } from "./bitcoin-esplora.mjs";
22
- import { resolveProviderEndpoint, credentialedHeaders } from "../provider-endpoint.mjs";
23
-
24
- export const ORDINALS_RECURSIVE_BASE = "https://ordinals.com";
25
-
26
- function metaBase(opts = {}) {
27
- return String(
28
- opts.baseUrl ||
29
- process.env.BTC_META_API_URL ||
30
- process.env.UNISAT_API_URL ||
31
- ""
32
- )
33
- .trim()
34
- .replace(/\/$/, "");
35
- }
36
-
37
- // This provider has NO fixed default endpoint: the operator points it at their
38
- // own UniSat / Best-in-Slot deployment. Trust is therefore decided by an
39
- // explicit host allowlist rather than a built-in default.
40
- const BTC_META_HOSTS = [
41
- "open-api.unisat.io",
42
- "open-api-testnet.unisat.io",
43
- "api.bestinslot.xyz",
44
- "api.hiro.so",
45
- ];
46
-
47
- function metaEndpoint(opts = {}) {
48
- const url = metaBase(opts);
49
- if (!url) return { baseUrl: "", trusted: false, host: null };
50
- return resolveProviderEndpoint({
51
- provider: "bitcoin-meta",
52
- defaultUrl: url,
53
- hosts: BTC_META_HOSTS,
54
- url,
55
- });
56
- }
57
-
58
- function headers(opts = {}) {
59
- const key =
60
- opts.apiKey ||
61
- process.env.UNISAT_API_KEY ||
62
- process.env.BESTINSLOT_API_KEY ||
63
- process.env.BTC_META_API_KEY ||
64
- "";
65
- // An operator-configured base is only credentialed when its host is one of
66
- // the known indexers; a redirected base gets the request without the key.
67
- let trusted = false;
68
- try {
69
- const url = metaBase(opts);
70
- if (url) {
71
- const host = new URL(url).host;
72
- const proto = new URL(url).protocol;
73
- const loopback = /^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(host);
74
- trusted = BTC_META_HOSTS.includes(host) && (proto === "https:" || loopback);
75
- }
76
- } catch {
77
- trusted = false;
78
- }
79
- return credentialedHeaders(
80
- { accept: "application/json", "user-agent": "oracle-btc-meta/0.1" },
81
- { authorization: key ? `Bearer ${key}` : "", "x-api-key": key },
82
- trusted
83
- );
84
- }
85
-
86
- async function getJson(url, opts = {}) {
87
- const fetchImpl = opts.fetchImpl || fetch;
88
- const res = await fetchImpl(url, {
89
- method: "GET",
90
- headers: headers(opts),
91
- signal: AbortSignal.timeout(opts.timeoutMs ?? 12_000),
92
- });
93
- const text = await res.text();
94
- let body;
95
- try {
96
- body = JSON.parse(text);
97
- } catch {
98
- body = text;
99
- }
100
- if (!res.ok) {
101
- throw new Error(`bitcoin-meta GET ${url}: HTTP ${res.status} ${String(text).slice(0, 160)}`);
102
- }
103
- return body;
104
- }
105
-
106
- export async function btcMetaHealth(opts = {}) {
107
- const base = metaBase(opts);
108
- // Always can hit ordinals.com tip as chain liveness (not full meta)
109
- let tip = null;
110
- try {
111
- const fetchImpl = opts.fetchImpl || fetch;
112
- const r = await fetchImpl("https://ordinals.com/r/blockheight", {
113
- signal: AbortSignal.timeout(8000),
114
- });
115
- tip = Number(await r.text());
116
- } catch {
117
- tip = null;
118
- }
119
-
120
- if (!base) {
121
- return {
122
- ok: tip != null,
123
- provider: "bitcoin-meta",
124
- indexerConfigured: false,
125
- ordinalsComTip: tip,
126
- note: "Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",
127
- capabilities: {
128
- tip: tip != null,
129
- runeBalances: false,
130
- inscriptions: false,
131
- marketplace: false,
132
- },
133
- };
134
- }
135
-
136
- // Probe common paths; tolerate 404
137
- let probe = { ok: false, path: null, status: null };
138
- for (const path of ["/v1/indexer/brc20/best-height", "/v1/health", "/health", "/"]) {
139
- try {
140
- const fetchImpl = opts.fetchImpl || fetch;
141
- const res = await fetchImpl(`${base}${path}`, {
142
- headers: headers(opts),
143
- signal: AbortSignal.timeout(8000),
144
- });
145
- probe = { ok: res.status > 0 && res.status < 500, path, status: res.status };
146
- if (res.ok) break;
147
- } catch {
148
- /* try next */
149
- }
150
- }
151
-
152
- return {
153
- ok: probe.ok || tip != null,
154
- provider: "bitcoin-meta",
155
- indexerConfigured: true,
156
- baseUrl: base,
157
- probe,
158
- ordinalsComTip: tip,
159
- apiKeyPresent: Boolean(
160
- process.env.UNISAT_API_KEY ||
161
- process.env.BESTINSLOT_API_KEY ||
162
- process.env.BTC_META_API_KEY
163
- ),
164
- capabilities: {
165
- tip: tip != null,
166
- runeBalances: true,
167
- inscriptions: true,
168
- marketplace: Boolean(process.env.SATFLOW_API_KEY),
169
- },
170
- };
171
- }
172
-
173
- /**
174
- * Rune balances for an address. Requires configured indexer.
175
- * Normalizes heterogeneous API shapes into a common list.
176
- */
177
- export async function btcRuneBalances(args = {}, opts = {}) {
178
- const address = btcAddress(args.address || args.addr, "address");
179
- const base = metaBase(opts);
180
- if (!base) {
181
- return {
182
- provider: "bitcoin-meta",
183
- address,
184
- ok: false,
185
- balances: [],
186
- error: "no indexer configured (set BTC_META_API_URL or vendor API key env)",
187
- };
188
- }
189
-
190
- // Try UniSat-shaped path first, then generic
191
- const candidates = [
192
- `${base}/v1/indexer/address/${address}/runes/balance-list?start=0&limit=100`,
193
- `${base}/v1/runes/address/${address}`,
194
- `${base}/runes/balance/${address}`,
195
- `${base}/address/${address}/runes`,
196
- ];
197
-
198
- let lastErr = null;
199
- for (const url of candidates) {
200
- try {
201
- const body = await getJson(url, opts);
202
- const list = normalizeRuneBalances(body);
203
- return {
204
- provider: "bitcoin-meta",
205
- address,
206
- ok: true,
207
- count: list.length,
208
- balances: list,
209
- source: url,
210
- };
211
- } catch (e) {
212
- lastErr = e;
213
- }
214
- }
215
- return {
216
- provider: "bitcoin-meta",
217
- address,
218
- ok: false,
219
- balances: [],
220
- error: String(lastErr?.message || lastErr || "all indexer paths failed"),
221
- };
222
- }
223
-
224
- function normalizeRuneBalances(body) {
225
- const raw =
226
- body?.data?.detail ||
227
- body?.data?.list ||
228
- body?.data ||
229
- body?.balances ||
230
- body?.results ||
231
- body?.runes ||
232
- (Array.isArray(body) ? body : []);
233
- const arr = Array.isArray(raw) ? raw : [];
234
- return arr.map((r) => ({
235
- rune: r.rune || r.runeid || r.runeId || r.spacedRune || r.name || r.ticker || null,
236
- runeId: r.runeid || r.runeId || r.id || null,
237
- amount: String(r.amount ?? r.balance ?? r.total ?? r.qty ?? "0"),
238
- symbol: r.symbol || null,
239
- divisibility: r.divisibility ?? r.div ?? null,
240
- raw: r,
241
- }));
242
- }
243
-
244
- /**
245
- * Inscriptions controlled by an address.
246
- *
247
- * NOTE: requires a KEYED indexer. ordinals.com recursive has no address index
248
- * (verified: /r/address -> 404), so the free tier cannot answer this. We say so
249
- * explicitly rather than returning an empty list that reads like "you own
250
- * nothing" — a false negative here can get an inscription spent as fee change.
251
- */
252
- export async function btcInscriptions(args = {}, opts = {}) {
253
- const address = btcAddress(args.address || args.addr, "address");
254
- const base = metaBase(opts);
255
- if (!base) {
256
- return {
257
- provider: "bitcoin-meta",
258
- address,
259
- ok: false,
260
- inscriptions: [],
261
- error:
262
- "no indexer configured — address-indexed lookups need a keyed indexer " +
263
- "(BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). " +
264
- "ordinals.com recursive is keyless but has no address index.",
265
- unknownNotEmpty: true,
266
- keylessAlternatives: ["btc_inscription_info (by inscription id)", "btc_meta_health"],
267
- };
268
- }
269
- const limit = Math.min(Number(args.limit || 50), 200);
270
- const candidates = [
271
- `${base}/v1/indexer/address/${address}/inscription-data?cursor=0&size=${limit}`,
272
- `${base}/v1/inscriptions/address/${address}?limit=${limit}`,
273
- `${base}/address/${address}/inscriptions?limit=${limit}`,
274
- ];
275
- let lastErr = null;
276
- for (const url of candidates) {
277
- try {
278
- const body = await getJson(url, opts);
279
- const list = normalizeInscriptions(body);
280
- return {
281
- provider: "bitcoin-meta",
282
- address,
283
- ok: true,
284
- count: list.length,
285
- inscriptions: list,
286
- source: url,
287
- };
288
- } catch (e) {
289
- lastErr = e;
290
- }
291
- }
292
- return {
293
- provider: "bitcoin-meta",
294
- address,
295
- ok: false,
296
- inscriptions: [],
297
- error: String(lastErr?.message || lastErr || "all indexer paths failed"),
298
- };
299
- }
300
-
301
- /**
302
- * Inscription metadata by inscription id — KEYLESS via ordinals.com recursive.
303
- * Verified live: returns content_type, content_length, height, sat, fee, etc.
304
- */
305
- export async function btcInscriptionInfo(args = {}, opts = {}) {
306
- const id = String(args.inscriptionId || args.id || "").trim();
307
- if (!/^[0-9a-f]{64}i\d+$/i.test(id)) {
308
- throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");
309
- }
310
- const base = opts.ordinalsBase || ORDINALS_RECURSIVE_BASE;
311
- const info = await getJson(`${base}/r/inscription/${id}`, opts);
312
- return {
313
- provider: "bitcoin-meta",
314
- source: "ordinals.com/r",
315
- keyless: true,
316
- inscriptionId: id,
317
- info,
318
- };
319
- }
320
-
321
- /**
322
- * Child inscriptions (collection/parent-child) — KEYLESS via ordinals.com.
323
- */
324
- export async function btcInscriptionChildren(args = {}, opts = {}) {
325
- const id = String(args.inscriptionId || args.id || "").trim();
326
- if (!/^[0-9a-f]{64}i\d+$/i.test(id)) {
327
- throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");
328
- }
329
- const base = opts.ordinalsBase || ORDINALS_RECURSIVE_BASE;
330
- const page = Number(args.page || 0);
331
- const body = await getJson(`${base}/r/children/${id}${page ? `/${page}` : ""}`, opts);
332
- return {
333
- provider: "bitcoin-meta",
334
- source: "ordinals.com/r",
335
- keyless: true,
336
- inscriptionId: id,
337
- page,
338
- children: Array.isArray(body?.ids) ? body.ids : [],
339
- more: Boolean(body?.more),
340
- };
341
- }
342
-
343
- /**
344
- * Block info from the ord node itself — KEYLESS. Useful to confirm the ord
345
- * indexer is at the same tip as Esplora before trusting any metaprotocol read.
346
- */
347
- export async function btcOrdBlockInfo(args = {}, opts = {}) {
348
- const base = opts.ordinalsBase || ORDINALS_RECURSIVE_BASE;
349
- const height = args.height ?? (await getJson(`${base}/r/blockheight`, opts));
350
- const info = await getJson(`${base}/r/blockinfo/${Number(height)}`, opts);
351
- return {
352
- provider: "bitcoin-meta",
353
- source: "ordinals.com/r",
354
- keyless: true,
355
- height: Number(height),
356
- info,
357
- };
358
- }
359
-
360
- function normalizeInscriptions(body) {
361
- const raw =
362
- body?.data?.inscription ||
363
- body?.data?.detail ||
364
- body?.data?.list ||
365
- body?.data ||
366
- body?.inscriptions ||
367
- body?.results ||
368
- (Array.isArray(body) ? body : []);
369
- const arr = Array.isArray(raw) ? raw : [];
370
- return arr.map((i) => ({
371
- id: i.inscriptionId || i.id || i.inscription_id || null,
372
- number: i.inscriptionNumber ?? i.number ?? null,
373
- sat: i.sat || i.satoshi || null,
374
- contentType: i.contentType || i.content_type || null,
375
- utxo: i.utxo || i.output || (i.txid != null ? `${i.txid}:${i.vout ?? i.n}` : null),
376
- raw: i,
377
- }));
378
- }
@@ -1,14 +0,0 @@
1
- // Blockscout REST API v2 — verified public explorer instances, no key.
2
- import { httpJson } from "../http.mjs";
3
- export const BLOCKSCOUT_CHAINS=Object.freeze({
4
- 1:"https://eth.blockscout.com",
5
- 10:"https://optimism.blockscout.com",
6
- 137:"https://polygon.blockscout.com",
7
- 42161:"https://arbitrum.blockscout.com",
8
- 8453:"https://base.blockscout.com",
9
- });
10
- function base(chainId,o={}) { const id=Number(chainId); const u=o.baseUrl || BLOCKSCOUT_CHAINS[id]; if(!u) throw new Error(`Blockscout not configured for chainId ${id}`); return u.replace(/\/$/,""); }
11
- export async function blockscoutStats(args={},opts={}) { return httpJson(`${base(args.chainId||1,opts)}/api/v2/stats`,{fetchImpl:opts.fetchImpl,timeoutMs:opts.timeoutMs}); }
12
- export async function blockscoutAddress(args={},opts={}) { if(!args.address)throw new Error("address required"); return httpJson(`${base(args.chainId||1,opts)}/api/v2/addresses/${encodeURIComponent(args.address)}`,{fetchImpl:opts.fetchImpl,timeoutMs:opts.timeoutMs}); }
13
- export async function blockscoutToken(args={},opts={}) { if(!args.address && !args.tokenAddress)throw new Error("token address required"); return httpJson(`${base(args.chainId||1,opts)}/api/v2/tokens/${encodeURIComponent(args.address||args.tokenAddress)}`,{fetchImpl:opts.fetchImpl,timeoutMs:opts.timeoutMs}); }
14
- export async function blockscoutHealth(opts={}) { const data=await blockscoutStats({chainId:8453},opts); return {ok:data?.total_blocks!=null || data?.total_transactions!=null,chainId:8453}; }
@@ -1,242 +0,0 @@
1
- // Bridge quote pack — Across, Hop, Relay (public, no key).
2
-
3
- import { httpJson } from "../http.mjs";
4
- import { attachAutoSlippage, bindAutoSlippageGuardToCall, resolveAutoSlippage } from "../../auto-slippage.mjs";
5
- import { QUOTE_PLACEHOLDER_ADDRESS, quoteAddress } from "../quote-placeholder.mjs";
6
- import { stampPrepared } from "../../prepare-envelope.mjs";
7
-
8
- export const ACROSS_API = "https://across.to/api";
9
- export const HOP_API = "https://api.hop.exchange/v1";
10
- export const RELAY_API = "https://api.relay.link";
11
-
12
- const HOP_CHAIN_IDS = {
13
- ethereum: 1,
14
- optimism: 10,
15
- bsc: 56,
16
- polygon: 137,
17
- arbitrum: 42161,
18
- avalanche: 43114,
19
- base: 8453,
20
- };
21
-
22
- // ── Across ──────────────────────────────────────────────────────────────────
23
-
24
- export async function acrossHealth(opts = {}) {
25
- try {
26
- const q = await acrossSuggestedFees(
27
- {
28
- token: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
29
- destinationToken: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
30
- originChainId: 1,
31
- destinationChainId: 42161,
32
- amount: "1000000000000000",
33
- },
34
- opts
35
- );
36
- return { ok: true, estimatedFillTimeSec: q.estimatedFillTimeSec };
37
- } catch (e) {
38
- return { ok: false, error: String(e.message || e).slice(0, 160) };
39
- }
40
- }
41
-
42
- export async function acrossSuggestedFees(q = {}, opts = {}) {
43
- const {
44
- token,
45
- destinationToken = token,
46
- originChainId,
47
- destinationChainId,
48
- amount,
49
- } = q;
50
- if (!token || originChainId == null || destinationChainId == null || !amount) {
51
- throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");
52
- }
53
- const params = new URLSearchParams({
54
- token,
55
- destinationToken,
56
- originChainId: String(originChainId),
57
- destinationChainId: String(destinationChainId),
58
- amount: String(amount),
59
- });
60
- const base = (opts.baseUrl || process.env.ACROSS_API_URL || ACROSS_API).replace(/\/$/, "");
61
- return httpJson(`${base}/suggested-fees?${params}`, {
62
- fetchImpl: opts.fetchImpl,
63
- timeoutMs: opts.timeoutMs ?? 15_000,
64
- });
65
- }
66
-
67
- // ── Hop ─────────────────────────────────────────────────────────────────────
68
-
69
- export async function hopHealth(opts = {}) {
70
- try {
71
- const q = await hopQuote(
72
- {
73
- amount: "1000000000000000",
74
- token: "ETH",
75
- fromChain: "ethereum",
76
- toChain: "arbitrum",
77
- slippage: 0.5,
78
- },
79
- opts
80
- );
81
- return { ok: true, estimatedRecieved: q.estimatedRecieved || q.estimatedReceived };
82
- } catch (e) {
83
- return { ok: false, error: String(e.message || e).slice(0, 160) };
84
- }
85
- }
86
-
87
- export async function hopQuote(q = {}, opts = {}) {
88
- const {
89
- amount,
90
- token = "ETH",
91
- fromChain = "ethereum",
92
- toChain = "arbitrum",
93
- } = q;
94
- if (!amount) throw new Error("hopQuote requires amount");
95
- const legacyCap = q.slippage == null ? undefined : Math.round(Number(q.slippage) * 100);
96
- const selected = resolveAutoSlippage({
97
- liquidityUsd: q.liquidityUsd,
98
- priceChange5m: q.priceChange5m,
99
- crossChain: fromChain !== toChain,
100
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps ?? legacyCap,
101
- });
102
- if (!selected.executable) {
103
- throw new Error(`hop: route requires ${selected.requiredBps} bps above cap ${selected.capBps}`);
104
- }
105
- const params = new URLSearchParams({
106
- amount: String(amount),
107
- token,
108
- fromChain,
109
- toChain,
110
- // Hop expresses slippage as percentage points: 0.5 = 50 bps.
111
- slippage: String(selected.selectedBps / 100),
112
- });
113
- const base = (opts.baseUrl || process.env.HOP_API_URL || HOP_API).replace(/\/$/, "");
114
- const result = await httpJson(`${base}/quote?${params}`, {
115
- fetchImpl: opts.fetchImpl,
116
- timeoutMs: opts.timeoutMs ?? 15_000,
117
- });
118
- const amountOut = result?.estimatedRecieved || result?.estimatedReceived;
119
- if (!amountOut) return { ...result, autoSlippagePolicy: selected };
120
- return attachAutoSlippage(result, {
121
- chainId: Number(q.originChainId || q.chainId || HOP_CHAIN_IDS[fromChain] || 0),
122
- venue: result?.tx?.to || "hop",
123
- amountOut,
124
- liquidityUsd: q.liquidityUsd,
125
- priceChange5m: q.priceChange5m,
126
- crossChain: fromChain !== toChain,
127
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps ?? legacyCap,
128
- });
129
- }
130
-
131
- // ── Relay ───────────────────────────────────────────────────────────────────
132
-
133
- export async function relayHealth(opts = {}) {
134
- try {
135
- const q = await relayQuote(
136
- {
137
- user: QUOTE_PLACEHOLDER_ADDRESS,
138
- originChainId: 1,
139
- destinationChainId: 8453,
140
- originCurrency: "0x0000000000000000000000000000000000000000",
141
- destinationCurrency: "0x0000000000000000000000000000000000000000",
142
- amount: "1000000000000000",
143
- tradeType: "EXACT_INPUT",
144
- },
145
- opts
146
- );
147
- return { ok: true, hasSteps: Array.isArray(q.steps), stepCount: q.steps?.length || 0 };
148
- } catch (e) {
149
- return { ok: false, error: String(e.message || e).slice(0, 160) };
150
- }
151
- }
152
-
153
- export async function relayQuote(q = {}, opts = {}) {
154
- const {
155
- user = QUOTE_PLACEHOLDER_ADDRESS,
156
- originChainId,
157
- destinationChainId,
158
- originCurrency = "0x0000000000000000000000000000000000000000",
159
- destinationCurrency = "0x0000000000000000000000000000000000000000",
160
- amount,
161
- tradeType = "EXACT_INPUT",
162
- } = q;
163
- if (originChainId == null || destinationChainId == null || !amount) {
164
- throw new Error("relayQuote requires originChainId, destinationChainId, amount");
165
- }
166
- const selected = resolveAutoSlippage({
167
- liquidityUsd: q.liquidityUsd,
168
- priceChange5m: q.priceChange5m,
169
- crossChain: Number(originChainId) !== Number(destinationChainId),
170
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
171
- });
172
- if (!selected.executable) {
173
- throw new Error(`relay: route requires ${selected.requiredBps} bps above cap ${selected.capBps}`);
174
- }
175
- const base = (opts.baseUrl || process.env.RELAY_API_URL || RELAY_API).replace(/\/$/, "");
176
- const result = await httpJson(`${base}/quote`, {
177
- method: "POST",
178
- body: {
179
- user,
180
- originChainId: Number(originChainId),
181
- destinationChainId: Number(destinationChainId),
182
- originCurrency,
183
- destinationCurrency,
184
- amount: String(amount),
185
- tradeType,
186
- // Relay expects an integer-string in basis points ("50" = 0.50%).
187
- slippageTolerance: String(selected.selectedBps),
188
- },
189
- fetchImpl: opts.fetchImpl,
190
- timeoutMs: opts.timeoutMs ?? 20_000,
191
- });
192
- const amountOut = result?.details?.currencyOut?.amount;
193
- if (!amountOut || !/^\d+$/.test(String(amountOut))) {
194
- return { ...result, autoSlippagePolicy: selected };
195
- }
196
- return attachAutoSlippage(result, {
197
- chainId: Number(originChainId),
198
- venue: result?.steps?.[0]?.items?.[0]?.data?.to || "relay",
199
- amountOut,
200
- liquidityUsd: q.liquidityUsd,
201
- priceChange5m: q.priceChange5m,
202
- crossChain: Number(originChainId) !== Number(destinationChainId),
203
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
204
- });
205
- }
206
-
207
- export async function relayPrepare(q = {}, opts = {}) {
208
- const quote = await relayQuote(q, opts);
209
- const chainId = Number(q.originChainId);
210
- const items = (quote.steps || []).flatMap((step) =>
211
- (step.items || []).filter((item) => item?.data?.to && item?.data?.data).map((item) => ({ stepId: step.id, ...item.data }))
212
- );
213
- if (!items.length) throw new Error("relay: quote returned no executable transaction items");
214
- const venue = String(quote?.autoSlippage?.venue || "").toLowerCase();
215
- if (items.some((tx) => String(tx.to).toLowerCase() !== venue)) {
216
- throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");
217
- }
218
- const transactions = items.map((tx) => ({
219
- chainId,
220
- from: tx.from || q.user,
221
- to: tx.to,
222
- data: tx.data,
223
- value: tx.value ?? "0x0",
224
- ...(tx.gasLimit != null || tx.gas != null ? { gasLimit: tx.gasLimit ?? tx.gas } : {}),
225
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: tx.to, data: tx.data }),
226
- }));
227
- return stampPrepared({
228
- provider: "relay",
229
- calldataReady: true,
230
- // NOT executable authority. The bytes are assembled but nothing is signed:
231
- // the user's wallet is still the only thing that can authorize this. The
232
- // previous `executionReady: true` read as "cleared to execute" and trained
233
- // agents to treat a quote as permission.
234
- requiresUserSignature: true,
235
- signingReady: false,
236
- broadcastReady: false,
237
- chainId,
238
- quote,
239
- autoSlippage: quote.autoSlippage,
240
- transactions,
241
- }, { provider: "relay", kind: "relay-tx" });
242
- }