perp-cli 0.12.17 → 0.14.1

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 (363) hide show
  1. package/README.md +247 -27
  2. package/dist/_stderr-filter.js +0 -1
  3. package/dist/agent-wallet/lighter-keystore.d.ts +11 -0
  4. package/dist/agent-wallet/lighter-keystore.js +92 -10
  5. package/dist/agent-wallet/passphrase.d.ts +1 -1
  6. package/dist/agent-wallet/passphrase.js +16 -3
  7. package/dist/agent-wallet/store.d.ts +37 -4
  8. package/dist/agent-wallet/store.js +132 -0
  9. package/dist/agent-wallet/venue-keystore.d.ts +14 -0
  10. package/dist/agent-wallet/venue-keystore.js +121 -0
  11. package/dist/api/public/hyperliquid.js +4 -4
  12. package/dist/api/public/lighter.js +5 -5
  13. package/dist/api/public/pacifica.d.ts +0 -1
  14. package/dist/api/public/pacifica.js +4 -13
  15. package/dist/api/public/urls.d.ts +9 -1
  16. package/dist/api/public/urls.js +35 -13
  17. package/dist/arb/file-lock.d.ts +11 -0
  18. package/dist/arb/file-lock.js +74 -0
  19. package/dist/arb/index.d.ts +2 -2
  20. package/dist/arb/index.js +2 -2
  21. package/dist/arb/pending-entry.d.ts +32 -0
  22. package/dist/arb/pending-entry.js +77 -0
  23. package/dist/arb/sizing.d.ts +6 -13
  24. package/dist/arb/sizing.js +12 -51
  25. package/dist/arb/state.d.ts +45 -12
  26. package/dist/arb/state.js +214 -42
  27. package/dist/arb/utils.d.ts +20 -6
  28. package/dist/arb/utils.js +43 -39
  29. package/dist/bot/conditions.d.ts +4 -4
  30. package/dist/bot/conditions.js +11 -6
  31. package/dist/bot/config.d.ts +17 -1
  32. package/dist/bot/config.js +48 -12
  33. package/dist/bot/engine.d.ts +61 -2
  34. package/dist/bot/engine.js +610 -144
  35. package/dist/bot/fill-size.d.ts +7 -0
  36. package/dist/bot/fill-size.js +18 -0
  37. package/dist/bot/index.d.ts +1 -1
  38. package/dist/bot/index.js +1 -1
  39. package/dist/bot/perp-order.d.ts +99 -0
  40. package/dist/bot/perp-order.js +299 -0
  41. package/dist/bot/presets.d.ts +7 -0
  42. package/dist/bot/presets.js +17 -0
  43. package/dist/bot/quarantine.d.ts +75 -0
  44. package/dist/bot/quarantine.js +190 -0
  45. package/dist/bot/quote-rules.d.ts +23 -0
  46. package/dist/bot/quote-rules.js +69 -0
  47. package/dist/bot/strategies/avellaneda-mm.d.ts +32 -2
  48. package/dist/bot/strategies/avellaneda-mm.js +72 -70
  49. package/dist/bot/strategies/basis-arb.js +2 -0
  50. package/dist/bot/strategies/dca-strategy.d.ts +2 -0
  51. package/dist/bot/strategies/dca-strategy.js +5 -0
  52. package/dist/bot/strategies/funding-arb-strategy.d.ts +43 -3
  53. package/dist/bot/strategies/funding-arb-strategy.js +571 -380
  54. package/dist/bot/strategies/funding-arb-utils.d.ts +48 -23
  55. package/dist/bot/strategies/funding-arb-utils.js +159 -195
  56. package/dist/bot/strategies/funding-arb-v2.d.ts +32 -0
  57. package/dist/bot/strategies/funding-arb-v2.js +258 -47
  58. package/dist/bot/strategies/funding-auto.js +215 -194
  59. package/dist/bot/strategies/spot-perp-arb-strategy.d.ts +14 -0
  60. package/dist/bot/strategies/spot-perp-arb-strategy.js +217 -50
  61. package/dist/bot/strategies/spot-perp-executor.d.ts +73 -19
  62. package/dist/bot/strategies/spot-perp-executor.js +319 -120
  63. package/dist/bot/strategies/spot-perp-state.d.ts +43 -0
  64. package/dist/bot/strategies/spot-perp-state.js +70 -0
  65. package/dist/bot/strategy-types.d.ts +6 -0
  66. package/dist/bot/tui/BotDashboard.d.ts +7 -2
  67. package/dist/bot/tui/BotDashboard.js +6 -3
  68. package/dist/bridge-engine.d.ts +120 -19
  69. package/dist/bridge-engine.js +710 -422
  70. package/dist/bridge-signers.d.ts +54 -0
  71. package/dist/bridge-signers.js +161 -0
  72. package/dist/cache.d.ts +4 -1
  73. package/dist/cache.js +11 -0
  74. package/dist/cli-flags.d.ts +50 -0
  75. package/dist/cli-flags.js +104 -0
  76. package/dist/cli-program.d.ts +35 -0
  77. package/dist/cli-program.js +303 -0
  78. package/dist/cli-spec.js +1 -1
  79. package/dist/client-id-tracker.js +11 -2
  80. package/dist/commands/account.d.ts +7 -1
  81. package/dist/commands/account.js +70 -92
  82. package/dist/commands/agent-import.d.ts +114 -0
  83. package/dist/commands/agent-import.js +794 -0
  84. package/dist/commands/agent.d.ts +232 -2
  85. package/dist/commands/agent.js +1858 -955
  86. package/dist/commands/alerts.d.ts +1 -0
  87. package/dist/commands/alerts.js +31 -28
  88. package/dist/commands/arb/index.d.ts +60 -1
  89. package/dist/commands/arb/index.js +381 -384
  90. package/dist/commands/arb-auto.d.ts +132 -4
  91. package/dist/commands/arb-auto.js +1474 -967
  92. package/dist/commands/arb.d.ts +3 -1
  93. package/dist/commands/arb.js +62 -30
  94. package/dist/commands/bot.js +127 -47
  95. package/dist/commands/bridge.d.ts +2 -1
  96. package/dist/commands/bridge.js +339 -192
  97. package/dist/commands/builder.d.ts +55 -0
  98. package/dist/commands/builder.js +387 -0
  99. package/dist/commands/funds-onchain.d.ts +32 -0
  100. package/dist/commands/funds-onchain.js +248 -0
  101. package/dist/commands/funds.d.ts +25 -0
  102. package/dist/commands/funds.js +925 -245
  103. package/dist/commands/history.js +102 -54
  104. package/dist/commands/init.d.ts +107 -15
  105. package/dist/commands/init.js +1116 -249
  106. package/dist/commands/jobs.d.ts +2 -1
  107. package/dist/commands/jobs.js +77 -15
  108. package/dist/commands/manage.js +136 -91
  109. package/dist/commands/market.d.ts +4 -1
  110. package/dist/commands/market.js +35 -32
  111. package/dist/commands/outcome.d.ts +10 -0
  112. package/dist/commands/outcome.js +396 -0
  113. package/dist/commands/plan.js +52 -12
  114. package/dist/commands/portfolio.d.ts +1 -0
  115. package/dist/commands/portfolio.js +60 -72
  116. package/dist/commands/rebalance.d.ts +2 -1
  117. package/dist/commands/rebalance.js +33 -43
  118. package/dist/commands/risk.js +46 -19
  119. package/dist/commands/settings.d.ts +1 -0
  120. package/dist/commands/settings.js +246 -51
  121. package/dist/commands/trade.d.ts +50 -0
  122. package/dist/commands/trade.js +1943 -695
  123. package/dist/commands/wallet.d.ts +30 -1
  124. package/dist/commands/wallet.js +357 -459
  125. package/dist/config.d.ts +60 -9
  126. package/dist/config.js +252 -82
  127. package/dist/constants.d.ts +29 -4
  128. package/dist/constants.js +62 -20
  129. package/dist/dashboard/server.d.ts +2 -0
  130. package/dist/dashboard/server.js +9 -6
  131. package/dist/dashboard/ui.js +6 -4
  132. package/dist/dashboard/ws-feeds.js +20 -8
  133. package/dist/dex-asset-map.js +5 -3
  134. package/dist/errors.d.ts +122 -0
  135. package/dist/errors.js +194 -0
  136. package/dist/event-stream.js +75 -19
  137. package/dist/evm-master-tx.d.ts +59 -0
  138. package/dist/evm-master-tx.js +154 -0
  139. package/dist/exchanges/adapter-network.d.ts +10 -0
  140. package/dist/exchanges/adapter-network.js +10 -0
  141. package/dist/exchanges/arcus/adapter.d.ts +196 -0
  142. package/dist/exchanges/arcus/adapter.js +1092 -0
  143. package/dist/exchanges/arcus/agent.d.ts +55 -0
  144. package/dist/exchanges/arcus/agent.js +188 -0
  145. package/dist/exchanges/arcus/client.d.ts +63 -0
  146. package/dist/exchanges/arcus/client.js +285 -0
  147. package/dist/exchanges/arcus/public.d.ts +65 -0
  148. package/dist/exchanges/arcus/public.js +138 -0
  149. package/dist/exchanges/arcus/signing.d.ts +176 -0
  150. package/dist/exchanges/arcus/signing.js +288 -0
  151. package/dist/exchanges/arcus/spot-chain.d.ts +60 -0
  152. package/dist/exchanges/arcus/spot-chain.js +241 -0
  153. package/dist/exchanges/arcus/spot-router.d.ts +177 -0
  154. package/dist/exchanges/arcus/spot-router.js +183 -0
  155. package/dist/exchanges/arcus/spot.d.ts +109 -0
  156. package/dist/exchanges/arcus/spot.js +645 -0
  157. package/dist/exchanges/aster-funds.d.ts +127 -0
  158. package/dist/exchanges/aster-funds.js +252 -0
  159. package/dist/exchanges/aster-nonce.d.ts +2 -0
  160. package/dist/exchanges/aster-nonce.js +107 -0
  161. package/dist/exchanges/aster-spot.d.ts +117 -0
  162. package/dist/exchanges/aster-spot.js +686 -0
  163. package/dist/exchanges/aster-typed-data.d.ts +133 -7
  164. package/dist/exchanges/aster-typed-data.js +121 -7
  165. package/dist/exchanges/aster.d.ts +240 -6
  166. package/dist/exchanges/aster.js +1139 -195
  167. package/dist/exchanges/builder-fee.d.ts +254 -0
  168. package/dist/exchanges/builder-fee.js +421 -0
  169. package/dist/exchanges/canonical-symbols.d.ts +32 -0
  170. package/dist/exchanges/canonical-symbols.js +96 -0
  171. package/dist/exchanges/capabilities.d.ts +7 -1
  172. package/dist/exchanges/capabilities.js +7 -0
  173. package/dist/exchanges/hl-signing.d.ts +165 -0
  174. package/dist/exchanges/hl-signing.js +158 -0
  175. package/dist/exchanges/hyperliquid-outcome.d.ts +211 -0
  176. package/dist/exchanges/hyperliquid-outcome.js +646 -0
  177. package/dist/exchanges/hyperliquid-spot.d.ts +44 -5
  178. package/dist/exchanges/hyperliquid-spot.js +308 -117
  179. package/dist/exchanges/hyperliquid.d.ts +462 -57
  180. package/dist/exchanges/hyperliquid.js +1575 -449
  181. package/dist/exchanges/index.d.ts +6 -0
  182. package/dist/exchanges/index.js +4 -0
  183. package/dist/exchanges/interface.d.ts +63 -10
  184. package/dist/exchanges/interface.js +18 -3
  185. package/dist/exchanges/ioc-outcome.d.ts +44 -0
  186. package/dist/exchanges/ioc-outcome.js +57 -0
  187. package/dist/exchanges/legacy-trading-v2.d.ts +39 -0
  188. package/dist/exchanges/legacy-trading-v2.js +940 -0
  189. package/dist/exchanges/lighter-public.d.ts +43 -0
  190. package/dist/exchanges/lighter-public.js +276 -0
  191. package/dist/exchanges/lighter-rh-deposit.d.ts +62 -0
  192. package/dist/exchanges/lighter-rh-deposit.js +185 -0
  193. package/dist/exchanges/lighter-signer.d.ts +123 -0
  194. package/dist/exchanges/lighter-signer.js +215 -0
  195. package/dist/exchanges/lighter-spot.d.ts +91 -13
  196. package/dist/exchanges/lighter-spot.js +595 -233
  197. package/dist/exchanges/lighter.d.ts +611 -39
  198. package/dist/exchanges/lighter.js +1890 -649
  199. package/dist/exchanges/ondo/adapter.d.ts +152 -0
  200. package/dist/exchanges/ondo/adapter.js +811 -0
  201. package/dist/exchanges/ondo/agent.d.ts +31 -0
  202. package/dist/exchanges/ondo/agent.js +101 -0
  203. package/dist/exchanges/ondo/client.d.ts +60 -0
  204. package/dist/exchanges/ondo/client.js +297 -0
  205. package/dist/exchanges/ondo/funds.d.ts +95 -0
  206. package/dist/exchanges/ondo/funds.js +198 -0
  207. package/dist/exchanges/ondo/public.d.ts +95 -0
  208. package/dist/exchanges/ondo/public.js +214 -0
  209. package/dist/exchanges/ondo/spot.d.ts +127 -0
  210. package/dist/exchanges/ondo/spot.js +392 -0
  211. package/dist/exchanges/outcome-interface.d.ts +140 -0
  212. package/dist/exchanges/outcome-interface.js +16 -0
  213. package/dist/exchanges/pacifica-spot.d.ts +83 -0
  214. package/dist/exchanges/pacifica-spot.js +324 -0
  215. package/dist/exchanges/pacifica-typed-data.d.ts +30 -13
  216. package/dist/exchanges/pacifica-typed-data.js +57 -9
  217. package/dist/exchanges/pacifica.d.ts +293 -4
  218. package/dist/exchanges/pacifica.js +1044 -90
  219. package/dist/exchanges/precision.d.ts +47 -0
  220. package/dist/exchanges/precision.js +209 -0
  221. package/dist/exchanges/qfex/adapter.d.ts +341 -0
  222. package/dist/exchanges/qfex/adapter.js +1386 -0
  223. package/dist/exchanges/qfex/agent.d.ts +58 -0
  224. package/dist/exchanges/qfex/agent.js +188 -0
  225. package/dist/exchanges/qfex/client.d.ts +54 -0
  226. package/dist/exchanges/qfex/client.js +138 -0
  227. package/dist/exchanges/qfex/errors.d.ts +70 -0
  228. package/dist/exchanges/qfex/errors.js +236 -0
  229. package/dist/exchanges/qfex/public.d.ts +122 -0
  230. package/dist/exchanges/qfex/public.js +268 -0
  231. package/dist/exchanges/qfex/signing.d.ts +160 -0
  232. package/dist/exchanges/qfex/signing.js +283 -0
  233. package/dist/exchanges/qfex/ws-transport.d.ts +294 -0
  234. package/dist/exchanges/qfex/ws-transport.js +798 -0
  235. package/dist/exchanges/rate-limiter.d.ts +12 -0
  236. package/dist/exchanges/rate-limiter.js +64 -0
  237. package/dist/exchanges/registry.d.ts +14 -2
  238. package/dist/exchanges/registry.js +20 -32
  239. package/dist/exchanges/slippage.d.ts +37 -0
  240. package/dist/exchanges/slippage.js +70 -0
  241. package/dist/exchanges/spot-factory.d.ts +166 -0
  242. package/dist/exchanges/spot-factory.js +431 -0
  243. package/dist/exchanges/spot-interface.d.ts +98 -4
  244. package/dist/exchanges/spot-interface.js +27 -1
  245. package/dist/exchanges/spot-result.d.ts +79 -0
  246. package/dist/exchanges/spot-result.js +273 -0
  247. package/dist/exchanges/trading-v2.d.ts +117 -0
  248. package/dist/exchanges/trading-v2.js +301 -0
  249. package/dist/exchanges/venue-types.d.ts +231 -0
  250. package/dist/exchanges/venue-types.js +87 -0
  251. package/dist/exchanges/venue.d.ts +211 -0
  252. package/dist/exchanges/venue.js +132 -0
  253. package/dist/exchanges/venues/arcus.d.ts +8 -0
  254. package/dist/exchanges/venues/arcus.js +109 -0
  255. package/dist/exchanges/venues/aster.d.ts +49 -0
  256. package/dist/exchanges/venues/aster.js +176 -0
  257. package/dist/exchanges/venues/create-helpers.d.ts +18 -0
  258. package/dist/exchanges/venues/create-helpers.js +199 -0
  259. package/dist/exchanges/venues/hyperliquid.d.ts +23 -0
  260. package/dist/exchanges/venues/hyperliquid.js +126 -0
  261. package/dist/exchanges/venues/index.d.ts +16 -0
  262. package/dist/exchanges/venues/index.js +26 -0
  263. package/dist/exchanges/venues/lighter-family.d.ts +92 -0
  264. package/dist/exchanges/venues/lighter-family.js +166 -0
  265. package/dist/exchanges/venues/lighter-rh.d.ts +7 -0
  266. package/dist/exchanges/venues/lighter-rh.js +58 -0
  267. package/dist/exchanges/venues/lighter.d.ts +6 -0
  268. package/dist/exchanges/venues/lighter.js +55 -0
  269. package/dist/exchanges/venues/ondo.d.ts +29 -0
  270. package/dist/exchanges/venues/ondo.js +136 -0
  271. package/dist/exchanges/venues/pacifica.d.ts +8 -0
  272. package/dist/exchanges/venues/pacifica.js +95 -0
  273. package/dist/exchanges/venues/qfex.d.ts +39 -0
  274. package/dist/exchanges/venues/qfex.js +140 -0
  275. package/dist/execution-log.js +10 -2
  276. package/dist/funding/legacy-public.d.ts +31 -0
  277. package/dist/funding/legacy-public.js +369 -0
  278. package/dist/funding/normalize.d.ts +28 -16
  279. package/dist/funding/normalize.js +61 -29
  280. package/dist/funding/rates.d.ts +46 -11
  281. package/dist/funding/rates.js +228 -277
  282. package/dist/guardrail/perp-guardrail.js +0 -0
  283. package/dist/index.js +156 -684
  284. package/dist/jobs.d.ts +84 -6
  285. package/dist/jobs.js +239 -41
  286. package/dist/landing.d.ts +7 -2
  287. package/dist/landing.js +19 -3
  288. package/dist/mcp-server.d.ts +14 -4
  289. package/dist/mcp-server.js +821 -403
  290. package/dist/mcp-trade-guard.d.ts +16 -0
  291. package/dist/mcp-trade-guard.js +59 -0
  292. package/dist/onchain-balances.d.ts +40 -0
  293. package/dist/onchain-balances.js +173 -0
  294. package/dist/pacifica/client.d.ts +41 -10
  295. package/dist/pacifica/client.js +167 -63
  296. package/dist/pacifica/constants.d.ts +0 -1
  297. package/dist/pacifica/constants.js +0 -5
  298. package/dist/pacifica/deposit.d.ts +30 -3
  299. package/dist/pacifica/deposit.js +119 -2
  300. package/dist/pacifica/faucet.d.ts +29 -0
  301. package/dist/pacifica/faucet.js +100 -0
  302. package/dist/pacifica/sign-tx.d.ts +15 -0
  303. package/dist/pacifica/sign-tx.js +41 -0
  304. package/dist/pacifica/types/account.d.ts +28 -4
  305. package/dist/pacifica/types/lake.d.ts +20 -5
  306. package/dist/pacifica/types/lake.js +4 -0
  307. package/dist/pacifica/types/market.d.ts +5 -0
  308. package/dist/pacifica/types/order.d.ts +4 -1
  309. package/dist/pacifica/types/position.d.ts +9 -1
  310. package/dist/plan-executor.d.ts +10 -5
  311. package/dist/plan-executor.js +165 -54
  312. package/dist/position-history.js +13 -0
  313. package/dist/rebalance.d.ts +26 -2
  314. package/dist/rebalance.js +86 -7
  315. package/dist/relay-swap.d.ts +232 -0
  316. package/dist/relay-swap.js +630 -0
  317. package/dist/risk.js +5 -1
  318. package/dist/secret-env.d.ts +15 -0
  319. package/dist/secret-env.js +36 -0
  320. package/dist/settings.d.ts +169 -6
  321. package/dist/settings.js +219 -38
  322. package/dist/signer/ows-evm.d.ts +13 -0
  323. package/dist/signer/ows-evm.js +22 -0
  324. package/dist/smart-order.d.ts +9 -0
  325. package/dist/smart-order.js +53 -8
  326. package/dist/strategies/dca.d.ts +6 -2
  327. package/dist/strategies/dca.js +66 -26
  328. package/dist/strategies/funding-arb.d.ts +11 -1
  329. package/dist/strategies/funding-arb.js +202 -89
  330. package/dist/strategies/grid.d.ts +31 -0
  331. package/dist/strategies/grid.js +89 -11
  332. package/dist/strategies/pending-stop.d.ts +8 -0
  333. package/dist/strategies/pending-stop.js +12 -0
  334. package/dist/strategies/split-order.d.ts +45 -17
  335. package/dist/strategies/split-order.js +157 -91
  336. package/dist/strategies/trailing-stop.d.ts +2 -1
  337. package/dist/strategies/trailing-stop.js +52 -6
  338. package/dist/strategies/twap.d.ts +6 -1
  339. package/dist/strategies/twap.js +39 -11
  340. package/dist/trade-validator.d.ts +22 -0
  341. package/dist/trade-validator.js +119 -15
  342. package/dist/utils/numeric.d.ts +46 -0
  343. package/dist/utils/numeric.js +79 -0
  344. package/dist/utils.d.ts +19 -0
  345. package/dist/utils.js +96 -19
  346. package/dist/withdraw-gate.d.ts +49 -0
  347. package/dist/withdraw-gate.js +131 -0
  348. package/package.json +15 -6
  349. package/skills/perp-cli/SKILL.md +159 -55
  350. package/skills/perp-cli/references/agent-operations.md +112 -58
  351. package/skills/perp-cli/references/commands.md +269 -73
  352. package/skills/perp-cli/references/strategies.md +34 -31
  353. package/skills/perp-cli/scripts/arb-monitor.sh +10 -5
  354. package/skills/perp-cli/scripts/funding-analysis.sh +14 -9
  355. package/skills/perp-cli/scripts/preflight.sh +21 -14
  356. package/skills/perp-cli/scripts/spot-perp-scan.sh +12 -7
  357. package/skills/perp-cli/scripts/validate-arb.sh +31 -15
  358. package/vendor/lighter-signer/SHA256SUMS +2 -0
  359. package/vendor/lighter-signer/VERSION +8 -0
  360. package/vendor/lighter-signer/lighter-signer.wasm +0 -0
  361. package/vendor/lighter-signer/wasm_exec.js +575 -0
  362. package/dist/bot/strategies/funding-arb-v2-strategy.d.ts +0 -42
  363. package/dist/bot/strategies/funding-arb-v2-strategy.js +0 -864
