@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,387 +0,0 @@
1
- // Hyperliquid perpetuals: orders, leverage, and position management.
2
- //
3
- // PREPARE-ONLY. Every function here returns EIP-712 typed data plus the exact
4
- // action payload the user's wallet will sign. Nothing in this file signs,
5
- // submits, or broadcasts — there is deliberately no submit function, and a
6
- // test asserts that no write-shaped export ever appears.
7
- //
8
- // Why the arithmetic is fussy: Hyperliquid rejects orders whose price or size
9
- // carry more precision than the asset allows, and a rejected order at the wrong
10
- // moment is indistinguishable from a missed fill. Prices allow at most 5
11
- // significant figures and (6 - szDecimals) decimal places for perps; sizes are
12
- // rounded to szDecimals. Integers are always allowed regardless of sig figs.
13
- // We do that rounding here, once, in decimal — never through a float.
14
-
15
- import { hlMetaAndAssetCtxs, hlAllMids } from "./hl-info.mjs";
16
- import { resolveHlAsset } from "./hl-assets.mjs";
17
- import { toScaledInteger } from "../../exact-integer.mjs";
18
- import { stampPrepared } from "../../prepare-envelope.mjs";
19
-
20
- export const HL_PERP_MAX_SIG_FIGS = 5;
21
- export const HL_PERP_PRICE_DECIMALS = 6; // 6 - szDecimals for perps
22
- export const HL_SIGNATURE_CHAIN_ID = "0x66eee";
23
-
24
- export const ORDER_TYPES = Object.freeze({
25
- LIMIT: "limit",
26
- MARKET: "market",
27
- STOP_MARKET: "stopMarket",
28
- STOP_LIMIT: "stopLimit",
29
- TAKE_PROFIT_MARKET: "takeProfitMarket",
30
- TAKE_PROFIT_LIMIT: "takeProfitLimit",
31
- });
32
-
33
- export const TIF = Object.freeze({
34
- GTC: "Gtc", // rest on the book
35
- IOC: "Ioc", // fill what you can, cancel the rest
36
- ALO: "Alo", // add liquidity only; rejected if it would cross
37
- });
38
-
39
- export const MARGIN_MODE = Object.freeze({
40
- CROSS: "cross",
41
- ISOLATED: "isolated",
42
- });
43
-
44
- /** Exact decimal rounding — no floats, so 0.1+0.2 problems cannot appear. */
45
- function roundDecimal(value, maxDecimals, { roundDown = null } = {}) {
46
- // `value` may arrive as a JS number from price math; normalise without
47
- // exponent notation, which BigInt cannot parse.
48
- const text = typeof value === "number" ? value.toFixed(Math.min(20, maxDecimals + 8)) : String(value).trim();
49
- if (!/^-?\d+(\.\d+)?$/.test(text)) throw new Error(`hl-perps: "${value}" is not a decimal number`);
50
- const neg = text.startsWith("-");
51
- const [intPart, fracPart = ""] = text.replace(/^-/, "").split(".");
52
- if (fracPart.length <= maxDecimals) {
53
- const trimmed = fracPart.replace(/0+$/, "");
54
- return (neg ? "-" : "") + (trimmed ? `${intPart}.${trimmed}` : intPart);
55
- }
56
- // Round on the exact decimal string. `roundDown` forces truncation (toward
57
- // zero) or ceiling, which callers use to guarantee a bound is never crossed
58
- // by the rounding itself; otherwise round half-up.
59
- const keep = fracPart.slice(0, maxDecimals);
60
- const nextDigit = Number(fracPart[maxDecimals]);
61
- let scaled = BigInt(intPart + keep);
62
- const remainder = fracPart.slice(maxDecimals).replace(/0+$/, "") !== "";
63
- if (roundDown === true) {
64
- // truncate: scaled already floors the magnitude
65
- } else if (roundDown === false) {
66
- if (remainder) scaled += 1n;
67
- } else if (nextDigit >= 5) {
68
- scaled += 1n;
69
- }
70
- const s = scaled.toString().padStart(maxDecimals + 1, "0");
71
- const cut = maxDecimals === 0 ? s : `${s.slice(0, -maxDecimals)}.${s.slice(-maxDecimals)}`;
72
- const cleaned = cut.replace(/(\.\d*?)0+$/, "$1").replace(/\.$/, "");
73
- return (neg ? "-" : "") + cleaned;
74
- }
75
-
76
- /** Significant-figure clamp. Integers are exempt, per Hyperliquid's rule. */
77
- function clampSigFigs(value, sigFigs, opts = {}) {
78
- const text = String(value);
79
- if (!text.includes(".")) return text; // integer prices are always allowed
80
- const n = Number(text);
81
- if (!Number.isFinite(n) || n === 0) return text;
82
- const magnitude = Math.floor(Math.log10(Math.abs(n)));
83
- const decimals = Math.max(0, sigFigs - 1 - magnitude);
84
- return roundDecimal(text, decimals, opts);
85
- }
86
-
87
- /**
88
- * Format a price for a given asset. Applies BOTH constraints: at most 5
89
- * significant figures AND at most (6 - szDecimals) decimal places.
90
- */
91
- export function formatPerpPrice(price, szDecimals, opts = {}) {
92
- const maxDecimals = HL_PERP_PRICE_DECIMALS - Number(szDecimals ?? 0);
93
- if (maxDecimals < 0) throw new Error("hl-perps: szDecimals out of range");
94
- return roundDecimal(clampSigFigs(price, HL_PERP_MAX_SIG_FIGS, opts), maxDecimals, opts);
95
- }
96
-
97
- /** Format an order size to the asset's size precision. */
98
- export function formatPerpSize(size, szDecimals) {
99
- const out = roundDecimal(size, Number(szDecimals ?? 0));
100
- if (BigInt(out.split(".")[0]) < 0n) throw new Error("hl-perps: size must be positive");
101
- if (Number(out) <= 0) throw new Error("hl-perps: size rounds to zero at this asset's precision");
102
- return out;
103
- }
104
-
105
- /** Resolve a coin to its asset index and precision. Required before ordering. */
106
- export async function hlPerpAssetInfo(args = {}, opts = {}) {
107
- // Resolves main perps, HIP-3 builder dexs (dex:COIN), and HIP-4 outcomes (#N / outcome+side).
108
- const info = await resolveHlAsset(args, opts);
109
- return {
110
- coin: info.coin,
111
- assetId: info.assetId,
112
- szDecimals: info.szDecimals,
113
- maxLeverage: info.maxLeverage,
114
- markPx: info.markPx,
115
- kind: info.kind,
116
- dex: info.dex ?? null,
117
- outcome: info.outcome ?? null,
118
- side: info.side ?? null,
119
- };
120
- }
121
-
122
- function orderTypeWire(kind, { tif = TIF.GTC, triggerPx, isMarket, szDecimals } = {}) {
123
- switch (kind) {
124
- case ORDER_TYPES.LIMIT:
125
- return { limit: { tif } };
126
- case ORDER_TYPES.MARKET:
127
- // A "market" order on Hyperliquid is an IOC limit at an aggressive price.
128
- return { limit: { tif: TIF.IOC } };
129
- case ORDER_TYPES.STOP_MARKET:
130
- case ORDER_TYPES.TAKE_PROFIT_MARKET:
131
- return {
132
- trigger: {
133
- isMarket: true,
134
- triggerPx: formatPerpPrice(triggerPx, szDecimals),
135
- tpsl: kind === ORDER_TYPES.STOP_MARKET ? "sl" : "tp",
136
- },
137
- };
138
- case ORDER_TYPES.STOP_LIMIT:
139
- case ORDER_TYPES.TAKE_PROFIT_LIMIT:
140
- return {
141
- trigger: {
142
- isMarket: false,
143
- triggerPx: formatPerpPrice(triggerPx, szDecimals),
144
- tpsl: kind === ORDER_TYPES.STOP_LIMIT ? "sl" : "tp",
145
- },
146
- };
147
- default:
148
- throw new Error(`hl-perps: unknown order type ${kind}`);
149
- }
150
- }
151
-
152
- function envelope(action, nonce) {
153
- return {
154
- action,
155
- nonce,
156
- signatureChainId: HL_SIGNATURE_CHAIN_ID,
157
- submitTo: "https://api.hyperliquid.xyz/exchange",
158
- note: "Sign locally via @oracle-agent/operator or a wallet. Oracle does not submit.",
159
- };
160
- }
161
-
162
- /** Stamp a full HL prepare result (provider/kind + action envelope). */
163
- function stamped(result) {
164
- return stampPrepared(result, { provider: result.provider || "hl-perps", kind: result.kind });
165
- }
166
-
167
- /**
168
- * Prepare a perp order.
169
- *
170
- * Guardrails, all enforced BEFORE anything is built:
171
- * - size and price rounded to the asset's exact precision
172
- * - a limit order must state a price; a market order must state a slippage cap
173
- * - `maxSlippageBps` is capped at 100 bps, matching every other Oracle venue
174
- * - reduce-only is explicit, never inferred
175
- */
176
- export async function hlPreparePerpOrder(args = {}, opts = {}) {
177
- const info = await hlPerpAssetInfo(args, opts);
178
- const kind = String(args.type || ORDER_TYPES.LIMIT);
179
- const isBuy = args.side ? String(args.side).toLowerCase() === "buy" : Boolean(args.isBuy);
180
- const reduceOnly = Boolean(args.reduceOnly);
181
- const size = formatPerpSize(args.size ?? args.sz, info.szDecimals);
182
-
183
- let price;
184
- if (kind === ORDER_TYPES.MARKET) {
185
- let mark = Number(info.markPx);
186
- if (!Number.isFinite(mark)) {
187
- const mids = await hlAllMids(opts);
188
- mark = Number(mids?.[info.coin] ?? mids?.[String(info.assetId)] ?? NaN);
189
- }
190
- if (!Number.isFinite(mark)) throw new Error("hl-perps: no mark price available for a market order");
191
- const bps = Number(args.maxSlippageBps ?? 50);
192
- if (!Number.isInteger(bps) || bps < 0) throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");
193
- if (bps > 100) throw new Error(`hl-perps: maxSlippageBps ${bps} exceeds the hard 100 bps cap`);
194
- // Aggressive IOC price: cross the book by at most the allowed slippage.
195
- // Rounding to the venue's tick can push the limit BACK past the cap
196
- // (0.0012345 * 1.01 rounds to 0.001247 = 101.26 bps), so round toward the
197
- // mark — down for a buy, up for a sell — and verify the realised bps.
198
- const rawLimit = isBuy ? mark * (1 + bps / 10_000) : mark * (1 - bps / 10_000);
199
- price = formatPerpPrice(rawLimit, info.szDecimals, { roundDown: isBuy });
200
- const realisedBps = Math.abs(Number(price) / mark - 1) * 10_000;
201
- if (realisedBps > bps + 1e-9) {
202
- throw new Error(
203
- `hl-perps: tick rounding makes the limit ${realisedBps.toFixed(2)} bps from mark, above the ${bps} bps cap`
204
- );
205
- }
206
- } else {
207
- if (args.price == null && args.limitPx == null) {
208
- throw new Error("hl-perps: a limit order requires an explicit price");
209
- }
210
- price = formatPerpPrice(args.price ?? args.limitPx, info.szDecimals);
211
- }
212
-
213
- const orderType = orderTypeWire(kind, {
214
- tif: args.tif ?? (kind === ORDER_TYPES.MARKET ? TIF.IOC : TIF.GTC),
215
- triggerPx: args.triggerPx,
216
- szDecimals: info.szDecimals,
217
- });
218
-
219
- const order = {
220
- a: info.assetId,
221
- b: isBuy,
222
- p: price,
223
- s: size,
224
- r: reduceOnly,
225
- t: orderType,
226
- };
227
- if (args.clientOrderId) order.c = String(args.clientOrderId);
228
-
229
- const action = {
230
- type: "order",
231
- orders: [order],
232
- grouping: args.grouping || "na",
233
- };
234
-
235
- const nonce = Number(args.nonce ?? Date.now());
236
- const notional = Number(price) * Number(size);
237
-
238
- return stamped({
239
- provider: "hl-perps",
240
- venue: "hyperliquid",
241
- kind: info.kind === "outcome" ? "hip4-order" : info.kind === "hip3" ? "hip3-order" : "perp-order",
242
- coin: info.coin,
243
- assetId: info.assetId,
244
- assetKind: info.kind,
245
- outcome: info.outcome ?? null,
246
- outcomeSide: info.side ?? null,
247
- dex: info.dex ?? null,
248
- side: isBuy ? "buy" : "sell",
249
- orderType: kind,
250
- price,
251
- size,
252
- reduceOnly,
253
- notionalUsd: Number.isFinite(notional) ? notional : null,
254
- maxLeverage: info.maxLeverage,
255
- markPx: info.markPx,
256
- ...envelope(action, nonce),
257
- });
258
- }
259
-
260
- /** Prepare a cancel by order id. */
261
- export async function hlPrepareCancelOrder(args = {}, opts = {}) {
262
- const info = await hlPerpAssetInfo(args, opts);
263
- const oid = args.orderId ?? args.oid;
264
- if (oid == null) throw new Error("hl-perps: orderId required");
265
- const action = { type: "cancel", cancels: [{ a: info.assetId, o: Number(oid) }] };
266
- return stamped({
267
- provider: "hl-perps",
268
- venue: "hyperliquid",
269
- kind: "perp-cancel",
270
- coin: info.coin,
271
- orderId: Number(oid),
272
- ...envelope(action, Number(args.nonce ?? Date.now())),
273
- });
274
- }
275
-
276
- /**
277
- * Prepare a leverage change.
278
- * Cross vs isolated is an explicit choice: isolated caps loss to the margin
279
- * posted on that position, cross shares the whole account balance.
280
- */
281
- export async function hlPrepareUpdateLeverage(args = {}, opts = {}) {
282
- const info = await hlPerpAssetInfo(args, opts);
283
- const leverage = Number(args.leverage);
284
- if (!Number.isInteger(leverage) || leverage < 1) {
285
- throw new Error("hl-perps: leverage must be a positive integer");
286
- }
287
- if (info.maxLeverage != null && leverage > info.maxLeverage) {
288
- throw new Error(`hl-perps: ${info.coin} allows at most ${info.maxLeverage}x, requested ${leverage}x`);
289
- }
290
- const mode = String(args.marginMode || MARGIN_MODE.CROSS).toLowerCase();
291
- if (mode !== MARGIN_MODE.CROSS && mode !== MARGIN_MODE.ISOLATED) {
292
- throw new Error(`hl-perps: marginMode must be "cross" or "isolated"`);
293
- }
294
- const action = {
295
- type: "updateLeverage",
296
- asset: info.assetId,
297
- isCross: mode === MARGIN_MODE.CROSS,
298
- leverage,
299
- };
300
- return stamped({
301
- provider: "hl-perps",
302
- venue: "hyperliquid",
303
- kind: "perp-leverage",
304
- coin: info.coin,
305
- leverage,
306
- marginMode: mode,
307
- maxLeverage: info.maxLeverage,
308
- liquidationWarning:
309
- leverage >= 20
310
- ? `${leverage}x liquidates on roughly a ${(100 / leverage).toFixed(2)}% adverse move before fees`
311
- : null,
312
- ...envelope(action, Number(args.nonce ?? Date.now())),
313
- });
314
- }
315
-
316
- /** Prepare an isolated-margin adjustment for an existing position. */
317
- export async function hlPrepareUpdateIsolatedMargin(args = {}, opts = {}) {
318
- const info = await hlPerpAssetInfo(args, opts);
319
- const usd = args.usd ?? args.amountUsd;
320
- if (usd == null) throw new Error("hl-perps: usd amount required");
321
- const text = String(usd).trim();
322
- if (!/^-?\d+(\.\d+)?$/.test(text)) throw new Error("hl-perps: usd must be a decimal number");
323
- // Hyperliquid takes this in micro-USD as an integer. The old padEnd() sized
324
- // the result from the NUMERIC magnitude, so "01.5" scaled 10x too small and
325
- // silently under-posted margin. Scale by exact string arithmetic instead.
326
- const micro = toScaledInteger(text, 6, "hl-perps: usd");
327
- const action = {
328
- type: "updateIsolatedMargin",
329
- asset: info.assetId,
330
- isBuy: true,
331
- ntli: micro <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(micro) : micro.toString(),
332
- };
333
- return stamped({
334
- provider: "hl-perps",
335
- venue: "hyperliquid",
336
- kind: "perp-isolated-margin",
337
- coin: info.coin,
338
- usd: text,
339
- ...envelope(action, Number(args.nonce ?? Date.now())),
340
- });
341
- }
342
-
343
- /**
344
- * Prepare a bracket: entry plus take-profit and/or stop-loss as reduce-only
345
- * triggers. Grouped so the venue treats them as one position's protection.
346
- */
347
- export async function hlPrepareBracketOrder(args = {}, opts = {}) {
348
- const entry = await hlPreparePerpOrder(args, opts);
349
- const info = await hlPerpAssetInfo(args, opts);
350
- const isBuy = entry.side === "buy";
351
- const orders = [entry.action.orders[0]];
352
-
353
- if (args.takeProfitPx != null) {
354
- orders.push({
355
- a: info.assetId,
356
- b: !isBuy,
357
- p: formatPerpPrice(args.takeProfitPx, info.szDecimals),
358
- s: entry.size,
359
- r: true,
360
- t: orderTypeWire(ORDER_TYPES.TAKE_PROFIT_MARKET, { triggerPx: args.takeProfitPx, szDecimals: info.szDecimals }),
361
- });
362
- }
363
- if (args.stopLossPx != null) {
364
- orders.push({
365
- a: info.assetId,
366
- b: !isBuy,
367
- p: formatPerpPrice(args.stopLossPx, info.szDecimals),
368
- s: entry.size,
369
- r: true,
370
- t: orderTypeWire(ORDER_TYPES.STOP_MARKET, { triggerPx: args.stopLossPx, szDecimals: info.szDecimals }),
371
- });
372
- }
373
- if (orders.length === 1) throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");
374
-
375
- const action = { type: "order", orders, grouping: "normalTpsl" };
376
- return stamped({
377
- provider: "hl-perps",
378
- venue: "hyperliquid",
379
- kind: "perp-bracket",
380
- coin: info.coin,
381
- legs: orders.length,
382
- entry: { side: entry.side, price: entry.price, size: entry.size },
383
- takeProfitPx: args.takeProfitPx == null ? null : formatPerpPrice(args.takeProfitPx, info.szDecimals),
384
- stopLossPx: args.stopLossPx == null ? null : formatPerpPrice(args.stopLossPx, info.szDecimals),
385
- ...envelope(action, Number(args.nonce ?? Date.now())),
386
- });
387
- }