dexbot 1.4.13 → 1.4.15

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 (330) hide show
  1. package/README.md +77 -68
  2. package/claw/data/positions.json +3391 -1
  3. package/claw/docs/AI_BOT_LIBRARY_API.md +1 -1
  4. package/claw/docs/POSITION_HEALTH.md +2 -2
  5. package/claw/modules/claw_catalog.ts +1 -3
  6. package/claw/modules/claw_launcher.ts +2 -3
  7. package/claw/modules/claw_skill_md.ts +1 -1
  8. package/claw/modules/decision_loop.ts +1 -1
  9. package/claw/modules/dexbot_profiles.ts +2 -33
  10. package/claw/modules/feed_price_source.ts +3 -32
  11. package/claw/modules/launcher_mode_detector.ts +1 -1
  12. package/claw/modules/mcp_utils.ts +1 -1
  13. package/claw/modules/mpa_utils.ts +36 -1
  14. package/claw/modules/position_discovery.ts +1 -28
  15. package/claw/modules/position_health.ts +1 -20
  16. package/claw/modules/position_manager.ts +3 -28
  17. package/claw/modules/skill_utils.ts +1 -1
  18. package/claw/modules/types.ts +0 -53
  19. package/claw/package.json +1 -1
  20. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  21. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  22. package/claw/skills/margin-trading/references/honest-assets.md +1 -1
  23. package/claw/skills/margin-trading/references/position-management.md +2 -2
  24. package/claw/skills/shared/references/js-automation-overview.md +2 -2
  25. package/claw/skills/trend-detection/references/service.md +24 -17
  26. package/claw/tests/test_claw_bridge.ts +47 -47
  27. package/claw/tests/test_claw_catalog_and_credentials.ts +9 -9
  28. package/claw/tests/test_claw_chain_layer.ts +54 -54
  29. package/claw/tests/test_claw_data_flow.ts +41 -41
  30. package/claw/tests/test_claw_domain_logic.ts +26 -26
  31. package/claw/tests/test_claw_manifest_and_matrix.ts +1 -1
  32. package/claw/tests/test_claw_mcp_transport.ts +16 -16
  33. package/claw/tests/test_claw_regressions.ts +43 -43
  34. package/claw/tests/test_claw_skill_generation.ts +1 -1
  35. package/claw/tests/test_claw_state_store.ts +2 -2
  36. package/claw/tests/test_dexbot_profiles.ts +4 -4
  37. package/claw/tests/test_memu_bridge.ts +3 -3
  38. package/claw/tests/test_nullclaw_tmp_integration.ts +1 -1
  39. package/claw/tests/test_position_health.ts +2 -2
  40. package/claw/tests/test_position_manager.ts +18 -18
  41. package/claw/tests/test_position_manager_watch_health.ts +2 -2
  42. package/claw/tests/test_short_mpa_strategy.ts +12 -12
  43. package/dist/analysis/chart_utils.d.ts +13 -1
  44. package/dist/analysis/chart_utils.d.ts.map +1 -1
  45. package/dist/analysis/chart_utils.js +16 -1
  46. package/dist/analysis/chart_utils.js.map +1 -1
  47. package/dist/analysis/math_utils.d.ts +8 -12
  48. package/dist/analysis/math_utils.d.ts.map +1 -1
  49. package/dist/analysis/math_utils.js +9 -75
  50. package/dist/analysis/math_utils.js.map +1 -1
  51. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +4 -4
  52. package/dist/dexbot.d.ts.map +1 -1
  53. package/dist/dexbot.js +54 -35
  54. package/dist/dexbot.js.map +1 -1
  55. package/dist/market_adapter/candle_utils.d.ts +18 -1
  56. package/dist/market_adapter/candle_utils.d.ts.map +1 -1
  57. package/dist/market_adapter/candle_utils.js +50 -1
  58. package/dist/market_adapter/candle_utils.js.map +1 -1
  59. package/dist/market_adapter/core/config_normalizers.js +1 -1
  60. package/dist/market_adapter/core/config_normalizers.js.map +1 -1
  61. package/dist/market_adapter/core/kibana_client.d.ts +2 -2
  62. package/dist/market_adapter/core/kibana_client.js +2 -2
  63. package/dist/market_adapter/core/kibana_market_candles.d.ts +1 -87
  64. package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -1
  65. package/dist/market_adapter/core/kibana_market_candles.js +1 -80
  66. package/dist/market_adapter/core/kibana_market_candles.js.map +1 -1
  67. package/dist/market_adapter/core/market_adapter_service.d.ts +0 -8
  68. package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
  69. package/dist/market_adapter/core/market_adapter_service.js +28 -115
  70. package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
  71. package/dist/market_adapter/core/signals/hurst_analyzer.d.ts.map +1 -0
  72. package/dist/{analysis/trend_detection → market_adapter/core/signals}/hurst_analyzer.js +2 -2
  73. package/dist/market_adapter/core/signals/hurst_analyzer.js.map +1 -0
  74. package/dist/{analysis/trend_detection → market_adapter/core/signals}/kalman_trend_analyzer.d.ts +0 -1
  75. package/dist/market_adapter/core/signals/kalman_trend_analyzer.d.ts.map +1 -0
  76. package/dist/{analysis/trend_detection → market_adapter/core/signals}/kalman_trend_analyzer.js +2 -4
  77. package/dist/market_adapter/core/signals/kalman_trend_analyzer.js.map +1 -0
  78. package/dist/{analysis/trend_detection → market_adapter/core/signals}/kalman_velocity_smoothing.d.ts +25 -4
  79. package/dist/market_adapter/core/signals/kalman_velocity_smoothing.d.ts.map +1 -0
  80. package/dist/{analysis/trend_detection → market_adapter/core/signals}/kalman_velocity_smoothing.js +41 -19
  81. package/dist/market_adapter/core/signals/kalman_velocity_smoothing.js.map +1 -0
  82. package/dist/market_adapter/core/signals/permutation_entropy_analyzer.d.ts.map +1 -0
  83. package/dist/{analysis/trend_detection → market_adapter/core/signals}/permutation_entropy_analyzer.js +2 -2
  84. package/dist/market_adapter/core/signals/permutation_entropy_analyzer.js.map +1 -0
  85. package/dist/market_adapter/core/strategies/ama.d.ts +1 -19
  86. package/dist/market_adapter/core/strategies/ama.d.ts.map +1 -1
  87. package/dist/market_adapter/core/strategies/ama.js +1 -1
  88. package/dist/market_adapter/core/strategies/ama.js.map +1 -1
  89. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +2 -13
  90. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -1
  91. package/dist/market_adapter/core/strategies/ama_slope_model.js +15 -26
  92. package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -1
  93. package/dist/market_adapter/core/strategies/atr/calculator.d.ts +38 -3
  94. package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -1
  95. package/dist/market_adapter/core/strategies/atr/calculator.js +84 -24
  96. package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -1
  97. package/dist/market_adapter/core/strategies/collateral_manager.d.ts +1 -1
  98. package/dist/market_adapter/core/strategies/collateral_manager.js +1 -1
  99. package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts +32 -0
  100. package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts.map +1 -0
  101. package/dist/market_adapter/core/strategies/dynamic_weight_series.js +136 -0
  102. package/dist/market_adapter/core/strategies/dynamic_weight_series.js.map +1 -0
  103. package/dist/market_adapter/core/strategies/regime_gate.d.ts +6 -21
  104. package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -1
  105. package/dist/market_adapter/core/strategies/regime_gate.js +11 -74
  106. package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -1
  107. package/dist/market_adapter/core/strategies/regime_interp.d.ts +13 -0
  108. package/dist/market_adapter/core/strategies/regime_interp.d.ts.map +1 -0
  109. package/dist/market_adapter/core/strategies/regime_interp.js +74 -0
  110. package/dist/market_adapter/core/strategies/regime_interp.js.map +1 -0
  111. package/dist/market_adapter/core/strategies/volatility_shift.d.ts +22 -0
  112. package/dist/market_adapter/core/strategies/volatility_shift.d.ts.map +1 -0
  113. package/dist/market_adapter/core/strategies/volatility_shift.js +37 -0
  114. package/dist/market_adapter/core/strategies/volatility_shift.js.map +1 -0
  115. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +3 -4
  116. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
  117. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +1 -10
  118. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  119. package/dist/market_adapter/inputs/fetch_lp_data.js +1 -1
  120. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  121. package/dist/market_adapter/lp_chart_core.d.ts.map +1 -1
  122. package/dist/market_adapter/lp_chart_core.js +0 -10
  123. package/dist/market_adapter/lp_chart_core.js.map +1 -1
  124. package/dist/market_adapter/lp_chart_runner.d.ts +1 -16
  125. package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -1
  126. package/dist/market_adapter/lp_chart_runner.js +1 -15
  127. package/dist/market_adapter/lp_chart_runner.js.map +1 -1
  128. package/dist/market_adapter/market_adapter.d.ts +3 -3
  129. package/dist/market_adapter/market_adapter.d.ts.map +1 -1
  130. package/dist/market_adapter/market_adapter.js +6 -8
  131. package/dist/market_adapter/market_adapter.js.map +1 -1
  132. package/dist/market_adapter/merge_lp_data.js +5 -5
  133. package/dist/market_adapter/utils/adapter_client.d.ts +1 -3
  134. package/dist/market_adapter/utils/adapter_client.d.ts.map +1 -1
  135. package/dist/market_adapter/utils/adapter_client.js +1 -14
  136. package/dist/market_adapter/utils/adapter_client.js.map +1 -1
  137. package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -1
  138. package/dist/market_adapter/utils/data_discovery.js +1 -2
  139. package/dist/market_adapter/utils/data_discovery.js.map +1 -1
  140. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts +1 -3
  141. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -1
  142. package/dist/market_adapter/utils/dynamic_grid_snapshot.js +1 -1
  143. package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -1
  144. package/dist/market_adapter/utils/file_lock.d.ts +10 -2
  145. package/dist/market_adapter/utils/file_lock.d.ts.map +1 -1
  146. package/dist/market_adapter/utils/file_lock.js +171 -102
  147. package/dist/market_adapter/utils/file_lock.js.map +1 -1
  148. package/dist/market_adapter/utils/native_history.d.ts +1 -9
  149. package/dist/market_adapter/utils/native_history.d.ts.map +1 -1
  150. package/dist/market_adapter/utils/native_history.js +1 -21
  151. package/dist/market_adapter/utils/native_history.js.map +1 -1
  152. package/dist/modules/account_bots.d.ts +16 -38
  153. package/dist/modules/account_bots.d.ts.map +1 -1
  154. package/dist/modules/account_bots.js +16 -38
  155. package/dist/modules/account_bots.js.map +1 -1
  156. package/dist/modules/account_orders.d.ts +11 -11
  157. package/dist/modules/account_orders.d.ts.map +1 -1
  158. package/dist/modules/account_orders.js +11 -18
  159. package/dist/modules/account_orders.js.map +1 -1
  160. package/dist/modules/bitshares_client.d.ts +5 -8
  161. package/dist/modules/bitshares_client.d.ts.map +1 -1
  162. package/dist/modules/bitshares_client.js +6 -10
  163. package/dist/modules/bitshares_client.js.map +1 -1
  164. package/dist/modules/bots_file_lock.d.ts +8 -5
  165. package/dist/modules/bots_file_lock.d.ts.map +1 -1
  166. package/dist/modules/bots_file_lock.js +8 -5
  167. package/dist/modules/bots_file_lock.js.map +1 -1
  168. package/dist/modules/chain_keys.d.ts +31 -22
  169. package/dist/modules/chain_keys.d.ts.map +1 -1
  170. package/dist/modules/chain_keys.js +31 -22
  171. package/dist/modules/chain_keys.js.map +1 -1
  172. package/dist/modules/chain_orders.d.ts +52 -48
  173. package/dist/modules/chain_orders.d.ts.map +1 -1
  174. package/dist/modules/chain_orders.js +124 -49
  175. package/dist/modules/chain_orders.js.map +1 -1
  176. package/dist/modules/config.d.ts +3 -0
  177. package/dist/modules/config.d.ts.map +1 -1
  178. package/dist/modules/config.js +3 -0
  179. package/dist/modules/config.js.map +1 -1
  180. package/dist/modules/constants.d.ts +17 -13
  181. package/dist/modules/constants.d.ts.map +1 -1
  182. package/dist/modules/constants.js +42 -21
  183. package/dist/modules/constants.js.map +1 -1
  184. package/dist/modules/cr_planner.d.ts +2 -1
  185. package/dist/modules/cr_planner.d.ts.map +1 -1
  186. package/dist/modules/cr_planner.js +1 -1
  187. package/dist/modules/cr_planner.js.map +1 -1
  188. package/dist/modules/credential_policy.d.ts +6 -4
  189. package/dist/modules/credential_policy.d.ts.map +1 -1
  190. package/dist/modules/credential_policy.js +6 -4
  191. package/dist/modules/credential_policy.js.map +1 -1
  192. package/dist/modules/credit_runtime.d.ts.map +1 -1
  193. package/dist/modules/credit_runtime.js +4 -8
  194. package/dist/modules/credit_runtime.js.map +1 -1
  195. package/dist/modules/dexbot_class.d.ts +33 -88
  196. package/dist/modules/dexbot_class.d.ts.map +1 -1
  197. package/dist/modules/dexbot_class.js +36 -68
  198. package/dist/modules/dexbot_class.js.map +1 -1
  199. package/dist/modules/dexbot_cow_runtime.d.ts +7 -7
  200. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  201. package/dist/modules/dexbot_cow_runtime.js +7 -7
  202. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  203. package/dist/modules/dexbot_credential_client.d.ts +3 -3
  204. package/dist/modules/dexbot_credential_client.js +3 -3
  205. package/dist/modules/dexbot_credential_client.js.map +1 -1
  206. package/dist/modules/dexbot_fill_runtime.d.ts +1 -7
  207. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  208. package/dist/modules/dexbot_fill_runtime.js +1 -9
  209. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  210. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  211. package/dist/modules/dexbot_maintenance_runtime.js +3 -1
  212. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  213. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  214. package/dist/modules/dexbot_state_recovery.js +99 -1
  215. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  216. package/dist/modules/graceful_shutdown.d.ts +4 -2
  217. package/dist/modules/graceful_shutdown.d.ts.map +1 -1
  218. package/dist/modules/graceful_shutdown.js +4 -2
  219. package/dist/modules/graceful_shutdown.js.map +1 -1
  220. package/dist/modules/launcher/bot_supervisor.d.ts +1 -1
  221. package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
  222. package/dist/modules/launcher/bot_supervisor.js +1 -4
  223. package/dist/modules/launcher/bot_supervisor.js.map +1 -1
  224. package/dist/modules/launcher/child_env.d.ts.map +1 -1
  225. package/dist/modules/launcher/child_env.js +3 -0
  226. package/dist/modules/launcher/child_env.js.map +1 -1
  227. package/dist/modules/market_adapter_whitelist.d.ts +1 -2
  228. package/dist/modules/market_adapter_whitelist.d.ts.map +1 -1
  229. package/dist/modules/market_adapter_whitelist.js +1 -4
  230. package/dist/modules/market_adapter_whitelist.js.map +1 -1
  231. package/dist/modules/node_health_cache.d.ts +12 -4
  232. package/dist/modules/node_health_cache.d.ts.map +1 -1
  233. package/dist/modules/node_health_cache.js +13 -13
  234. package/dist/modules/node_health_cache.js.map +1 -1
  235. package/dist/modules/node_manager.d.ts.map +1 -1
  236. package/dist/modules/node_manager.js +3 -6
  237. package/dist/modules/node_manager.js.map +1 -1
  238. package/dist/modules/order/accounting.d.ts +2 -37
  239. package/dist/modules/order/accounting.d.ts.map +1 -1
  240. package/dist/modules/order/accounting.js +2 -64
  241. package/dist/modules/order/accounting.js.map +1 -1
  242. package/dist/modules/order/export.d.ts +1 -37
  243. package/dist/modules/order/export.d.ts.map +1 -1
  244. package/dist/modules/order/export.js +1 -1
  245. package/dist/modules/order/export.js.map +1 -1
  246. package/dist/modules/order/format.d.ts +28 -14
  247. package/dist/modules/order/format.d.ts.map +1 -1
  248. package/dist/modules/order/format.js +73 -18
  249. package/dist/modules/order/format.js.map +1 -1
  250. package/dist/modules/order/grid.d.ts +11 -5
  251. package/dist/modules/order/grid.d.ts.map +1 -1
  252. package/dist/modules/order/grid.js +79 -37
  253. package/dist/modules/order/grid.js.map +1 -1
  254. package/dist/modules/order/grid_reconcile_internal.js +2 -2
  255. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  256. package/dist/modules/order/logger_state.d.ts +3 -45
  257. package/dist/modules/order/logger_state.d.ts.map +1 -1
  258. package/dist/modules/order/logger_state.js +3 -55
  259. package/dist/modules/order/logger_state.js.map +1 -1
  260. package/dist/modules/order/manager.d.ts +0 -4
  261. package/dist/modules/order/manager.d.ts.map +1 -1
  262. package/dist/modules/order/manager.js +3 -9
  263. package/dist/modules/order/manager.js.map +1 -1
  264. package/dist/modules/order/sync_engine.d.ts +0 -2
  265. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  266. package/dist/modules/order/sync_engine.js +1 -4
  267. package/dist/modules/order/sync_engine.js.map +1 -1
  268. package/dist/modules/order/utils/math.d.ts +2 -11
  269. package/dist/modules/order/utils/math.d.ts.map +1 -1
  270. package/dist/modules/order/utils/math.js +3 -14
  271. package/dist/modules/order/utils/math.js.map +1 -1
  272. package/dist/modules/order/utils/order.d.ts +1 -17
  273. package/dist/modules/order/utils/order.d.ts.map +1 -1
  274. package/dist/modules/order/utils/order.js +3 -21
  275. package/dist/modules/order/utils/order.js.map +1 -1
  276. package/dist/modules/order/utils/system.d.ts +1 -11
  277. package/dist/modules/order/utils/system.d.ts.map +1 -1
  278. package/dist/modules/order/utils/system.js +3 -3
  279. package/dist/modules/order/utils/system.js.map +1 -1
  280. package/dist/modules/order/utils/validate.d.ts +1 -26
  281. package/dist/modules/order/utils/validate.d.ts.map +1 -1
  282. package/dist/modules/order/utils/validate.js +1 -1
  283. package/dist/modules/order/utils/validate.js.map +1 -1
  284. package/dist/modules/order/working_grid.d.ts +3 -9
  285. package/dist/modules/order/working_grid.d.ts.map +1 -1
  286. package/dist/modules/order/working_grid.js +3 -11
  287. package/dist/modules/order/working_grid.js.map +1 -1
  288. package/dist/modules/paths.d.ts +43 -2
  289. package/dist/modules/paths.d.ts.map +1 -1
  290. package/dist/modules/paths.js +81 -21
  291. package/dist/modules/paths.js.map +1 -1
  292. package/dist/modules/runtime_settings.js +1 -1
  293. package/dist/modules/runtime_settings.js.map +1 -1
  294. package/dist/pm2.d.ts +1 -1
  295. package/dist/pm2.d.ts.map +1 -1
  296. package/dist/pm2.js +1 -4
  297. package/dist/pm2.js.map +1 -1
  298. package/dist/scripts/analyze-orders.d.ts.map +1 -1
  299. package/dist/scripts/analyze-orders.js +36 -45
  300. package/dist/scripts/analyze-orders.js.map +1 -1
  301. package/dist/scripts/sync-version.js +22 -0
  302. package/dist/scripts/sync-version.js.map +1 -1
  303. package/ecosystem.config.cjs +32 -0
  304. package/package.json +4 -1
  305. package/scripts/README.md +24 -8
  306. package/scripts/clear-all.sh +39 -12
  307. package/scripts/clear-logs.sh +1 -1
  308. package/scripts/clear-market-adapter.sh +3 -3
  309. package/scripts/clear-orders.sh +1 -1
  310. package/scripts/create-bot-symlinks.sh +4 -2
  311. package/scripts/lib/dexbot-paths.sh +63 -0
  312. package/scripts/reset-settings.sh +1 -1
  313. package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +0 -1
  314. package/dist/analysis/trend_detection/hurst_analyzer.js.map +0 -1
  315. package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +0 -1
  316. package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +0 -1
  317. package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +0 -1
  318. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +0 -1
  319. package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +0 -1
  320. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +0 -1
  321. package/dist/market_adapter/index.d.ts +0 -32
  322. package/dist/market_adapter/index.d.ts.map +0 -1
  323. package/dist/market_adapter/index.js +0 -39
  324. package/dist/market_adapter/index.js.map +0 -1
  325. package/dist/scripts/fix-err-message.d.ts +0 -3
  326. package/dist/scripts/fix-err-message.d.ts.map +0 -1
  327. package/dist/scripts/fix-err-message.js +0 -193
  328. package/dist/scripts/fix-err-message.js.map +0 -1
  329. /package/dist/{analysis/trend_detection → market_adapter/core/signals}/hurst_analyzer.d.ts +0 -0
  330. /package/dist/{analysis/trend_detection → market_adapter/core/signals}/permutation_entropy_analyzer.d.ts +0 -0