@@ -10,3 +10,9 @@ export { LighterAdapter } from "./lighter.js";
10
10
  export { AsterAdapter } from "./aster.js";
11
11
  export { HyperliquidSpotAdapter } from "./hyperliquid-spot.js";
12
12
  export { LighterSpotAdapter } from "./lighter-spot.js";
13
+ export { getVenue, listVenues, listVenuesWithRole, resolveVenueId, tryResolveVenueId, parseVenueRef, networkConfig, requireCapabilities, fundingBasisOf, settlementIntervalOf, isLegacyVenue, isVenueId, READ_ONLY_CREDENTIALS, } from "./venue.js";
14
+ export type { VenueDefinition, VenueCapabilities, VenueCreateContext, VenueCredentials, VenueNetworkConfig, VenuePublicData, VenueRole, VenueRef, RateLimitPolicy, MasterKeyKind, AgentKeyKind, } from "./venue.js";
15
+ export type { VenueId, LegacyVenueId, Network, FundingRateBasis, VenueMarket, VenueFundingRate, TimeInForce, OrderRequest, OrderResult } from "./venue-types.js";
16
+ export { ensureVenuesRegistered, ALL_VENUES } from "./venues/index.js";
17
+ export { isTradingV2, validateOrderRequest, validateLegacyTif } from "./trading-v2.js";
18
+ export type { TradingV2 } from "./trading-v2.js";
@@ -9,3 +9,7 @@ export { LighterAdapter } from "./lighter.js";
9
9
  export { AsterAdapter } from "./aster.js";
