@oracle-agent/oracle 0.11.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 (308) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +66 -84
  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/index.html +11 -1
  54. package/CONTRIBUTING.md +0 -98
  55. package/bin/desk-server.mjs +0 -440
  56. package/bin/oracle-data-mcp.mjs +0 -1019
  57. package/bin/oracle-init.mjs +0 -496
  58. package/bin/oracle-public-server.mjs +0 -36
  59. package/bin/oracle-route.mjs +0 -254
  60. package/bin/oracle-scan.mjs +0 -192
  61. package/bin/oracle-upgrade.mjs +0 -42
  62. package/bin/oracle.mjs +0 -33
  63. package/docs/adding-a-chain.md +0 -229
  64. package/docs/architecture.md +0 -138
  65. package/docs/cli.md +0 -47
  66. package/docs/connectors.md +0 -13
  67. package/docs/oracle-pack-standard.md +0 -29
  68. package/docs/profiles.md +0 -151
  69. package/docs/public-surface.md +0 -133
  70. package/examples/add-a-chain.mjs +0 -65
  71. package/examples/oracle-pack-template.mjs +0 -38
  72. package/examples/research-a-token.mjs +0 -70
  73. package/plugins/oracle-owner-gate/__init__.py +0 -227
  74. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  75. package/profiles/_template/SOUL.md +0 -54
  76. package/profiles/_template/profile.json +0 -22
  77. package/profiles/bitcoin-agent/SOUL.md +0 -31
  78. package/profiles/bitcoin-agent/profile.json +0 -32
  79. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  80. package/profiles/hyperliquid-agent/profile.json +0 -37
  81. package/profiles/oracle/SOUL.md +0 -107
  82. package/profiles/oracle/profile.json +0 -39
  83. package/profiles/polymarket-agent/SOUL.md +0 -35
  84. package/profiles/polymarket-agent/profile.json +0 -34
  85. package/profiles/profile.schema.json +0 -90
  86. package/profiles/protocol-builder/SOUL.md +0 -57
  87. package/profiles/protocol-builder/profile.json +0 -39
  88. package/profiles/robinhood-agent/SOUL.md +0 -53
  89. package/profiles/robinhood-agent/profile.json +0 -40
  90. package/profiles/solana-agent/SOUL.md +0 -37
  91. package/profiles/solana-agent/profile.json +0 -37
  92. package/profiles/stable-agent/SOUL.md +0 -43
  93. package/profiles/stable-agent/profile.json +0 -37
  94. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  95. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  96. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  97. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  98. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  99. package/scripts/adversarial-bench.mjs +0 -114
  100. package/scripts/build-inscription.py +0 -230
  101. package/scripts/check-doc-drift.mjs +0 -123
  102. package/scripts/check-test-count.mjs +0 -105
  103. package/scripts/e2e-hl-markets.mjs +0 -21
  104. package/scripts/e2e-hl-perps.mjs +0 -48
  105. package/scripts/e2e-hypercore-staking.mjs +0 -128
  106. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  107. package/scripts/protocol-template-gate.mjs +0 -15
  108. package/scripts/public-api-scan.mjs +0 -23
  109. package/scripts/secret-scan.mjs +0 -181
  110. package/scripts/verify-v3-venues.mjs +0 -192
  111. package/skills/balance/SKILL.md +0 -176
  112. package/skills/oracle-action-semantics/SKILL.md +0 -40
  113. package/skills/oracle-best-execution/SKILL.md +0 -127
  114. package/skills/oracle-bitcoin/SKILL.md +0 -53
  115. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  116. package/skills/oracle-chat/SKILL.md +0 -61
  117. package/skills/oracle-chat/chain.SKILL.md +0 -31
  118. package/skills/oracle-chat/setup.SKILL.md +0 -37
  119. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  120. package/skills/oracle-contract-research/SKILL.md +0 -55
  121. package/skills/oracle-desk/SKILL.md +0 -58
  122. package/skills/oracle-dex-launch/SKILL.md +0 -38
  123. package/skills/oracle-grants/SKILL.md +0 -69
  124. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  125. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  126. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  127. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  128. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  129. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  130. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  131. package/skills/oracle-polymarket/SKILL.md +0 -60
  132. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  133. package/skills/oracle-protocol-security/SKILL.md +0 -60
  134. package/skills/oracle-public-product/SKILL.md +0 -44
  135. package/skills/oracle-receipts/SKILL.md +0 -52
  136. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  137. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  138. package/skills/oracle-solana/SKILL.md +0 -65
  139. package/skills/oracle-solana-nft/SKILL.md +0 -54
  140. package/skills/oracle-token-research/SKILL.md +0 -67
  141. package/skins/oracle.yaml +0 -56
  142. package/src/action-receipts.mjs +0 -265
  143. package/src/action-semantics.mjs +0 -62
  144. package/src/address-book.mjs +0 -208
  145. package/src/agent-auth.mjs +0 -206
  146. package/src/approval-guard.mjs +0 -282
  147. package/src/attestation-secret.mjs +0 -88
  148. package/src/audit-log.mjs +0 -196
  149. package/src/auth/oauth.mjs +0 -672
  150. package/src/auto-slippage.mjs +0 -378
  151. package/src/capability-posture.mjs +0 -125
  152. package/src/chains.mjs +0 -62
  153. package/src/cli/chain-catalog.mjs +0 -215
  154. package/src/cli/chain-state.mjs +0 -74
  155. package/src/cli/commands/auth.mjs +0 -193
  156. package/src/cli/commands/bootstrap.mjs +0 -87
  157. package/src/cli/commands/chain.mjs +0 -143
  158. package/src/cli/commands/chat.mjs +0 -434
  159. package/src/cli/commands/credential.mjs +0 -9
  160. package/src/cli/commands/data-mcp.mjs +0 -18
  161. package/src/cli/commands/data.mjs +0 -75
  162. package/src/cli/commands/doctor.mjs +0 -136
  163. package/src/cli/commands/help.mjs +0 -7
  164. package/src/cli/commands/init.mjs +0 -27
  165. package/src/cli/commands/mcp.mjs +0 -142
  166. package/src/cli/commands/model.mjs +0 -99
  167. package/src/cli/commands/prepare.mjs +0 -12
  168. package/src/cli/commands/public.mjs +0 -20
  169. package/src/cli/commands/route.mjs +0 -12
  170. package/src/cli/commands/runner.mjs +0 -9
  171. package/src/cli/commands/scan.mjs +0 -12
  172. package/src/cli/commands/setup.mjs +0 -275
  173. package/src/cli/commands/sign.mjs +0 -21
  174. package/src/cli/commands/signer.mjs +0 -9
  175. package/src/cli/commands/upgrade.mjs +0 -12
  176. package/src/cli/commands/vault.mjs +0 -9
  177. package/src/cli/commands/version.mjs +0 -22
  178. package/src/cli/first-run.mjs +0 -23
  179. package/src/cli/kernel.mjs +0 -239
  180. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  181. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  182. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  183. package/src/cli/mcp-targets/codex.mjs +0 -41
  184. package/src/cli/mcp-targets/shared.mjs +0 -61
  185. package/src/cli/messaging-platforms.mjs +0 -209
  186. package/src/cli/model-config.mjs +0 -70
  187. package/src/cli/operator-dispatch.mjs +0 -258
  188. package/src/cli/oracle-harness.py +0 -415
  189. package/src/cli/paths.mjs +0 -83
  190. package/src/cli/runtime.mjs +0 -351
  191. package/src/cli/setup-state.mjs +0 -168
  192. package/src/cli/spawn-child.mjs +0 -43
  193. package/src/data/catalog.mjs +0 -585
  194. package/src/data/desk-data.mjs +0 -695
  195. package/src/data/http.mjs +0 -253
  196. package/src/data/provider-endpoint.mjs +0 -94
  197. package/src/data/providers/aerodrome.mjs +0 -245
  198. package/src/data/providers/balancer.mjs +0 -209
  199. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  200. package/src/data/providers/bitcoin-meta.mjs +0 -378
  201. package/src/data/providers/blockscout.mjs +0 -14
  202. package/src/data/providers/bridges.mjs +0 -242
  203. package/src/data/providers/cowswap.mjs +0 -415
  204. package/src/data/providers/curve.mjs +0 -201
  205. package/src/data/providers/defillama.mjs +0 -88
  206. package/src/data/providers/dexscreener.mjs +0 -43
  207. package/src/data/providers/evm-rpc.mjs +0 -225
  208. package/src/data/providers/geckoterminal.mjs +0 -34
  209. package/src/data/providers/gmx.mjs +0 -496
  210. package/src/data/providers/hl-assets.mjs +0 -165
  211. package/src/data/providers/hl-info.mjs +0 -108
  212. package/src/data/providers/hl-markets.mjs +0 -210
  213. package/src/data/providers/hl-outcome.mjs +0 -61
  214. package/src/data/providers/hl-perps.mjs +0 -387
  215. package/src/data/providers/hl-staking.mjs +0 -353
  216. package/src/data/providers/hl-ws.mjs +0 -119
  217. package/src/data/providers/hyperevm-dex.mjs +0 -49
  218. package/src/data/providers/jupiter-venues.mjs +0 -119
  219. package/src/data/providers/jupiter.mjs +0 -315
  220. package/src/data/providers/lifi.mjs +0 -151
  221. package/src/data/providers/magiceden-sol.mjs +0 -406
  222. package/src/data/providers/morpho.mjs +0 -177
  223. package/src/data/providers/nft-gallery.mjs +0 -163
  224. package/src/data/providers/nft-portfolio.mjs +0 -494
  225. package/src/data/providers/odos.mjs +0 -156
  226. package/src/data/providers/oneinch.mjs +0 -174
  227. package/src/data/providers/opensea-multichain.mjs +0 -136
  228. package/src/data/providers/opensea-nft.mjs +0 -371
  229. package/src/data/providers/paraswap.mjs +0 -118
  230. package/src/data/providers/pendle.mjs +0 -188
  231. package/src/data/providers/poly-clob.mjs +0 -283
  232. package/src/data/providers/poly-public.mjs +0 -96
  233. package/src/data/providers/poly-ws.mjs +0 -103
  234. package/src/data/providers/portfolio-history.mjs +0 -394
  235. package/src/data/providers/portfolio.mjs +0 -594
  236. package/src/data/providers/rfq.mjs +0 -15
  237. package/src/data/providers/rh-agent.mjs +0 -59
  238. package/src/data/providers/satflow.mjs +0 -341
  239. package/src/data/providers/signed-material-guard.mjs +0 -108
  240. package/src/data/providers/solana-rpc.mjs +0 -197
  241. package/src/data/providers/uniswap-v3.mjs +0 -349
  242. package/src/data/providers/uniswap-v4.mjs +0 -414
  243. package/src/data/providers/zerox.mjs +0 -167
  244. package/src/data/public-api-scan.mjs +0 -61
  245. package/src/data/quote-placeholder.mjs +0 -31
  246. package/src/exact-integer.mjs +0 -72
  247. package/src/exec-policy.mjs +0 -455
  248. package/src/flags.mjs +0 -15
  249. package/src/fresh-window.mjs +0 -76
  250. package/src/gmx-attestation.mjs +0 -176
  251. package/src/index.mjs +0 -100
  252. package/src/nft-gas-war-guard.mjs +0 -139
  253. package/src/onboarding/agent-keys.mjs +0 -161
  254. package/src/onboarding/harness-configs.mjs +0 -102
  255. package/src/onboarding/index.mjs +0 -18
  256. package/src/onboarding/tiers.mjs +0 -139
  257. package/src/oracle-env.mjs +0 -47
  258. package/src/portfolio-risk.mjs +0 -170
  259. package/src/prepare-envelope.mjs +0 -204
  260. package/src/profile-upgrade.mjs +0 -277
  261. package/src/protocol-execution.mjs +0 -84
  262. package/src/protocol-templates/gate.mjs +0 -179
  263. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  264. package/src/public-api/buzz-integration.mjs +0 -256
  265. package/src/public-api/connect-agent.mjs +0 -416
  266. package/src/public-api/grants.mjs +0 -142
  267. package/src/public-api/http.mjs +0 -389
  268. package/src/public-control/aa-adapter.mjs +0 -402
  269. package/src/public-control/build-registry.mjs +0 -227
  270. package/src/public-control/bundler-client.mjs +0 -357
  271. package/src/public-control/grant-indexer.mjs +0 -296
  272. package/src/public-control/policy-render.mjs +0 -69
  273. package/src/public-control/policy-schema.mjs +0 -318
  274. package/src/public-control/runtime-config.mjs +0 -275
  275. package/src/public-control/session-key-model.mjs +0 -374
  276. package/src/public-control/session-orchestrator.mjs +0 -412
  277. package/src/rfq/intent.mjs +0 -180
  278. package/src/rfq/sources.mjs +0 -181
  279. package/src/route-attestation.mjs +0 -132
  280. package/src/router/best-execution.mjs +0 -326
  281. package/src/router/index.mjs +0 -226
  282. package/src/router/prepare-bridge.mjs +0 -289
  283. package/src/router/prepare-route.mjs +0 -398
  284. package/src/router/proposal.mjs +0 -311
  285. package/src/router/risk-classifier.mjs +0 -119
  286. package/src/router/route-sources.mjs +0 -364
  287. package/src/scanner/chains.config.mjs +0 -430
  288. package/src/scanner/contract.mjs +0 -270
  289. package/src/scanner/evm-scanner.mjs +0 -394
  290. package/src/scanner/index.mjs +0 -9
  291. package/src/scanner/v2-venue.mjs +0 -335
  292. package/src/scanner/v3-venue.mjs +0 -290
  293. package/src/scopes.mjs +0 -44
  294. package/src/sell-simulation.mjs +0 -167
  295. package/src/signals/engine.mjs +0 -146
  296. package/src/signals/index.mjs +0 -1
  297. package/src/token-transfer-guard.mjs +0 -188
  298. package/src/tui/app.mjs +0 -438
  299. package/src/tui/backend.mjs +0 -145
  300. package/src/tui/format.mjs +0 -272
  301. package/src/tui/gateway-client.mjs +0 -177
  302. package/src/tui/input.mjs +0 -501
  303. package/src/tui/renderer.mjs +0 -443
  304. package/src/tui/standalone-client.mjs +0 -666
  305. package/src/tui/theme.mjs +0 -81
  306. package/src/vault-attestation.mjs +0 -146
  307. package/src/venues.mjs +0 -206
  308. package/src/watch-preferences.mjs +0 -85