@@ -15,7 +15,7 @@
15
15
  * Time/Performance (ms, %): 1-2 decimals - readable metrics
16
16
  *
17
17
  * ===============================================================================
18
- * TABLE OF CONTENTS (17 exported functions)
18
+ * TABLE OF CONTENTS (14 exported functions)
19
19
  * ===============================================================================
20
20
  *
21
21
  * SECTION 1: ASSET FORMATTING (4 functions)
@@ -34,15 +34,12 @@
34
34
  * 10. formatPercent(value, decimals) - Format with custom decimal places
35
35
  *
36
36
  * SECTION 4: RATIO/METRIC FORMATTING (3 functions)
37
- * 11. formatRatio(value, decimals) - Format ratios with custom decimals (default 5)
38
- * 13. formatMetric2(value) - Format to 2 decimals (timing, performance)
39
- * 14. formatMetric5(value) - Format to 5 decimals (detailed metrics)
37
+ * 11. formatMetric2(value) - Format to 2 decimals (timing, performance)
40
38
  *
41
39
  * SECTION 5: HELPER UTILITIES (4 functions)
42
- * 15. isValidNumber(value) - Check if value is defined and finite
43
- * 16. isNumeric(val) - Check if value is a number or parseable numeric string
44
- * 17. toFiniteNumber(value, defaultValue) - Convert to finite number with fallback
45
- * 18. safeFormat(value, decimals, fallback) - Safely format with fallback
40
+ * 12. isValidNumber(value) - Check if value is defined and finite
41
+ * 13. toFiniteNumber(value, defaultValue) - Convert to finite number with fallback
42
+ * 14. safeFormat(value, decimals, fallback) - Safely format with fallback
46
43
  *