10
10
  export { HyperliquidSpotAdapter } from "./hyperliquid-spot.js";
11
11
  export { LighterSpotAdapter } from "./lighter-spot.js";
12
+ // Venue abstraction (docs/DESIGN-venue-abstraction.md §10)
13
+ export { getVenue, listVenues, listVenuesWithRole, resolveVenueId, tryResolveVenueId, parseVenueRef, networkConfig, requireCapabilities, fundingBasisOf, settlementIntervalOf, isLegacyVenue, isVenueId, READ_ONLY_CREDENTIALS, } from "./venue.js";
14
+ export { ensureVenuesRegistered, ALL_VENUES } from "./venues/index.js";
15
+ export { isTradingV2, validateOrderRequest, validateLegacyTif } from "./trading-v2.js";
@@ -1,3 +1,4 @@
1
+ import type { ResolvedSlippage } from "./slippage.js";
1
2
  /**
2
3
  * Common exchange interface for multi-DEX CLI support.
3
4
  * All exchange adapters (Pacifica, Hyperliquid, Lighter) implement this.
@@ -5,24 +6,51 @@
5
6
  export interface ExchangeMarketInfo {
6
7
  symbol: string;
7
8
  markPrice: string;
8
- indexPrice: string;
9
+ /** null = venue does not publish an index/oracle price for this market */
10
+ indexPrice: string | null;
9
11
  fundingRate: string | null;
