perp-cli 0.12.17 → 0.14.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 (361) 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 +286 -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 +286 -0
  101. package/dist/commands/funds.d.ts +25 -0
  102. package/dist/commands/funds.js +939 -245
  103. package/dist/commands/history.js +72 -45
  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 +316 -337
  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 +219 -6
  166. package/dist/exchanges/aster.js +1023 -153
  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 +166 -0
  200. package/dist/exchanges/ondo/adapter.js +835 -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 +122 -0
  206. package/dist/exchanges/ondo/funds.js +290 -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 +288 -4
  218. package/dist/exchanges/pacifica.js +1013 -76
  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 +1383 -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 +34 -0
  270. package/dist/exchanges/venues/ondo.js +140 -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 +28 -0
  274. package/dist/exchanges/venues/qfex.js +132 -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 +820 -402
  290. package/dist/mcp-trade-guard.d.ts +16 -0
  291. package/dist/mcp-trade-guard.js +59 -0
  292. package/dist/pacifica/client.d.ts +41 -10
  293. package/dist/pacifica/client.js +167 -63
  294. package/dist/pacifica/constants.d.ts +0 -1
  295. package/dist/pacifica/constants.js +0 -5
  296. package/dist/pacifica/deposit.d.ts +30 -3
  297. package/dist/pacifica/deposit.js +119 -2
  298. package/dist/pacifica/faucet.d.ts +29 -0
  299. package/dist/pacifica/faucet.js +100 -0
  300. package/dist/pacifica/sign-tx.d.ts +15 -0
  301. package/dist/pacifica/sign-tx.js +41 -0
  302. package/dist/pacifica/types/account.d.ts +28 -4
  303. package/dist/pacifica/types/lake.d.ts +20 -5
  304. package/dist/pacifica/types/lake.js +4 -0
  305. package/dist/pacifica/types/market.d.ts +5 -0
  306. package/dist/pacifica/types/order.d.ts +4 -1
  307. package/dist/pacifica/types/position.d.ts +9 -1
  308. package/dist/plan-executor.d.ts +10 -5
  309. package/dist/plan-executor.js +165 -54
  310. package/dist/position-history.js +13 -0
  311. package/dist/rebalance.d.ts +26 -2
  312. package/dist/rebalance.js +86 -7
  313. package/dist/relay-swap.d.ts +232 -0
  314. package/dist/relay-swap.js +630 -0
  315. package/dist/risk.js +5 -1
  316. package/dist/secret-env.d.ts +15 -0
  317. package/dist/secret-env.js +36 -0
  318. package/dist/settings.d.ts +169 -6
  319. package/dist/settings.js +219 -38
  320. package/dist/signer/ows-evm.d.ts +13 -0
  321. package/dist/signer/ows-evm.js +22 -0
  322. package/dist/smart-order.d.ts +9 -0
  323. package/dist/smart-order.js +53 -8
  324. package/dist/strategies/dca.d.ts +6 -2
  325. package/dist/strategies/dca.js +66 -26
  326. package/dist/strategies/funding-arb.d.ts +11 -1
  327. package/dist/strategies/funding-arb.js +202 -89
  328. package/dist/strategies/grid.d.ts +31 -0
  329. package/dist/strategies/grid.js +89 -11
  330. package/dist/strategies/pending-stop.d.ts +8 -0
  331. package/dist/strategies/pending-stop.js +12 -0
  332. package/dist/strategies/split-order.d.ts +45 -17
  333. package/dist/strategies/split-order.js +157 -91
  334. package/dist/strategies/trailing-stop.d.ts +2 -1
  335. package/dist/strategies/trailing-stop.js +52 -6
  336. package/dist/strategies/twap.d.ts +6 -1
  337. package/dist/strategies/twap.js +39 -11
  338. package/dist/trade-validator.d.ts +22 -0
  339. package/dist/trade-validator.js +119 -15
  340. package/dist/utils/numeric.d.ts +46 -0
  341. package/dist/utils/numeric.js +79 -0
  342. package/dist/utils.d.ts +19 -0
  343. package/dist/utils.js +96 -19
  344. package/dist/withdraw-gate.d.ts +49 -0
  345. package/dist/withdraw-gate.js +131 -0
  346. package/package.json +15 -6
  347. package/skills/perp-cli/SKILL.md +142 -55
  348. package/skills/perp-cli/references/agent-operations.md +110 -56
  349. package/skills/perp-cli/references/commands.md +266 -71
  350. package/skills/perp-cli/references/strategies.md +34 -31
  351. package/skills/perp-cli/scripts/arb-monitor.sh +10 -5
  352. package/skills/perp-cli/scripts/funding-analysis.sh +14 -9
  353. package/skills/perp-cli/scripts/preflight.sh +21 -14
  354. package/skills/perp-cli/scripts/spot-perp-scan.sh +12 -7
  355. package/skills/perp-cli/scripts/validate-arb.sh +31 -15
  356. package/vendor/lighter-signer/SHA256SUMS +2 -0
  357. package/vendor/lighter-signer/VERSION +8 -0
  358. package/vendor/lighter-signer/lighter-signer.wasm +0 -0
  359. package/vendor/lighter-signer/wasm_exec.js +575 -0
  360. package/dist/bot/strategies/funding-arb-v2-strategy.d.ts +0 -42
  361. package/dist/bot/strategies/funding-arb-v2-strategy.js +0 -864
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Builder fees — one uniform, default-OFF mechanism for every venue.
3
+ *
4
+ * A builder fee is an extra per-order fee the venue pays to a third-party "builder"
5
+ * (Hyperliquid builder codes, Pacifica builder program, Aster builder, Ondo builder
6
+ * codes). It is charged to the USER, so perp-cli never attaches one unless:
7
+ * 1. `settings.builder.<venue>` is set explicitly by the user (absent = off — there
8
+ * is no shipped default and no env var), and
9
+ * 2. the venue approval the fee needs is CONFIRMED (venue status read, cached per
10
+ * process for BUILDER_APPROVAL_TTL_MS; a builder-related order rejection drops the
11
+ * cached read). Approval-free venues (Ondo) are confirmed by (1) alone.
12
+ * A builder-related order rejection is returned to the caller with remediation
13
+ * (--no-builder / re-approve) and is NEVER retried — re-sending is a new order.
14
+ * An order whose approval is missing / unknown is sent WITHOUT the fee and says so in
15
+ * `execution.notes` (and once on stderr) — the fee is the builder's, never a reason to
16
+ * fail or silently change the user's order. `--no-builder` disables it per command.
17
+ *
18
+ * Per-venue facts (official docs, checked 2026-10-02):
19
+ * - hyperliquid https://hyperliquid.gitbook.io/hyperliquid-docs/trading/builder-codes
20
+ * ApproveBuilderFee signed by the MAIN wallet (an agent cannot sign it); order action
21
+ * `builder: { b: <address>, f: <tenths of a bp> }`; max 0.1% perps / 1% spot; status
22
+ * info `{ type: "maxBuilderFee", user, builder }`. HIP-3 dexes are not covered by the
23
+ * docs → never attached there.
24
+ * - pacifica https://pacifica.gitbook.io/docs/programs/builder-program.md
25
+ * approve_builder_code { builder_code, max_fee_rate } signed by the account; per-order
26
+ * `builder_code` on create_market / create / stop/create / positions/tpsl. TWAP
27
+ * (create_twap_order) does not document builder_code → never sent there.
28
+ * The builder sets its own fee_rate; the user's approved max_fee_rate caps it, so the
29
+ * code is attached only while the approved max_fee_rate ≤ the configured feeBps (the
30
+ * user's consent). The venue documents no ceiling → perp-cli caps the consent at 10
31
+ * bps. Spot rejects it (err 108).
32
+ * - aster https://asterdex.github.io/aster-api-website/asterCode/integration-flow/
33
+ * + asterdex/api-docs demo/aster-code.py: approveBuilder { builder, maxFeeRate ≤ 0.001 }
34
+ * master-signed; orders carry `builder` + `feeRate` (decimal) signed by the API wallet;
35
+ * list GET /fapi/v3/builder, revoke DELETE /fapi/v3/builder (DelBuilder). The testnet
36
+ * API documents no approveBuilder → testnet off.
37
+ * - ondo https://docs.ondoperps.xyz/api-reference/integration_guide (+ rest-spec)
38
+ * no user approval; per-order `builderCode: { code, feeRateBpsFractional }` on
39
+ * POST /v1/perps/orders and POST /v1/perps/stop_order (stops do NOT inherit it); cap
40
+ * 10 bps; sandbox uses the same API.
41
+ * - qfex https://docs.qfex.com/qfex/builder-code
42
+ * fee SHARE, not an extra fee: the trader pays the normal venue fee and the venue credits
43
+ * part of it to the builder (feeKind "share", feeBps null). No user approval. The code
44
+ * (UUID) rides on the Trade WebSocket auth (`params.builder_code`) for the life of the
45
+ * connection — never per order; an unknown code is not an error, so attribution is not
46
+ * confirmable from the trader side. Prod codes mean nothing on UAT → testnet off.
47
+ * - lighter / lighter-rh: unsupported — see UNSUPPORTED below.
48
+ * - arcus: unsupported — see UNSUPPORTED below.
49
+ */
50
+ import { PerpError } from "../errors.js";
51
+ import type { Network, VenueId } from "./venue-types.js";
52
+ export type BuilderFeeKind = "exact" | "max" | "share";
53
+ export interface BuilderFeeCapability {
54
+ /** "master" = the owner wallet signs a one-time approval; "none" = no approval exists. */
55
+ approval: "master" | "none";
56
+ /** What identifies the builder in settings.builder.<venue>. */
57
+ identity: "address" | "code";
58
+ /** Largest fee (bps) a perp order may carry; null = feeKind "share" (no user-paid fee exists). */
59
+ perpCapBps: number | null;
60
+ /** Largest fee (bps) the venue allows on spot; null = spot does not take a builder fee. Spot orders never carry one in perp-cli. */
61
+ spotCapBps: number | null;
62
+ /** false = HIP-3 dexes never carry the fee (Hyperliquid); null = not applicable. */
63
+ hip3: false | null;
64
+ /** false = the venue's testnet has no builder flow → never attached on testnet. */
65
+ testnet: boolean;
66
+ /** Smallest fee increment (bps) the venue can express; null = feeKind "share". */
67
+ feeStepBps: number | null;
68
+ /**
69
+ * "exact" = the order carries this fee; "max" = the user approves a ceiling, the builder sets
70
+ * the actual rate (Pacifica); "share" = the venue shares its own fee with the builder — the
71
+ * user pays the normal fee and nothing extra (QFEX), so there is no feeBps.
72
+ */
73
+ feeKind: BuilderFeeKind;
74
+ /** Official doc the facts were taken from. */
75
+ docs: string;
76
+ }
77
+ export declare const BUILDER_FEE_CAPABILITIES: {
78
+ readonly [K in VenueId]: BuilderFeeCapability | null;
79
+ };
80
+ /** Why a venue has no builder-fee support (shown in CAPABILITY_UNSUPPORTED). */
81
+ export declare const BUILDER_FEE_UNSUPPORTED: {
82
+ readonly [K in VenueId]?: string;
83
+ };
84
+ export declare function builderFeeUnsupported(venue: VenueId): PerpError;
85
+ export declare function builderFeeVenues(): VenueId[];
86
+ /** Capability of a venue, or CAPABILITY_UNSUPPORTED. */
87
+ export declare function requireBuilderCapability(venue: VenueId): BuilderFeeCapability;
88
+ export interface BuilderAddressEntry {
89
+ address: string;
90
+ feeBps: number;
91
+ }
92
+ export interface BuilderCodeEntry {
93
+ code: string;
94
+ feeBps: number;
95
+ }
96
+ /** feeKind "share" (QFEX): attribution only — there is no user-paid fee, so no feeBps key. */
97
+ export interface BuilderShareEntry {
98
+ code: string;
99
+ }
100
+ /** settings.builder — absent venue = builder fee off. Ships empty. */
101
+ export interface BuilderSettings {
102
+ hyperliquid?: BuilderAddressEntry;
103
+ pacifica?: BuilderCodeEntry;
104
+ aster?: BuilderAddressEntry;
105
+ ondo?: BuilderCodeEntry;
106
+ qfex?: BuilderShareEntry;
107
+ }
108
+ /** A configured builder, normalized: identity = address (lowercase) or code. */
109
+ export interface BuilderTarget {
110
+ venue: VenueId;
111
+ identity: string;
112
+ /** Extra fee charged to the user (bps); null = feeKind "share" (the user pays the normal venue fee only). */
113
+ feeBps: number | null;
114
+ }
115
+ /** The configured user-paid fee of an "exact" / "max" venue. A "share" target has none. */
116
+ export declare function requireFeeBps(t: {
117
+ venue: VenueId;
118
+ feeBps: number | null;
119
+ }): number;
120
+ /**
121
+ * Validate one settings.builder.<venue> entry. Throws `invalid(problem)` — never clamps
122
+ * or rewrites a value. Returns the normalized target.
123
+ */
124
+ export declare function parseBuilderEntry(venue: string, raw: unknown, invalid: (problem: string) => Error): BuilderTarget;
125
+ /** Validate the whole settings.builder object (absent / null = nothing configured). */
126
+ export declare function parseBuilderSettings(raw: unknown, invalid: (problem: string) => Error): BuilderSettings;
127
+ /** "2.5 bps", or "fee share (no extra fee)" for a share target. */
128
+ export declare function feeText(t: {
129
+ feeBps: number | null;
130
+ }): string;
131
+ /** The configured target for a venue, or null (off). */
132
+ export declare function builderTargetOf(builder: BuilderSettings, venue: VenueId): BuilderTarget | null;
133
+ export type BuilderApproval =
134
+ /** The venue reports an approval covering the configured fee. maxFeeBps = approved ceiling (null = venue has no approval step). */
135
+ {
136
+ status: "approved";
137
+ maxFeeBps: number | null;
138
+ }
139
+ /** The venue reports no approval, or one below the configured fee (maxFeeBps = approved ceiling, null = none). */
140
+ | {
141
+ status: "notApproved";
142
+ maxFeeBps: number | null;
143
+ }
144
+ /** feeKind "max": the approved ceiling is ABOVE the configured fee — the builder could charge more than the user configured. */
145
+ | {
146
+ status: "aboveConsent";
147
+ maxFeeBps: number;
148
+ }
149
+ /** The approval could not be determined (request failed / response unreadable). */
150
+ | {
151
+ status: "unknown";
152
+ reason: string;
153
+ };
154
+ /** The fee an order actually carried (OrderExecution.builderFee). */
155
+ export interface AppliedBuilderFee {
156
+ venue: VenueId;
157
+ /** Builder address (lowercase) or code. */
158
+ identity: string;
159
+ /** Extra fee charged to the user (bps); null = feeKind "share". */
160
+ feeBps: number | null;
161
+ /** "max" = approved ceiling; the builder's own rate applies (Pacifica). "share" = venue fee share, nothing extra. */
162
+ feeKind: BuilderFeeKind;
163
+ /** The ceiling the venue reports as approved (bps); null = the venue has no approval step. */
164
+ approvedMaxBps: number | null;
165
+ }
166
+ export interface BuilderDecision {
167
+ applied: AppliedBuilderFee | null;
168
+ /** Why a CONFIGURED fee was not attached (null when attached or not configured). */
169
+ note: string | null;
170
+ }
171
+ export declare const NO_BUILDER: BuilderDecision;
172
+ /** How long a venue approval read is reused before it is read again. */
173
+ export declare const BUILDER_APPROVAL_TTL_MS: number;
174
+ /** Forget cached approval reads and stderr warnings (after approve / revoke; test hook). */
175
+ export declare function resetBuilderApprovalCache(): void;
176
+ /** Drop the cached approval reads of one venue + network (the next order re-reads the venue). */
177
+ export declare function invalidateBuilderApproval(venue: VenueId, network: Network): void;
178
+ /**
179
+ * Per-adapter builder-fee gate. Built only when settings.builder.<venue> is set
180
+ * (resolveBuilderGate) — an unconfigured venue has no gate and no notes at all.
181
+ */
182
+ export declare class BuilderFeeGate {
183
+ readonly target: BuilderTarget;
184
+ readonly network: Network;
185
+ /** Static reason the configured fee is never attached by this adapter (--no-builder, testnet). */
186
+ private readonly skipReason;
187
+ /** Reads the venue approval for the active account; null when the venue has no approval step. */
188
+ private readonly readApproval;
189
+ /** Account the approval belongs to (master address) — part of the cache key. */
190
+ private readonly accountOf;
191
+ constructor(target: BuilderTarget, network: Network,
192
+ /** Static reason the configured fee is never attached by this adapter (--no-builder, testnet). */
193
+ skipReason: string | null,
194
+ /** Reads the venue approval for the active account; null when the venue has no approval step. */
195
+ readApproval: ((target: BuilderTarget) => Promise<BuilderApproval>) | null,
196
+ /** Account the approval belongs to (master address) — part of the cache key. */
197
+ accountOf: () => string);
198
+ get capability(): BuilderFeeCapability;
199
+ /** Venue approval for the configured builder (cached for BUILDER_APPROVAL_TTL_MS). Failures → "unknown". */
200
+ approval(): Promise<BuilderApproval>;
201
+ /**
202
+ * Whether the next perp order carries the fee. `hip3` = the order is on a Hyperliquid
203
+ * HIP-3 dex. Never throws: a fee that cannot be attached becomes a note.
204
+ */
205
+ decide(opts: {
206
+ hip3: boolean;
207
+ }): Promise<BuilderDecision>;
208
+ private warnOnce;
209
+ }
210
+ /**
211
+ * The gate for an adapter being created, or null when settings.builder.<venue> is not
212
+ * set (default) or the context is read-only. The single place builder settings are
213
+ * resolved (adapters never read settings).
214
+ */
215
+ export declare function resolveBuilderGate(venue: VenueId, ctx: {
216
+ network: Network;
217
+ noBuilder: boolean;
218
+ readOnly: boolean;
219
+ }, builder: BuilderSettings, readApproval: ((target: BuilderTarget) => Promise<BuilderApproval>) | null, accountOf: () => string): BuilderFeeGate | null;
220
+ /** Gate held by an adapter (public `builderFee` field), or null. */
221
+ export declare function builderGateOf(adapter: unknown): BuilderFeeGate | null;
222
+ /** Decision for an adapter's next perp order (no gate = not configured = NO_BUILDER). */
223
+ export declare function builderDecisionOf(adapter: unknown, opts: {
224
+ hip3: boolean;
225
+ }): Promise<BuilderDecision>;
226
+ /** Fee rate as a decimal fraction string: 2.5 bps → "0.00025". */
227
+ export declare function bpsToRate(bps: number): string;
228
+ /** Decimal fraction (string | number) → bps, or null when unreadable. */
229
+ export declare function rateToBps(rate: unknown): number | null;
230
+ /** Hyperliquid `f` (tenths of a basis point). */
231
+ export declare function hlFeeTenthsBps(bps: number): number;
232
+ /** Hyperliquid ApproveBuilderFee maxFeeRate: a percent string ("0.01%" = 1 bp). */
233
+ export declare function hlMaxFeeRatePercent(bps: number): string;
234
+ /** feeKind "exact": approval verdict from the venue's approved ceiling (bps; null = no approval on record). */
235
+ export declare function approvalFromMax(maxFeeBps: number | null, feeBps: number): BuilderApproval;
236
+ /**
237
+ * feeKind "max" (Pacifica): the builder picks its own rate up to the approved ceiling, so the
238
+ * configured feeBps is the user's consent and the approved ceiling must not exceed it.
239
+ * null = no approval on record.
240
+ */
241
+ export declare function approvalFromCeiling(maxFeeBps: number | null, feeBps: number): BuilderApproval;
242
+ /**
243
+ * An order the venue rejected for a builder-related reason (the error text names the builder):
244
+ * the cached approval of that venue is dropped (the next order re-reads it) and the rejection is
245
+ * returned with remediation. The order is NOT retried — re-sending is a new order, so that stays
246
+ * the user's explicit choice. Any other error (or no gate) is returned unchanged.
247
+ */
248
+ export declare function builderRejectionOf(adapter: unknown, err: unknown): unknown;
249
+ /**
250
+ * Builder decision for a planned perp order on `symbol` (dry-run / preview): the same
251
+ * cached gate decision a live order would use. Hyperliquid resolves the asset id so a
252
+ * HIP-3 market reports "not attached".
253
+ */
254
+ export declare function builderPlanFor(adapter: unknown, symbol: string | null): Promise<BuilderDecision>;