47
44
  * ===============================================================================
48
45
  */
@@ -119,7 +116,7 @@ function formatSizeByOrderType(value, orderType, assets) {
119
116
  * @returns {string} Formatted price to 8 decimals
120
117
  */
121
118
  function formatPrice(value) {
122
- return safeFormat(value, 8);
119
+ return formatAmount8(value);
123
120
  }
124
121
  function formatPrice6(value) {
125
122
  return safeFormat(value, 6);
@@ -127,6 +124,68 @@ function formatPrice6(value) {
127
124
  function formatPrice4(value) {
128
125
  return safeFormat(value, 4);
129
126
  }
127
+ /**
128
+ * Format a number to N significant digits (not fixed decimals).
129
+ * Examples with digits=4: 1234.5678 -> "1235", 12.3456 -> "12.35", 0.12345 -> "0.1235"
130
+ *
131
+ * @param {number} value - The value to format
132
+ * @param {number} digits - Number of significant digits (default 4)
133
+ * @returns {string} Formatted value
134
+ */
135
+ function formatSignificant(value, digits = 4) {
136
+ if (!isValidNumber(value))
137
+ return 'N/A';
138
+ const num = Number(value);
139
+ if (num === 0)
140
+ return '0';
141
+ const abs = Math.abs(num);
142
+ const intDigits = Math.floor(Math.log10(abs)) + 1;
143
+ const formatted = intDigits >= digits
144
+ ? String(Math.round(num))
145
+ : num.toFixed(digits - intDigits);
146
+ return formatted;
147
+ }
148
+ /**
149
+ * Format a number with SI micro-value suffixes for very small values,
150
+ * otherwise formats with significant digits and comma grouping.
151
+ * Examples: 1234.56 -> "1,235", 0.00567 -> "5.67m", 0.00000123 -> "1.23µ"
152
+ *
153
+ * @param {number} value - The value to format
154
+ * @param {number} digits - Number of significant digits (default 4)
155
+ * @returns {string} Formatted value with suffix if small
156
+ */
157
+ function formatCurrency(value, digits = 4) {
158
+ if (!isValidNumber(value))
159
+ return 'N/A';
160
+ const num = Number(value);
161
+ if (num === 0)
162
+ return '0';
163
+ const abs = Math.abs(num);
164
+ if (abs < 0.1) {
165
+ if (abs >= 0.001)
166
+ return formatCurrency(num * 1000, digits) + 'm';
167
+ if (abs >= 0.000001)
168
+ return formatCurrency(num * 1000000, digits) + 'µ';
169
+ if (abs >= 1e-9)
170
+ return formatCurrency(num * 1e9, digits) + 'n';
171
+ if (abs >= 1e-12)
172
+ return formatCurrency(num * 1e12, digits) + 'p';
173
+ if (abs >= 1e-15)
174
+ return formatCurrency(num * 1e15, digits) + 'f';
175
+ if (abs >= 1e-18)
176
+ return formatCurrency(num * 1e18, digits) + 'a';
177
+ return safeFormat(num, 6);
178
+ }
179
+ let intDigits = Math.floor(Math.log10(abs)) + 1;
180
+ if (abs < 1)
181
+ intDigits = 1;
182
+ const formatted = intDigits >= digits
183
+ ? String(Math.round(num))
184
+ : num.toFixed(digits - intDigits);
185
+ return intDigits >= 4
186
+ ? formatted.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
187
+ : formatted;
188
+ }
130
189
  // ===============================================================================
131
190
  // SECTION 3: PERCENTAGE FORMATTING
132
191
  // ===============================================================================
@@ -147,14 +206,13 @@ function formatPercent(value, decimals = 2) {
147
206
  // SECTION 4: RATIO/METRIC FORMATTING
148
207
  // ===============================================================================
149
208
  /**
150
- * Format ratios with custom decimal places
209
+ * Format metric to 2 decimal places
151
210
  *
152
- * @param {number} value - The ratio value
153
- * @param {number} [decimals=5] - Number of decimal places (default 5)
154
- * @returns {string} Formatted ratio
211
+ * @param {number} value - The metric value
212
+ * @returns {string} Formatted metric
155
213
  */
156
214
  function formatMetric2(value) {
157
- return safeFormat(value, 2);
215
+ return formatPercent2(value);
158
216
  }
159
217
  // ===============================================================================
160
218
  // SECTION 5: HELPER UTILITIES
@@ -167,9 +225,6 @@ function formatMetric2(value) {
167
225
  function isValidNumber(value) {
168
226
  return value !== null && value !== undefined && Number.isFinite(Number(value));
169
227
  }
170
- function isNumeric(val) {
171
- return typeof val === 'number' || (typeof val === 'string' && val.trim() !== '' && !Number.isNaN(Number(val)));
172
- }
173
228
  /**
174
229
  * Safely convert a value to a finite number.
175
230
  *
@@ -202,5 +257,5 @@ function safeFormat(value, decimals, fallback = 'N/A') {
202
257
  // ===============================================================================
203
258
  // EXPORTS
204
259
  // ===============================================================================
205
- export { formatAmount8, formatAmount, formatAmountByPrecision, formatSizeByOrderType, formatPrice, formatPrice6, formatPrice4, formatPercent2, formatPercent, formatMetric2, isValidNumber, isNumeric, toFiniteNumber, safeFormat };
260
+ export { formatAmount8, formatAmount, formatAmountByPrecision, formatSizeByOrderType, formatPrice, formatPrice6, formatPrice4, formatSignificant, formatCurrency, formatPercent2, formatPercent, formatMetric2, isValidNumber, toFiniteNumber, safeFormat };
206
261
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../modules/order/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../modules/order/format.ts"],"names":[],"mappings":"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"}
@@ -93,7 +93,9 @@
93
93
  *
94
94
  * ===============================================================================
95
95
  */
96
- export declare function calculateGapSlots(incrementPercent: any, targetSpreadPercent: any, gridLimitsOverride?: Record<string, any>): any;
96
+ import { calculateGapSlots as _mathGapSlots } from './utils/math.js';
97
+ declare const calculateGapSlots: typeof _mathGapSlots;
98
+ export { calculateGapSlots };
97
99
  export declare function isGridBloated(manager: any, orders: any): any;
98
100
  /**
99
101
  * Check whether the grid-bloat grace period is still active, i.e. a
@@ -401,10 +403,14 @@ export declare function checkGridHealth(manager: any, _updateOrdersOnChainBatch?
401
403
  * The top-of-window partial (closest to market) is always eligible for dust
402
404
  * detection since cancelling it is just the grid edge moving inward.
403
405
  *
404
- * Interior partials (further from market) are only eligible if they have a
405
- * duplicate price level — another active order at essentially the same price.
406
- * Cancelling such an interior partial won't leave a gap in the grid because
407
- * the sibling active order already covers that price level.
406
+ * Interior partials (further from market) are eligible when they have a
407
+ * duplicate price level — another active order at essentially the same price —
408
+ * or when their size is already below the per-slot dust threshold. In the
409
+ * duplicate-price case cancelling won't leave a gap because the sibling
410
+ * active order already covers that price level; in the below-threshold case
411
+ * the residual is economically negligible and otherwise strands forever (the
412
+ * residual path only cancels zero-value residuals, and interior dust rarely
413
+ * has a duplicate price level) — cancelling lets rotation re-derive the slot.
408
414
  *
409
415
  * Returns boolean flags plus the actual dust order objects so callers can act
410
416
  * on individual orders (dust is cancelled immediately on detection).
@@ -1 +1 @@
1
- {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../modules/order/grid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../modules/order/grid.ts"],"names":[],"mappings":"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"}
@@ -111,15 +111,14 @@ function _snapshotFundState(manager) {
111
111
  sellLocked: Number(manager.accountTotals?.sellLocked || 0),
112
112
  };
113
113
  }
114
- import { floatToBlockchainInt, getPrecisionByOrderType, getPrecisionsForManager, calculateOrderCreationFees, calculateOrderSizes, calculateRotationOrderSizes, calculateAvailableFundsValue, calculateGridSideDivergenceMetric, getPrecisionSlack, getMinAbsoluteOrderSize, getSingleDustThreshold, getGridBestPrices, calculateSpreadFromOrders, allocateFundsByWeights, calculateGapSlots as _mathGapSlots, findPriceCollision, getBtsSide, getSellStartIdx, resolveGapBand, countGapBandSpread, adjustBudgetForBtsFees, } from './utils/math.js';
114
+ import { floatToBlockchainInt, getPrecisionByOrderType, getPrecisionsForManager, calculateOrderCreationFees, calculateOrderSizes, calculateRotationOrderSizes, calculateAvailableFundsValue, calculateGridSideDivergenceMetric, getPrecisionSlack, getMinOrderSize, getSingleDustThreshold, getGridBestPrices, calculateSpreadFromOrders, allocateFundsByWeights, calculateGapSlots as _mathGapSlots, findPriceCollision, getBtsSide, getSellStartIdx, resolveGapBand, countGapBandSpread, adjustBudgetForBtsFees, } from './utils/math.js';
115
115
  import { filterOrdersByType, checkSizesBeforeMinimum, checkSizeThreshold, resolveConfiguredPriceBound, shouldFlagOutOfSpread, isOrderHealthy, isPhantomOrder, isSlotAvailable, isOrderOnChain, isOrderPlaced, hasOnChainId, isEmptyGridSlot, parseSlotIndex, calculateIdealBoundary, assignGridRoles, resolveOnChainRetypeType } from './utils/order.js';
116
116
  import { loadAmaCenterPrice, loadAmaCenterSnapshot, withBlockchainRetry } from './utils/system.js';
117
117
  import { derivePriceWithPoolRef } from './utils/withPoolRef.js';
118
118
  import { getWhitelistFlags } from '../market_adapter_whitelist.js';
119
119
  import { getErrorMessage } from '../utils/errors.js';
120
- export function calculateGapSlots(incrementPercent, targetSpreadPercent, gridLimitsOverride) {
121
- return _mathGapSlots(incrementPercent, targetSpreadPercent, gridLimitsOverride ?? GRID_LIMITS);
122
- }
120
+ const calculateGapSlots = _mathGapSlots;
121
+ export { calculateGapSlots };
123
122
  export function isGridBloated(manager, orders) {
124
123
  const gridSize = Array.isArray(orders) ? orders.length : orders.size;
125
124
  if (!gridSize || !manager?.config)
@@ -863,8 +862,8 @@ export async function initializeGrid(manager) {
863
862
  }
864
863
  }
865
864
  }
866
- const minSellSize = getMinAbsoluteOrderSize(ORDER_TYPES.SELL, manager.assets);
867
- const minBuySize = getMinAbsoluteOrderSize(ORDER_TYPES.BUY, manager.assets);
865
+ const minSellSize = getMinOrderSize(ORDER_TYPES.SELL, manager.assets);
866
+ const minBuySize = getMinOrderSize(ORDER_TYPES.BUY, manager.assets);
868
867
  const { A: precA, B: precB } = getPrecisionsForManager(manager.assets);
869
868
  // Use centralized sizing context for both sides.
870
869
  // Resolve funds once upfront so both contexts share the same snapshot,
@@ -882,8 +881,8 @@ export async function initializeGrid(manager) {
882
881
  throw new Error('Calculated orders fall below minimum allowable size.');
883
882
  }
884
883
  // Check for warning if orders are near minimal size (regression fix)
885
- const warningSellSize = minSellSize > 0 ? getMinAbsoluteOrderSize(ORDER_TYPES.SELL, manager.assets, 100) : 0;
886
- const warningBuySize = minBuySize > 0 ? getMinAbsoluteOrderSize(ORDER_TYPES.BUY, manager.assets, 100) : 0;
884
+ const warningSellSize = minSellSize > 0 ? getMinOrderSize(ORDER_TYPES.SELL, manager.assets, 100) : 0;
885
+ const warningBuySize = minBuySize > 0 ? getMinOrderSize(ORDER_TYPES.BUY, manager.assets, 100) : 0;
887
886
  if (checkSizeThreshold(sells, warningSellSize, precA, false) || checkSizeThreshold(buys, warningBuySize, precB, false)) {
888
887
  manager.logger?.log?.("WARNING: Order grid contains orders near minimum size. To ensure the bot runs properly, consider increasing the funds of your bot.", "warn");
889
888
  }
@@ -1749,10 +1748,14 @@ export async function checkGridHealth(manager, _updateOrdersOnChainBatch = null)
1749
1748
  * The top-of-window partial (closest to market) is always eligible for dust
1750
1749
  * detection since cancelling it is just the grid edge moving inward.
1751
1750
  *
1752
- * Interior partials (further from market) are only eligible if they have a
1753
- * duplicate price level — another active order at essentially the same price.
1754
- * Cancelling such an interior partial won't leave a gap in the grid because
1755
- * the sibling active order already covers that price level.
1751
+ * Interior partials (further from market) are eligible when they have a
1752
+ * duplicate price level — another active order at essentially the same price —
1753
+ * or when their size is already below the per-slot dust threshold. In the
1754
+ * duplicate-price case cancelling won't leave a gap because the sibling
1755
+ * active order already covers that price level; in the below-threshold case
1756
+ * the residual is economically negligible and otherwise strands forever (the
1757
+ * residual path only cancels zero-value residuals, and interior dust rarely
1758
+ * has a duplicate price level) — cancelling lets rotation re-derive the slot.
1756
1759
  *
1757
1760
  * Returns boolean flags plus the actual dust order objects so callers can act
1758
1761
  * on individual orders (dust is cancelled immediately on detection).
@@ -1786,12 +1789,37 @@ export async function checkWindowDust(manager) {
1786
1789
  const allPartials = allOrders.filter((o) => isLiveOrder(o) && o.state === ORDER_STATES.PARTIAL);
1787
1790
  const isTopBuy = (o) => topBuyOrder && o.id === topBuyOrder.id;
1788
1791
  const isTopSell = (o) => topSellOrder && o.id === topSellOrder.id;
1792
+ // Compute per-slot dust thresholds once per side so the eligibility
1793
+ // filter below and _getDustOrders share the same sizing context
1794
+ // (avoids a duplicate recalculateFunds round per side). Each side's map
1795
+ // is only computed when that side actually has a partial candidate —
1796
+ // _computeDustThresholdMap runs a fund recalculation, so an empty side
1797
+ // must not pay for it.
1798
+ if (allPartials.length === 0) {
1799
+ return { buyDust: false, sellDust: false, buyDustOrders: [], sellDustOrders: [] };
1800
+ }
1801
+ const buyPartials = allPartials.filter((o) => o.type === ORDER_TYPES.BUY);
1802
+ const sellPartials = allPartials.filter((o) => o.type === ORDER_TYPES.SELL);
1803
+ const [buyThresholds, sellThresholds] = await Promise.all([
1804
+ buyPartials.length > 0 ? _computeDustThresholdMap(manager, ORDER_TYPES.BUY) : Promise.resolve(new Map()),
1805
+ sellPartials.length > 0 ? _computeDustThresholdMap(manager, ORDER_TYPES.SELL) : Promise.resolve(new Map()),
1806
+ ]);
1807
+ // A partial is below its per-slot dust threshold (economically negligible).
1808
+ const isDustSized = (o, thresholds) => {
1809
+ const threshold = thresholds.get(o.id);
1810
+ return !!threshold && threshold > 0 && o.size < threshold;
1811
+ };
1789
1812
  // Safety filter: top-of-window partials always qualify; interior partials
1790
- // only qualify if they have a duplicate price level (no gap risk).
1791
- const eligibleBuyPartials = allPartials.filter((o) => o.type === ORDER_TYPES.BUY && (isTopBuy(o) || hasDuplicatePriceLevel(o, assets)));
1792
- const eligibleSellPartials = allPartials.filter((o) => o.type === ORDER_TYPES.SELL && (isTopSell(o) || hasDuplicatePriceLevel(o, assets)));
1793
- const buyDustOrders = await _getDustOrders(manager, eligibleBuyPartials, ORDER_TYPES.BUY);
1794
- const sellDustOrders = await _getDustOrders(manager, eligibleSellPartials, ORDER_TYPES.SELL);
1813
+ // qualify if they have a duplicate price level (no gap risk) OR their
1814
+ // size is already below the dust threshold. A sub-threshold interior
1815
+ // partial would otherwise strand on the book forever: the residual path
1816
+ // only cancels zero-value residuals, and an interior dust rarely has a
1817
+ // duplicate price level. Cancelling it frees the slot for rotation to
1818
+ // re-derive, so the tiny gap is closed by normal grid rebalancing.
1819
+ const eligibleBuyPartials = allPartials.filter((o) => o.type === ORDER_TYPES.BUY && (isTopBuy(o) || hasDuplicatePriceLevel(o, assets) || isDustSized(o, buyThresholds)));
1820
+ const eligibleSellPartials = allPartials.filter((o) => o.type === ORDER_TYPES.SELL && (isTopSell(o) || hasDuplicatePriceLevel(o, assets) || isDustSized(o, sellThresholds)));
1821
+ const buyDustOrders = await _getDustOrders(manager, eligibleBuyPartials, ORDER_TYPES.BUY, buyThresholds);
1822
+ const sellDustOrders = await _getDustOrders(manager, eligibleSellPartials, ORDER_TYPES.SELL, sellThresholds);
1795
1823
  return {
1796
1824
  buyDust: buyDustOrders.length > 0,
1797
1825
  sellDust: sellDustOrders.length > 0,
@@ -1800,40 +1828,54 @@ export async function checkWindowDust(manager) {
1800
1828
  };
1801
1829
  }
1802
1830
  /**
1803
- * Return the subset of partial orders that qualify as dust on a given side.
1804
- * Shares the same sizing context as _hasAnyDust but returns the actual order
1805
- * objects so callers can act on them (e.g. auto-cancel).
1831
+ * Compute the per-slot dust threshold for every order of a given type.
1832
+ * Returns a Map<orderId, threshold> using the same sizing context as
1833
+ * _getDustOrders so eligibility and dust classification stay consistent.
1806
1834
  * @private
1807
1835
  * @param {import('./types').OrderManager} manager
1808
- * @param {Array<import('./types').GridOrderSlot>} partials - Candidate partial orders to test.
1809
1836
  * @param {string} type - ORDER_TYPES.BUY or ORDER_TYPES.SELL
1810
- * @returns {Promise<Array<import('./types').GridOrderSlot>>} Orders whose size is below the dust threshold.
1837
+ * @returns {Promise<Map<string, number>>}
1811
1838
  */
1812
- async function _getDustOrders(manager, partials, type) {
1813
- if (!partials || partials.length === 0)
1814
- return [];
1839
+ async function _computeDustThresholdMap(manager, type) {
1815
1840
  const side = type === ORDER_TYPES.BUY ? 'buy' : 'sell';
1816
1841
  const ctx = await _getSizingContext(manager, side);
1817
1842
  const dustThresholdPercent = manager.config?.gridLimits?.PARTIAL_DUST_THRESHOLD_PERCENTAGE;
1818
1843
  const sideSlots = Array.from(manager.orders.values())
1819
1844
  .filter((o) => o.type === type)
1820
1845
  .sort((a, b) => a.price - b.price);
1821
- if (sideSlots.length === 0)
1822
- return [];
1823
1846
  const idealSizes = ctx && ctx.budget > 0
1824
1847
  ? allocateFundsByWeights(ctx.budget, sideSlots.length, manager.config.weightDistribution[side], manager.config.incrementPercent / 100, type === ORDER_TYPES.BUY, 0, ctx.precision)
1825
1848
  : [];
1826
- // When no budget is available, idealSizes becomes [] so every
1827
- // partial's threshold collapses to 0 — no order qualifies as dust.
1828
- // We still run the filter for uniformity so the threshold logic
1829
- // stays consistent regardless of budget state.
1830
- return partials.filter((p) => {
1831
- const idx = sideSlots.findIndex((s) => s.id === p.id);
1832
- if (idx === -1)
1833
- return false;
1849
+ const map = new Map();
1850
+ sideSlots.forEach((s, idx) => {
1834
1851
  const threshold = idealSizes.length > idx && idealSizes[idx] > 0
1835
1852
  ? getSingleDustThreshold(idealSizes[idx], dustThresholdPercent)
1836
1853
  : 0;
1854
+ map.set(s.id, threshold);
1855
+ });
1856
+ return map;
1857
+ }
1858
+ /**
1859
+ * Return the subset of partial orders that qualify as dust on a given side.
1860
+ * Shares the same sizing context as _hasAnyDust but returns the actual order
1861
+ * objects so callers can act on them (e.g. auto-cancel).
1862
+ * @private
1863
+ * @param {import('./types').OrderManager} manager
1864
+ * @param {Array<import('./types').GridOrderSlot>} partials - Candidate partial orders to test.
1865
+ * @param {string} type - ORDER_TYPES.BUY or ORDER_TYPES.SELL
1866
+ * @param {Map<string, number>} [thresholdMap=null] - Optional precomputed per-slot dust thresholds.
1867
+ * @returns {Promise<Array<import('./types').GridOrderSlot>>} Orders whose size is below the dust threshold.
1868
+ */
1869
+ async function _getDustOrders(manager, partials, type, thresholdMap = null) {
1870
+ if (!partials || partials.length === 0)
1871
+ return [];
1872
+ const thresholds = thresholdMap || await _computeDustThresholdMap(manager, type);
1873
+ if (thresholds.size === 0)
1874
+ return [];
1875
+ return partials.filter((p) => {
1876
+ const threshold = thresholds.get(p.id);
1877
+ if (!threshold || threshold <= 0)
1878
+ return false;
1837
1879
  return p.size < threshold;
1838
1880
  });
1839
1881
  }
@@ -2129,7 +2171,7 @@ export async function prepareSpreadCorrectionOrders(manager, preferredSide, outO
2129
2171
  return false;
2130
2172
  // Resolve candidate size: if zero/missing, use minimum so tolerance
2131
2173
  // doesn't collapse to zero (calculatePriceTolerance returns null for size <= 0).
2132
- const cs = (c.size && c.size > 0) ? c.size : getMinAbsoluteOrderSize(railType, manager.assets);
2174
+ const cs = (c.size && c.size > 0) ? c.size : getMinOrderSize(railType, manager.assets);
2133
2175
  return !findPriceCollision(allOrders, c.id, c.price, cs, railType, manager.assets, (o) => isOrderPlaced(o) && o.price != null);
2134
2176
  });
2135
2177
  const filteredCount = preFilter - spreadCandidates.length;
@@ -2163,7 +2205,7 @@ export async function prepareSpreadCorrectionOrders(manager, preferredSide, outO
2163
2205
  idealById.set(slot.id, Number(idealSizes[idx] || 0));
2164
2206
  });
2165
2207
  const availableFund = Math.max(0, Math.min(Number(manager.funds?.available?.[sideName] || 0), Number(sideName === 'buy' ? manager.accountTotals?.buyFree : manager.accountTotals?.sellFree) || 0));
2166
- const minAbsoluteSize = getMinAbsoluteOrderSize(railType, manager.assets);
2208
+ const minAbsoluteSize = getMinOrderSize(railType, manager.assets);
2167
2209
  const prioritizedTargets = [];
2168
2210
  if (edgePartial && edgePartial.id) {
2169
2211
  const ideal = Number(idealById.get(edgePartial.id) || 0);