10
- volume24h: string;
11
- openInterest: string;
12
+ /** null = venue does not publish 24h volume */
13
+ volume24h: string | null;
14
+ /** null = venue does not publish open interest (never "0" as a stand-in) */
15
+ openInterest: string | null;
12
16
  maxLeverage: number;
13
- sizeDecimals?: number;
14
- stepSize?: string;
15
- fundingHours?: number;
17
+ /** quantity precision (e.g. 0 = integers only, 2 = 0.01); null = unknown */
18
+ sizeDecimals: number | null;
19
+ /** lot step size (e.g. "1", "0.1", "0.001"); null = unknown */
20
+ stepSize: string | null;
21
+ /** hours one quoted fundingRate covers; null = use the venue definition's fundingRateBasis */
22
+ fundingHours: number | null;
23
+ /**
24
+ * Notional-tiered leverage caps, ascending by `lowerBound` (USD notional).
25
+ * `maxLeverage` above is the TOP tier — the cap falls as size grows, so a
26
+ * pre-trade check that uses it alone passes orders the venue will reject.
27
+ * Resolve with `maxLeverageForNotional()`. null when the venue does not
28
+ * publish tiers (then `maxLeverage` applies at every size).
29
+ */
30
+ marginTiers: Array<{
31
+ lowerBound: number;
32
+ maxLeverage: number;
33
+ }> | null;
16
34
  }