@@ -1,108 +0,0 @@
1
- // Hyperliquid public info client — read-only, no agent key.
2
-
3
- import { httpJson } from "../http.mjs";
4
-
5
- export const HL_INFO_MAINNET = "https://api.hyperliquid.xyz/info";
6
- export const HL_INFO_TESTNET = "https://api.hyperliquid-testnet.xyz/info";
7
-
8
- function infoUrl({ testnet, baseUrl } = {}) {
9
- if (baseUrl) {
10
- return baseUrl.replace(/\/$/, "").endsWith("/info")
11
- ? baseUrl
12
- : `${baseUrl.replace(/\/$/, "")}/info`;
13
- }
14
- if (process.env.HL_INFO_URL) return process.env.HL_INFO_URL;
15
- if (process.env.HL_API_URL) {
16
- const b = process.env.HL_API_URL.replace(/\/$/, "");
17
- return b.endsWith("/info") ? b : `${b}/info`;
18
- }
19
- return testnet || process.env.HL_TESTNET === "1" ? HL_INFO_TESTNET : HL_INFO_MAINNET;
20
- }
21
-
22
- export async function hlInfo(body, opts = {}) {
23
- if (!body || !body.type) throw new Error("hlInfo requires body.type");
24
- const url = infoUrl(opts);
25
- return httpJson(url, {
26
- method: "POST",
27
- body,
28
- fetchImpl: opts.fetchImpl,
29
- timeoutMs: opts.timeoutMs,
30
- });
31
- }
32
-
33
- export async function hlHealth(opts = {}) {
34
- const mids = await hlInfo({ type: "allMids" }, opts);
35
- const n = mids && typeof mids === "object" ? Object.keys(mids).length : 0;
36
- return { ok: n > 0, midCount: n };
37
- }
38
-
39
- export async function hlAllMids(opts = {}) {
40
- return hlInfo({ type: "allMids" }, opts);
41
- }
42
-
43
- export async function hlL2Book(coin, opts = {}) {
44
- if (!coin) throw new Error("hlL2Book requires coin");
45
- return hlInfo({ type: "l2Book", coin: String(coin) }, opts);
46
- }
47
-
48
- export async function hlOutcomeMeta(opts = {}) {
49
- return hlInfo({ type: "outcomeMeta" }, opts);
50
- }
51
-
52
- export async function hlClearinghouse(user, opts = {}) {
53
- if (!user) throw new Error("hlClearinghouse requires user address");
54
- return hlInfo({ type: "spotClearinghouseState", user }, opts);
55
- }
56
-
57
- export async function hlUserFills(user, opts = {}) {
58
- if (!user) throw new Error("hlUserFills requires user address");
59
- return hlInfo({ type: "userFills", user }, opts);
60
- }
61
-
62
- // D1 expansions
63
- export async function hlMeta(opts = {}) {
64
- return hlInfo({ type: "meta" }, opts);
65
- }
66
-
67
- export async function hlMetaAndAssetCtxs(opts = {}) {
68
- const body = { type: "metaAndAssetCtxs" };
69
- if (opts.dex) body.dex = opts.dex;
70
- return hlInfo(body, opts);
71
- }
72
-
73
- export async function hlPerpDexs(opts = {}) {
74
- return hlInfo({ type: "perpDexs" }, opts);
75
- }
76
-
77
- export async function hlCandleSnapshot({ coin, interval = "1h", startTime, endTime }, opts = {}) {
78
- if (!coin) throw new Error("hlCandleSnapshot requires coin");
79
- const req = {
80
- type: "candleSnapshot",
81
- req: {
82
- coin: String(coin),
83
- interval,
84
- startTime: startTime ?? Date.now() - 24 * 3600 * 1000,
85
- endTime: endTime ?? Date.now(),
86
- },
87
- };
88
- return hlInfo(req, opts);
89
- }
90
-
91
- export async function hlOpenOrders(user, opts = {}) {
92
- if (!user) throw new Error("hlOpenOrders requires user");
93
- return hlInfo({ type: "openOrders", user }, opts);
94
- }
95
-
96
- export async function hlFrontendOpenOrders(user, opts = {}) {
97
- if (!user) throw new Error("hlFrontendOpenOrders requires user");
98
- return hlInfo({ type: "frontendOpenOrders", user }, opts);
99
- }
100
-
101
- export async function hlUserState(user, opts = {}) {
102
- if (!user) throw new Error("hlUserState requires user");
103
- return hlInfo({ type: "clearinghouseState", user }, opts);
104
- }
105
-
106
- export async function hlSpotMeta(opts = {}) {
107
- return hlInfo({ type: "spotMeta" }, opts);
108
- }
@@ -1,210 +0,0 @@
1
- // Hyperliquid market datapoints for the Hyperliquid agent.
2
- //
3
- // The raw /info endpoints return parallel arrays and stringly-typed numbers
4
- // that every consumer ends up re-deriving: universe[i] pairs with assetCtxs[i],
5
- // funding is an 8-hour decimal that people want annualized, open interest is
6
- // denominated in the coin rather than USD. Doing that join once, here, keeps
7
- // every chart and card consistent instead of each one inventing its own math.
8
- //
9
- // Reads only. No keys, no signing.
10
-
11
- import { hlMetaAndAssetCtxs, hlAllMids, hlCandleSnapshot, hlL2Book, hlSpotMeta } from "./hl-info.mjs";
12
-
13
- /** Liveness: the media lane is healthy when the underlying info plane answers. */
14
- export async function hlMarketsHealth(opts = {}) {
15
- const t0 = Date.now();
16
- try {
17
- const mids = await hlAllMids(opts);
18
- return {
19
- provider: "hl-markets",
20
- ok: true,
21
- venue: "hyperliquid",
22
- symbols: Object.keys(mids || {}).length,
23
- latencyMs: Date.now() - t0,
24
- };
25
- } catch (e) {
26
- return { provider: "hl-markets", ok: false, error: String(e?.message || e), latencyMs: Date.now() - t0 };
27
- }
28
- }
29
-
30
- const HOURS_PER_YEAR = 24 * 365;
31
- const FUNDING_INTERVAL_HOURS = 8;
32
-
33
- function num(value) {
34
- if (value == null) return null;
35
- const n = Number(value);
36
- return Number.isFinite(n) ? n : null;
37
- }
38
-
39
- function pct(a, b) {
40
- if (a == null || b == null || b === 0) return null;
41
- return ((a - b) / b) * 100;
42
- }
43
-
44
- /**
45
- * Join the perp universe with its asset contexts into one flat row per market.
46
- *
47
- * This is THE datapoint set for an Hyperliquid agent board: price, 24h change, volume,
48
- * open interest in both coin and USD, funding (interval + annualized), and the
49
- * leverage/decimals metadata needed to render or size an order.
50
- */
51
- export async function hlMarketDatapoints(args = {}, opts = {}) {
52
- const [meta, mids] = await Promise.all([
53
- hlMetaAndAssetCtxs(opts),
54
- hlAllMids(opts).catch(() => ({})),
55
- ]);
56
-
57
- // metaAndAssetCtxs returns [ { universe: [...] }, [ ctx, ... ] ]
58
- const universe = meta?.[0]?.universe ?? meta?.universe ?? [];
59
- const ctxs = Array.isArray(meta?.[1]) ? meta[1] : [];
60
-
61
- const rows = universe.map((asset, i) => {
62
- const ctx = ctxs[i] || {};
63
- const mark = num(ctx.markPx);
64
- const prev = num(ctx.prevDayPx);
65
- const oiCoin = num(ctx.openInterest);
66
- const funding = num(ctx.funding);
67
-
68
- return {
69
- coin: asset.name,
70
- index: i,
71
- markPx: mark,
72
- oraclePx: num(ctx.oraclePx),
73
- midPx: num(ctx.midPx) ?? num(mids?.[asset.name]),
74
- prevDayPx: prev,
75
- change24hPct: pct(mark, prev),
76
- dayNtlVolumeUsd: num(ctx.dayNtlVlm),
77
- premium: num(ctx.premium),
78
- // funding is the per-8h rate as a decimal; both forms are useful and
79
- // people get the conversion wrong constantly.
80
- fundingRate: funding,
81
- fundingRateAprPct: funding == null ? null : funding * (HOURS_PER_YEAR / FUNDING_INTERVAL_HOURS) * 100,
82
- openInterestCoin: oiCoin,
83
- openInterestUsd: oiCoin == null || mark == null ? null : oiCoin * mark,
84
- maxLeverage: asset.maxLeverage ?? null,
85
- szDecimals: asset.szDecimals ?? null,
86
- isDelisted: Boolean(asset.isDelisted),
87
- };
88
- });
89
-
90
- const live = rows.filter((r) => !r.isDelisted);
91
- return {
92
- provider: "hl-info",
93
- venue: "hyperliquid",
94
- kind: "market-datapoints",
95
- asOfMs: Date.now(),
96
- count: live.length,
97
- markets: live,
98
- totals: {
99
- openInterestUsd: live.reduce((a, r) => a + (r.openInterestUsd || 0), 0),
100
- dayNtlVolumeUsd: live.reduce((a, r) => a + (r.dayNtlVolumeUsd || 0), 0),
101
- },
102
- };
103
- }
104
-
105
- /** Top movers / volume / OI / funding leaders — the standard board cuts. */
106
- export async function hlLeaderboards(args = {}, opts = {}) {
107
- const limit = Math.max(1, Math.min(Number(args.limit) || 10, 50));
108
- const { markets, asOfMs, totals } = await hlMarketDatapoints(args, opts);
109
-
110
- const by = (key, dir = -1) =>
111
- markets
112
- .filter((m) => m[key] != null)
113
- .sort((a, b) => (a[key] - b[key]) * dir)
114
- .slice(0, limit);
115
-
116
- return {
117
- provider: "hl-info",
118
- venue: "hyperliquid",
119
- kind: "leaderboards",
120
- asOfMs,
121
- totals,
122
- gainers: by("change24hPct"),
123
- losers: by("change24hPct", 1),
124
- byVolume: by("dayNtlVolumeUsd"),
125
- byOpenInterest: by("openInterestUsd"),
126
- fundingHighest: by("fundingRateAprPct"),
127
- fundingLowest: by("fundingRateAprPct", 1),
128
- };
129
- }
130
-
131
- /**
132
- * One coin, everything a segment or card needs: current state, the recent
133
- * candle series, and top-of-book depth.
134
- */
135
- export async function hlCoinDatapoints(args = {}, opts = {}) {
136
- const coin = String(args.coin || args.symbol || "").trim().toUpperCase();
137
- if (!coin) throw new Error("hl-markets: coin required");
138
- const interval = String(args.interval || "1h");
139
- const lookbackMs = Number(args.lookbackMs) || 24 * 60 * 60 * 1000;
140
- const endTime = Date.now();
141
- const startTime = endTime - lookbackMs;
142
-
143
- const [board, candles, book] = await Promise.all([
144
- hlMarketDatapoints({}, opts),
145
- hlCandleSnapshot({ coin, interval, startTime, endTime }, opts).catch(() => []),
146
- // hlL2Book takes a bare coin string, not an args object.
147
- hlL2Book(coin, opts).catch(() => null),
148
- ]);
149
-
150
- const market = board.markets.find((m) => m.coin === coin) || null;
151
- if (!market) throw new Error(`hl-markets: ${coin} is not a listed perp`);
152
-
153
- const series = (Array.isArray(candles) ? candles : []).map((c) => ({
154
- t: Number(c.t),
155
- open: num(c.o),
156
- high: num(c.h),
157
- low: num(c.l),
158
- close: num(c.c),
159
- volume: num(c.v),
160
- }));
161
-
162
- const levels = book?.levels ?? [];
163
- const bestBid = num(levels?.[0]?.[0]?.px);
164
- const bestAsk = num(levels?.[1]?.[0]?.px);
165
-
166
- return {
167
- provider: "hl-info",
168
- venue: "hyperliquid",
169
- kind: "coin-datapoints",
170
- asOfMs: Date.now(),
171
- coin,
172
- market,
173
- book: {
174
- bestBid,
175
- bestAsk,
176
- spread: bestBid == null || bestAsk == null ? null : bestAsk - bestBid,
177
- spreadBps: bestBid == null || bestAsk == null || bestAsk === 0 ? null : ((bestAsk - bestBid) / bestAsk) * 10_000,
178
- },
179
- candles: { interval, count: series.length, series },
180
- };
181
- }
182
-
183
- /** Spot pairs, joined the same way. */
184
- export async function hlSpotDatapoints(args = {}, opts = {}) {
185
- const spot = await hlSpotMeta(opts);
186
- const tokens = spot?.tokens ?? [];
187
- const pairs = spot?.universe ?? [];
188
- return {
189
- provider: "hl-info",
190
- venue: "hyperliquid",
191
- kind: "spot-datapoints",
192
- asOfMs: Date.now(),
193
- tokenCount: tokens.length,
194
- pairCount: pairs.length,
195
- tokens: tokens.map((t) => ({
196
- name: t.name,
197
- index: t.index,
198
- szDecimals: t.szDecimals ?? null,
199
- weiDecimals: t.weiDecimals ?? null,
200
- tokenId: t.tokenId ?? null,
201
- isCanonical: Boolean(t.isCanonical),
202
- })),
203
- pairs: pairs.map((p) => ({
204
- name: p.name,
205
- index: p.index,
206
- tokens: p.tokens,
207
- isCanonical: Boolean(p.isCanonical),
208
- })),
209
- };
210
- }
@@ -1,61 +0,0 @@
1
- // HIP-4 outcome market prepare helpers (local, no VPS).
2
- import { stampPrepared } from "../../prepare-envelope.mjs";
3
- import { hlOutcomeMeta } from "./hl-info.mjs";
4
- import { outcomeAssetId, parseOutcomeCoin } from "./hl-assets.mjs";
5
- import { hlPreparePerpOrder, hlPrepareCancelOrder } from "./hl-perps.mjs";
6
-
7
- export async function hlOutcomeList(opts = {}) {
8
- const meta = await hlOutcomeMeta(opts);
9
- return {
10
- provider: "hl-outcome",
11
- kind: "outcome-meta",
12
- outcomes: meta?.outcomes || [],
13
- questions: meta?.questions || [],
14
- };
15
- }
16
-
17
- /**
18
- * Prepare a HIP-4 outcome order.
19
- * args: { outcome, side: 0|1|'yes'|'no', sideName?, coin?, ...hlPreparePerpOrder fields }
20
- */
21
- export async function hlPrepareOutcomeOrder(args = {}, opts = {}) {
22
- let coin = args.coin;
23
- let outcome = args.outcome;
24
- let side = args.side;
25
- if (typeof side === "string") {
26
- const s = side.toLowerCase();
27
- if (s === "yes" || s === "0") side = 0;
28
- else if (s === "no" || s === "1") side = 1;
29
- }
30
- if (args.sideName && outcome != null) {
31
- const meta = await hlOutcomeMeta(opts);
32
- const o = (meta?.outcomes || []).find((x) => Number(x.outcome) === Number(outcome));
33
- if (o?.sideSpecs) {
34
- const idx = o.sideSpecs.findIndex(
35
- (sp) => String(sp.name).toLowerCase() === String(args.sideName).toLowerCase()
36
- );
37
- if (idx >= 0) side = idx;
38
- }
39
- }
40
- if (!coin) {
41
- if (outcome == null || side == null) {
42
- throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");
43
- }
44
- coin = outcomeAssetId(outcome, side).coin;
45
- }
46
- const prepared = await hlPreparePerpOrder({ ...args, coin }, opts);
47
- // ensure stamped kind
48
- return stampPrepared(
49
- { ...prepared, kind: "hip4-order", provider: "hl-perps" },
50
- { provider: "hl-perps", kind: "hip4-order" }
51
- );
52
- }
53
-
54
- export async function hlPrepareOutcomeCancel(args = {}, opts = {}) {
55
- let coin = args.coin;
56
- if (!coin && args.outcome != null) {
57
- const side = args.side ?? 0;
58
- coin = outcomeAssetId(args.outcome, side).coin;
59
- }
60
- return hlPrepareCancelOrder({ ...args, coin }, opts);
61
- }