35
+ /**
36
+ * Effective max leverage for an order of `notional` USD.
37
+ *
38
+ * A venue that publishes no tiers (`marginTiers === null`) has one flat cap,
39
+ * `maxLeverage`, at every size — that is the venue's definition, not a fallback.
40
+ */
41
+ export declare function maxLeverageForNotional(market: ExchangeMarketInfo, notional: number): number;
17
42
  export interface ExchangePosition {
18
43
  symbol: string;
19
44
  side: "long" | "short";
20
45
  size: string;
21
46
  entryPrice: string;
22
47
  markPrice: string;
23
- liquidationPrice: string;
48
+ /** null = venue does not report a liquidation price */
49
+ liquidationPrice: string | null;
24
50
  unrealizedPnl: string;
25
51
  leverage: number;
52
+ /** Margin mode of the position, set only by adapters whose venue reports it per position. */
53
+ marginMode?: "cross" | "isolated";
26
54
  }
27
55
  export interface ExchangeOrder {
28
56
  orderId: string;
@@ -33,6 +61,8 @@ export interface ExchangeOrder {
33
61
  filled: string;
34
62
  status: string;
35
63
  type: string;
64
+ /** Trigger (stop) price of a stop / TP / SL order; null for plain orders or when the venue does not report it. */
65
+ triggerPrice: string | null;
36
66
  }
37
67
  export interface ExchangeBalance {
38
68
  equity: string;
@@ -60,7 +90,8 @@ export interface ExchangeKline {
60
90
  low: string;
61
91
  close: string;
62
92
  volume: string;
63
- trades: number;
93
+ /** null = venue does not publish a trade count for the candle */
94
+ trades: number | null;
64
95
  }
65
96
  export interface ExchangeAdapter {
66
97
  readonly name: string;
@@ -87,8 +118,13 @@ export interface ExchangeAdapter {
87
118
  getOrderHistory(limit?: number): Promise<ExchangeOrder[]>;
88
119
  getTradeHistory(limit?: number): Promise<ExchangeTrade[]>;
89
120
  getFundingPayments(limit?: number): Promise<ExchangeFundingPayment[]>;
90
- marketOrder(symbol: string, side: "buy" | "sell", size: string, opts?: {
91
- reduceOnly?: boolean;
121
+ /**
122
+ * Market order = IOC within the resolved slippage bound (design §13.2). `opts` is
123
+ * required so every caller states reduceOnly and passes resolveSlippage() output.
124
+ */
125
+ marketOrder(symbol: string, side: "buy" | "sell", size: string, opts: {
126
+ reduceOnly: boolean;
127
+ slippage: ResolvedSlippage;
92
128
  }): Promise<unknown>;
93
129
  limitOrder(symbol: string, side: "buy" | "sell", price: string, size: string, opts?: {
94
130
  reduceOnly?: boolean;
@@ -98,8 +134,25 @@ export interface ExchangeAdapter {
98
134
  cancelOrder(symbol: string, orderId: string): Promise<unknown>;
99
135
  cancelAllOrders(symbol?: string): Promise<unknown>;
100
136
  setLeverage(symbol: string, leverage: number, marginMode?: "cross" | "isolated"): Promise<unknown>;
137
+ /**
138
+ * triggerType selects the trigger price source where the venue supports it
139
+ * (currently Pacifica: "mark" | "last" | "mid"). Adapters that don't support
140
+ * a configurable trigger source ignore the field and use their venue default.
141
+ * `slippage` (resolveSlippage() output) bounds the execution price of a market
142
+ * trigger on venues that send it as a protection-priced limit once triggered
143
+ * (Lighter, Arcus: required there for a market trigger — adapters never read
144
+ * settings, design §13.10 #1); venue-native market triggers ignore it.
145
+ * `kind` ("tp" | "sl") states the protective intent explicitly: venues with distinct
146
+ * take-profit / stop-loss trigger types (Aster, Lighter) send that type as given — no
147
+ * price-based classification — and a trigger already crossed is left for the venue to
148
+ * reject. Omitted (plain `trade stop`): the adapter classifies from the trigger vs its
149
+ * reference price. Venues with a single trigger type ignore it.
150
+ */
101
151
  stopOrder(symbol: string, side: "buy" | "sell", size: string, triggerPrice: string, opts?: {
102
152
  limitPrice?: string;
103
153
  reduceOnly?: boolean;
154
+ triggerType?: "mark" | "last" | "mid";
155
+ slippage?: ResolvedSlippage;
156
+ kind?: "tp" | "sl";
104
157
  }): Promise<unknown>;
105
158
  }
@@ -1,5 +1,20 @@
1
1
  /**
2
- * Common exchange interface for multi-DEX CLI support.
3
- * All exchange adapters (Pacifica, Hyperliquid, Lighter) implement this.
2
+ * Effective max leverage for an order of `notional` USD.
3
+ *
4
+ * A venue that publishes no tiers (`marginTiers === null`) has one flat cap,
5
+ * `maxLeverage`, at every size — that is the venue's definition, not a fallback.
4
6
  */
5
- export {};
7
+ export function maxLeverageForNotional(market, notional) {
8
+ if (!Number.isFinite(notional)) {
9
+ throw new Error(`maxLeverageForNotional: notional must be finite (got ${notional})`);
10
+ }
11
+ const tiers = market.marginTiers;
12
+ if (tiers === null || tiers.length === 0)
13
+ return market.maxLeverage;
14
+ let effective = market.maxLeverage;
15
+ for (const t of tiers) {
16
+ if (notional >= t.lowerBound)
17
+ effective = t.maxLeverage;
18
+ }
19
+ return effective;
20
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Venue-final IOC / market order outcome (design `docs/DESIGN-venue-abstraction.md` §13.10 #4).
3
+ *
4
+ * An adapter whose market / IOC responses report the order's FINAL filled size (nothing
5
+ * of the order can still execute) implements `iocOutcomeOf(raw)` on the RAW result its
6
+ * legacy `marketOrder` / `limitOrder(tif IOC)` / `spotMarketOrder` returned:
7
+ * - returns `{ filledSize, final: true }` only when `raw` is such a response AND the venue
8
+ * reported the final filled size of THAT order (e.g. HL `statuses[0].filled.totalSz`,
9
+ * Lighter tx `event_info` status "filled" or accountOrders `filled_base_amount`, Aster `executedQty` with a terminal status);
10
+ * `filledSize` is a plain decimal string in base units, "0" = definitely nothing filled;
11
+ * - returns `null` for anything else (unrecognized shape, resting / open order, no fill
12
+ * report, not final) — the caller then measures the fill (position / balance delta).
13
+ * It never throws and never guesses: a missing report is `null`, never "0".
14
+ *
15
+ * Consumers (`placePerpVerified`, `closePerpVerified`, `spotMarketFill`) still cross-check
16
+ * the reported fill against a measured delta. Adapters without the method are measured as
17
+ * before (`isIocOutcomeCapable` handles absence).
18
+ */
19
+ export interface IocOutcome {
20
+ /** Final filled size in base units (plain decimal string, "0" = nothing filled). */
21
+ filledSize: string;
22
+ final: true;
23
+ }
24
+ export interface IocOutcomeCapable {
25
+ iocOutcomeOf(raw: unknown): IocOutcome | null;
26
+ }
27
+ export declare function isIocOutcomeCapable(a: unknown): a is IocOutcomeCapable;
28
+ /**
29
+ * Tolerance for comparing a venue-final fill with the order size or a measured delta.
30
+ * Never derived from the decimals of the strings ("5" vs "4" would give a 1-lot tolerance
31
+ * and call a partial fill complete):
32
+ * - market `stepSize` known (> 0) → half a lot: lot multiples differ by at least one lot,
33
+ * so anything below half a lot is representation noise;
34
+ * - unknown → float-noise epsilon max(size, fill) × 1e-9.
35
+ */
36
+ export declare function iocLotTolerance(size: string, filledSize: string, stepSize?: string | number | null): number;
37
+ /**
38
+ * The average FILL price the venue reported in a raw order result (plain positive decimal
39
+ * string), or null when it reports none. Read only from fill fields — Hyperliquid
40
+ * `response.data.statuses[0].filled.avgPx`; `avgPrice` of an Aster order object or of a
41
+ * TradingV2 OrderResult — and never from the order's own `price` (the limit / slippage
42
+ * protection price that was SENT, which is not where it filled).
43
+ */
44
+ export declare function reportedAvgFillPrice(raw: unknown): string | null;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Venue-final IOC / market order outcome (design `docs/DESIGN-venue-abstraction.md` §13.10 #4).
3
+ *
4
+ * An adapter whose market / IOC responses report the order's FINAL filled size (nothing
5
+ * of the order can still execute) implements `iocOutcomeOf(raw)` on the RAW result its
6
+ * legacy `marketOrder` / `limitOrder(tif IOC)` / `spotMarketOrder` returned:
7
+ * - returns `{ filledSize, final: true }` only when `raw` is such a response AND the venue
8
+ * reported the final filled size of THAT order (e.g. HL `statuses[0].filled.totalSz`,
9
+ * Lighter tx `event_info` status "filled" or accountOrders `filled_base_amount`, Aster `executedQty` with a terminal status);
10
+ * `filledSize` is a plain decimal string in base units, "0" = definitely nothing filled;
11
+ * - returns `null` for anything else (unrecognized shape, resting / open order, no fill
12
+ * report, not final) — the caller then measures the fill (position / balance delta).
13
+ * It never throws and never guesses: a missing report is `null`, never "0".
14
+ *
15
+ * Consumers (`placePerpVerified`, `closePerpVerified`, `spotMarketFill`) still cross-check
16
+ * the reported fill against a measured delta. Adapters without the method are measured as
17
+ * before (`isIocOutcomeCapable` handles absence).
18
+ */
19
+ export function isIocOutcomeCapable(a) {
20
+ return a !== null && typeof a === "object" && typeof a.iocOutcomeOf === "function";
21
+ }
22
+ /**
23
+ * Tolerance for comparing a venue-final fill with the order size or a measured delta.
24
+ * Never derived from the decimals of the strings ("5" vs "4" would give a 1-lot tolerance
25
+ * and call a partial fill complete):
26
+ * - market `stepSize` known (> 0) → half a lot: lot multiples differ by at least one lot,
27
+ * so anything below half a lot is representation noise;
28
+ * - unknown → float-noise epsilon max(size, fill) × 1e-9.
29
+ */
30
+ export function iocLotTolerance(size, filledSize, stepSize) {
31
+ const step = stepSize === undefined || stepSize === null ? NaN : Number(stepSize);
32
+ if (Number.isFinite(step) && step > 0)
33
+ return step / 2;
34
+ const mag = Math.max(Math.abs(Number(size)), Math.abs(Number(filledSize)));
35
+ return (Number.isFinite(mag) ? mag : 0) * 1e-9;
36
+ }
37
+ /**
38
+ * The average FILL price the venue reported in a raw order result (plain positive decimal
39
+ * string), or null when it reports none. Read only from fill fields — Hyperliquid
40
+ * `response.data.statuses[0].filled.avgPx`; `avgPrice` of an Aster order object or of a
41
+ * TradingV2 OrderResult — and never from the order's own `price` (the limit / slippage
42
+ * protection price that was SENT, which is not where it filled).
43
+ */
44
+ export function reportedAvgFillPrice(raw) {
45
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw))
46
+ return null;
47
+ const r = raw;
48
+ const statuses = r.response?.data?.statuses;
49
+ const first = Array.isArray(statuses) ? statuses[0] : null;
50
+ const hl = first !== null && typeof first === "object" ? first.filled?.avgPx : undefined;
51
+ for (const v of [r.avgPrice, hl]) {
52
+ const s = typeof v === "number" && Number.isFinite(v) ? String(v) : v;
53
+ if (typeof s === "string" && /^\d+(\.\d+)?$/.test(s) && Number(s) > 0)
54
+ return s;
55
+ }
56
+ return null;
57
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * TradingV2 for the four pre-existing venues (pacifica, hyperliquid, lighter /
3
+ * lighter-rh, aster) — design §13.7, §13.10 #8.
4
+ *
5
+ * Composition, not modification: the legacy ExchangeAdapter methods keep returning
6
+ * their raw venue responses (in-process contract for smart-order, perp-order,
7
+ * plan-executor, grid). This wrapper calls the same adapter methods (same send
8
+ * path) and normalizes the raw response into an OrderResult + execution record.
9
+ * The raw response is kept verbatim in `venueRaw`.
10
+ *
11
+ * Status rules (SSOT Rule #2): a status / fill is reported only when the venue
12
+ * response proves it; otherwise "accepted" with finality "pending".
13
+ */
14
+ import type { ExchangeAdapter } from "./interface.js";
15
+ import type { ResolvedSlippage } from "./slippage.js";
16
+ import { type TradingV2 } from "./trading-v2.js";
17
+ import { type Network, type OrderResult } from "./venue-types.js";
18
+ export declare function tradingV2Of(adapter: ExchangeAdapter, network: Network): TradingV2;
19
+ export declare function toTradingV2(adapter: ExchangeAdapter, network: Network): TradingV2;
20
+ /** One reduce-only protective trigger (TP or SL) of a separateOrders venue (design §13.5). */
21
+ export interface TpSlLeg {
22
+ symbol: string;
23
+ /** Side that closes the protected position (sell closes a long). */
24
+ closeSide: "buy" | "sell";
25
+ /** Positive size (the verified fill or the live position) — never "0". */
26
+ size: string;
27
+ trigger: string;
28
+ kind: "tp" | "sl";
29
+ /** Limit price once triggered; null = market trigger. */
30
+ limitPrice: string | null;
31
+ /** Resolved bound for protection-priced market triggers (Lighter); native triggers ignore it. */
32
+ slippage: ResolvedSlippage;
33
+ }
34
+ /**
35
+ * Place one reduce-only TP/SL trigger on a separateOrders venue (hyperliquid, lighter /
36
+ * lighter-rh, aster) and normalize the result. HL tags the trigger "tp"/"sl" natively;
37
+ * Lighter / Aster receive the leg kind explicitly and send take-profit / stop-loss as given.
38
+ */
39
+ export declare function placeTpSlLeg(adapter: ExchangeAdapter, network: Network, leg: TpSlLeg): Promise<OrderResult>;