dexbot 1.4.11 → 1.4.12

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 (497) hide show
  1. package/README.md +4 -4
  2. package/dist/analysis/chart_utils.d.ts.map +1 -1
  3. package/dist/analysis/chart_utils.js +9 -18
  4. package/dist/analysis/chart_utils.js.map +1 -1
  5. package/dist/analysis/math_utils.d.ts.map +1 -1
  6. package/dist/analysis/math_utils.js +6 -16
  7. package/dist/analysis/math_utils.js.map +1 -1
  8. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +1 -1
  9. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
  10. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +31 -38
  11. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
  12. package/dist/analysis/trend_detection/hurst_analyzer.js +7 -10
  13. package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -1
  14. package/dist/analysis/trend_detection/kalman_trend_analyzer.js +10 -14
  15. package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -1
  16. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +10 -15
  17. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -1
  18. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +7 -10
  19. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -1
  20. package/dist/bot.d.ts.map +1 -1
  21. package/dist/bot.js +4 -12
  22. package/dist/bot.js.map +1 -1
  23. package/dist/credential-daemon.d.ts +0 -1
  24. package/dist/credential-daemon.d.ts.map +1 -1
  25. package/dist/credential-daemon.js +3 -123
  26. package/dist/credential-daemon.js.map +1 -1
  27. package/dist/dexbot.d.ts +0 -87
  28. package/dist/dexbot.d.ts.map +1 -1
  29. package/dist/dexbot.js +11 -14
  30. package/dist/dexbot.js.map +1 -1
  31. package/dist/market_adapter/ama_signal_runner.js +8 -9
  32. package/dist/market_adapter/ama_signal_runner.js.map +1 -1
  33. package/dist/market_adapter/candle_utils.js +1 -7
  34. package/dist/market_adapter/candle_utils.js.map +1 -1
  35. package/dist/market_adapter/core/asymmetric_bounds.js +1 -4
  36. package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
  37. package/dist/market_adapter/core/config_normalizers.js +5 -9
  38. package/dist/market_adapter/core/config_normalizers.js.map +1 -1
  39. package/dist/market_adapter/core/kibana_candles.js +8 -15
  40. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  41. package/dist/market_adapter/core/kibana_client.js +7 -13
  42. package/dist/market_adapter/core/kibana_client.js.map +1 -1
  43. package/dist/market_adapter/core/kibana_market_candles.js +6 -12
  44. package/dist/market_adapter/core/kibana_market_candles.js.map +1 -1
  45. package/dist/market_adapter/core/market_adapter_service.js +92 -102
  46. package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
  47. package/dist/market_adapter/core/strategies/ama.js +5 -10
  48. package/dist/market_adapter/core/strategies/ama.js.map +1 -1
  49. package/dist/market_adapter/core/strategies/ama_slope_model.js +21 -24
  50. package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -1
  51. package/dist/market_adapter/core/strategies/atr/calculator.js +3 -5
  52. package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -1
  53. package/dist/market_adapter/core/strategies/collateral_manager.js +4 -6
  54. package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -1
  55. package/dist/market_adapter/core/strategies/regime_gate.js +15 -22
  56. package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -1
  57. package/dist/market_adapter/index.d.ts +23 -23
  58. package/dist/market_adapter/index.d.ts.map +1 -1
  59. package/dist/market_adapter/index.js +24 -82
  60. package/dist/market_adapter/index.js.map +1 -1
  61. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +2 -1
  62. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
  63. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  64. package/dist/market_adapter/inputs/fetch_lp_data.js +59 -98
  65. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  66. package/dist/market_adapter/inputs/kibana_source.js +11 -17
  67. package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
  68. package/dist/market_adapter/interval_utils.js +1 -2
  69. package/dist/market_adapter/interval_utils.js.map +1 -1
  70. package/dist/market_adapter/log_format.js +1 -7
  71. package/dist/market_adapter/log_format.js.map +1 -1
  72. package/dist/market_adapter/lp_chart_core.js +20 -22
  73. package/dist/market_adapter/lp_chart_core.js.map +1 -1
  74. package/dist/market_adapter/lp_chart_runner.d.ts +1 -1
  75. package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -1
  76. package/dist/market_adapter/lp_chart_runner.js +41 -57
  77. package/dist/market_adapter/lp_chart_runner.js.map +1 -1
  78. package/dist/market_adapter/lp_chart_strategy_loader.js +30 -34
  79. package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -1
  80. package/dist/market_adapter/market_adapter.d.ts +2 -2
  81. package/dist/market_adapter/market_adapter.d.ts.map +1 -1
  82. package/dist/market_adapter/market_adapter.js +157 -221
  83. package/dist/market_adapter/market_adapter.js.map +1 -1
  84. package/dist/market_adapter/merge_lp_data.js +17 -18
  85. package/dist/market_adapter/merge_lp_data.js.map +1 -1
  86. package/dist/market_adapter/test_helpers.js +3 -14
  87. package/dist/market_adapter/test_helpers.js.map +1 -1
  88. package/dist/market_adapter/utils/adapter_client.js +7 -16
  89. package/dist/market_adapter/utils/adapter_client.js.map +1 -1
  90. package/dist/market_adapter/utils/atomic_write.js +3 -5
  91. package/dist/market_adapter/utils/atomic_write.js.map +1 -1
  92. package/dist/market_adapter/utils/chain.d.ts.map +1 -1
  93. package/dist/market_adapter/utils/chain.js +9 -17
  94. package/dist/market_adapter/utils/chain.js.map +1 -1
  95. package/dist/market_adapter/utils/data_discovery.js +8 -10
  96. package/dist/market_adapter/utils/data_discovery.js.map +1 -1
  97. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -1
  98. package/dist/market_adapter/utils/dynamic_grid_snapshot.js +11 -14
  99. package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -1
  100. package/dist/market_adapter/utils/file_lock.js +14 -19
  101. package/dist/market_adapter/utils/file_lock.js.map +1 -1
  102. package/dist/market_adapter/utils/native_history.js +8 -14
  103. package/dist/market_adapter/utils/native_history.js.map +1 -1
  104. package/dist/market_adapter/utils/paths.js +3 -6
  105. package/dist/market_adapter/utils/paths.js.map +1 -1
  106. package/dist/modules/account_bots.d.ts +1 -1
  107. package/dist/modules/account_bots.d.ts.map +1 -1
  108. package/dist/modules/account_bots.js +90 -97
  109. package/dist/modules/account_bots.js.map +1 -1
  110. package/dist/modules/account_orders.d.ts +0 -9
  111. package/dist/modules/account_orders.d.ts.map +1 -1
  112. package/dist/modules/account_orders.js +26 -121
  113. package/dist/modules/account_orders.js.map +1 -1
  114. package/dist/modules/authority_resolver.js +12 -18
  115. package/dist/modules/authority_resolver.js.map +1 -1
  116. package/dist/modules/bitshares-native/chain_client.js +16 -21
  117. package/dist/modules/bitshares-native/chain_client.js.map +1 -1
  118. package/dist/modules/bitshares-native/crypto/ecc.browser.js +12 -72
  119. package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -1
  120. package/dist/modules/bitshares-native/crypto/ecc.js +13 -40
  121. package/dist/modules/bitshares-native/crypto/ecc.js.map +1 -1
  122. package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts.map +1 -1
  123. package/dist/modules/bitshares-native/crypto/ecc_selector.js +5 -6
  124. package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -1
  125. package/dist/modules/bitshares-native/index.d.ts +8 -8
  126. package/dist/modules/bitshares-native/index.d.ts.map +1 -1
  127. package/dist/modules/bitshares-native/index.js +11 -68
  128. package/dist/modules/bitshares-native/index.js.map +1 -1
  129. package/dist/modules/bitshares-native/lru_cache.js +3 -6
  130. package/dist/modules/bitshares-native/lru_cache.js.map +1 -1
  131. package/dist/modules/bitshares-native/resolvers.js +9 -11
  132. package/dist/modules/bitshares-native/resolvers.js.map +1 -1
  133. package/dist/modules/bitshares-native/serial/chain_constants.js +3 -28
  134. package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -1
  135. package/dist/modules/bitshares-native/serial/index.d.ts +4 -4
  136. package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -1
  137. package/dist/modules/bitshares-native/serial/index.js +5 -46
  138. package/dist/modules/bitshares-native/serial/index.js.map +1 -1
  139. package/dist/modules/bitshares-native/serial/operations.d.ts +98 -98
  140. package/dist/modules/bitshares-native/serial/operations.d.ts.map +1 -1
  141. package/dist/modules/bitshares-native/serial/operations.js +372 -473
  142. package/dist/modules/bitshares-native/serial/operations.js.map +1 -1
  143. package/dist/modules/bitshares-native/serial/serializer.js +3 -8
  144. package/dist/modules/bitshares-native/serial/serializer.js.map +1 -1
  145. package/dist/modules/bitshares-native/serial/types.js +9 -74
  146. package/dist/modules/bitshares-native/serial/types.js.map +1 -1
  147. package/dist/modules/bitshares-native/signing_client.d.ts.map +1 -1
  148. package/dist/modules/bitshares-native/signing_client.js +11 -48
  149. package/dist/modules/bitshares-native/signing_client.js.map +1 -1
  150. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
  151. package/dist/modules/bitshares-native/subscriptions.js +24 -27
  152. package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
  153. package/dist/modules/bitshares-native/transport.d.ts.map +1 -1
  154. package/dist/modules/bitshares-native/transport.js +14 -26
  155. package/dist/modules/bitshares-native/transport.js.map +1 -1
  156. package/dist/modules/bitshares-native/tx/builder.js +29 -72
  157. package/dist/modules/bitshares-native/tx/builder.js.map +1 -1
  158. package/dist/modules/bitshares-native/tx/tx_cache.js +12 -21
  159. package/dist/modules/bitshares-native/tx/tx_cache.js.map +1 -1
  160. package/dist/modules/bitshares_client.d.ts +21 -0
  161. package/dist/modules/bitshares_client.d.ts.map +1 -1
  162. package/dist/modules/bitshares_client.js +32 -86
  163. package/dist/modules/bitshares_client.js.map +1 -1
  164. package/dist/modules/bot_settings.d.ts.map +1 -1
  165. package/dist/modules/bot_settings.js +30 -49
  166. package/dist/modules/bot_settings.js.map +1 -1
  167. package/dist/modules/bots_file_lock.d.ts.map +1 -1
  168. package/dist/modules/bots_file_lock.js +5 -13
  169. package/dist/modules/bots_file_lock.js.map +1 -1
  170. package/dist/modules/broadcast_failure.js +1 -3
  171. package/dist/modules/broadcast_failure.js.map +1 -1
  172. package/dist/modules/chain_keys.d.ts +4 -9
  173. package/dist/modules/chain_keys.d.ts.map +1 -1
  174. package/dist/modules/chain_keys.js +77 -182
  175. package/dist/modules/chain_keys.js.map +1 -1
  176. package/dist/modules/chain_orders.d.ts +2 -2
  177. package/dist/modules/chain_orders.d.ts.map +1 -1
  178. package/dist/modules/chain_orders.js +81 -144
  179. package/dist/modules/chain_orders.js.map +1 -1
  180. package/dist/modules/config.d.ts.map +1 -1
  181. package/dist/modules/config.js +23 -28
  182. package/dist/modules/config.js.map +1 -1
  183. package/dist/modules/constants.d.ts +2 -9
  184. package/dist/modules/constants.d.ts.map +1 -1
  185. package/dist/modules/constants.js +38 -73
  186. package/dist/modules/constants.js.map +1 -1
  187. package/dist/modules/cr_planner.js +15 -26
  188. package/dist/modules/cr_planner.js.map +1 -1
  189. package/dist/modules/credential_policy.d.ts +3 -6
  190. package/dist/modules/credential_policy.d.ts.map +1 -1
  191. package/dist/modules/credential_policy.js +62 -153
  192. package/dist/modules/credential_policy.js.map +1 -1
  193. package/dist/modules/credential_runtime.d.ts +1 -1
  194. package/dist/modules/credential_runtime.d.ts.map +1 -1
  195. package/dist/modules/credential_runtime.js +34 -41
  196. package/dist/modules/credential_runtime.js.map +1 -1
  197. package/dist/modules/credential_session_cache.d.ts +1 -1
  198. package/dist/modules/credential_session_cache.d.ts.map +1 -1
  199. package/dist/modules/credential_session_cache.js +5 -42
  200. package/dist/modules/credential_session_cache.js.map +1 -1
  201. package/dist/modules/credit_runtime.d.ts.map +1 -1
  202. package/dist/modules/credit_runtime.js +126 -162
  203. package/dist/modules/credit_runtime.js.map +1 -1
  204. package/dist/modules/crypto/browser_provider.d.ts +1 -1
  205. package/dist/modules/crypto/browser_provider.d.ts.map +1 -1
  206. package/dist/modules/crypto/browser_provider.js +7 -11
  207. package/dist/modules/crypto/browser_provider.js.map +1 -1
  208. package/dist/modules/crypto/index.d.ts +6 -6
  209. package/dist/modules/crypto/index.d.ts.map +1 -1
  210. package/dist/modules/crypto/index.js +12 -30
  211. package/dist/modules/crypto/index.js.map +1 -1
  212. package/dist/modules/crypto/node_provider.d.ts +1 -1
  213. package/dist/modules/crypto/node_provider.d.ts.map +1 -1
  214. package/dist/modules/crypto/node_provider.js +3 -5
  215. package/dist/modules/crypto/node_provider.js.map +1 -1
  216. package/dist/modules/crypto/provider.js +1 -2
  217. package/dist/modules/crypto/pure_ripemd160.js +1 -3
  218. package/dist/modules/crypto/pure_ripemd160.js.map +1 -1
  219. package/dist/modules/crypto/pure_scrypt.js +1 -4
  220. package/dist/modules/crypto/pure_scrypt.js.map +1 -1
  221. package/dist/modules/crypto/pure_secp256k1.d.ts +1 -1
  222. package/dist/modules/crypto/pure_secp256k1.d.ts.map +1 -1
  223. package/dist/modules/crypto/pure_secp256k1.js +1 -16
  224. package/dist/modules/crypto/pure_secp256k1.js.map +1 -1
  225. package/dist/modules/crypto/sync.d.ts.map +1 -1
  226. package/dist/modules/crypto/sync.js +16 -17
  227. package/dist/modules/crypto/sync.js.map +1 -1
  228. package/dist/modules/daemon_node_health.js +14 -16
  229. package/dist/modules/daemon_node_health.js.map +1 -1
  230. package/dist/modules/dexbot_class.d.ts +19 -14
  231. package/dist/modules/dexbot_class.d.ts.map +1 -1
  232. package/dist/modules/dexbot_class.js +127 -164
  233. package/dist/modules/dexbot_class.js.map +1 -1
  234. package/dist/modules/dexbot_cow_runtime.d.ts +28 -27
  235. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  236. package/dist/modules/dexbot_cow_runtime.js +55 -45
  237. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  238. package/dist/modules/dexbot_credential_client.d.ts +6 -2
  239. package/dist/modules/dexbot_credential_client.d.ts.map +1 -1
  240. package/dist/modules/dexbot_credential_client.js +21 -31
  241. package/dist/modules/dexbot_credential_client.js.map +1 -1
  242. package/dist/modules/dexbot_fill_runtime.d.ts +23 -23
  243. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  244. package/dist/modules/dexbot_fill_runtime.js +119 -77
  245. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  246. package/dist/modules/dexbot_maintenance_runtime.d.ts +46 -38
  247. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  248. package/dist/modules/dexbot_maintenance_runtime.js +81 -81
  249. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  250. package/dist/modules/dexbot_startup_runtime.d.ts +3 -3
  251. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  252. package/dist/modules/dexbot_startup_runtime.js +43 -81
  253. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  254. package/dist/modules/dexbot_state_recovery.d.ts +11 -11
  255. package/dist/modules/dexbot_state_recovery.js +32 -78
  256. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  257. package/dist/modules/env.js +3 -7
  258. package/dist/modules/env.js.map +1 -1
  259. package/dist/modules/fund_registry.d.ts.map +1 -1
  260. package/dist/modules/fund_registry.js +12 -24
  261. package/dist/modules/fund_registry.js.map +1 -1
  262. package/dist/modules/general_settings.js +10 -16
  263. package/dist/modules/general_settings.js.map +1 -1
  264. package/dist/modules/graceful_shutdown.d.ts.map +1 -1
  265. package/dist/modules/graceful_shutdown.js +12 -19
  266. package/dist/modules/graceful_shutdown.js.map +1 -1
  267. package/dist/modules/key_store.d.ts.map +1 -1
  268. package/dist/modules/key_store.js +27 -65
  269. package/dist/modules/key_store.js.map +1 -1
  270. package/dist/modules/launcher/bot_supervisor.d.ts +1 -1
  271. package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
  272. package/dist/modules/launcher/bot_supervisor.js +89 -118
  273. package/dist/modules/launcher/bot_supervisor.js.map +1 -1
  274. package/dist/modules/launcher/child_env.js +1 -5
  275. package/dist/modules/launcher/child_env.js.map +1 -1
  276. package/dist/modules/launcher/credential_bootstrap.js +22 -31
  277. package/dist/modules/launcher/credential_bootstrap.js.map +1 -1
  278. package/dist/modules/launcher/credential_daemon.js +37 -75
  279. package/dist/modules/launcher/credential_daemon.js.map +1 -1
  280. package/dist/modules/launcher/credential_secret.js +2 -37
  281. package/dist/modules/launcher/credential_secret.js.map +1 -1
  282. package/dist/modules/launcher/foreign_cred_daemon.js +25 -31
  283. package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -1
  284. package/dist/modules/launcher/headless_password.js +10 -12
  285. package/dist/modules/launcher/headless_password.js.map +1 -1
  286. package/dist/modules/launcher/launch_modes.js +3 -9
  287. package/dist/modules/launcher/launch_modes.js.map +1 -1
  288. package/dist/modules/launcher/market_adapter_runtime.d.ts +1 -1
  289. package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -1
  290. package/dist/modules/launcher/market_adapter_runtime.js +25 -35
  291. package/dist/modules/launcher/market_adapter_runtime.js.map +1 -1
  292. package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -1
  293. package/dist/modules/launcher/market_adapter_watchdog.js +42 -45
  294. package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -1
  295. package/dist/modules/launcher/monolithic_runtime.d.ts +1 -1
  296. package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
  297. package/dist/modules/launcher/monolithic_runtime.js +67 -138
  298. package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
  299. package/dist/modules/launcher/runtime_entry.d.ts +1 -11
  300. package/dist/modules/launcher/runtime_entry.d.ts.map +1 -1
  301. package/dist/modules/launcher/runtime_entry.js +12 -15
  302. package/dist/modules/launcher/runtime_entry.js.map +1 -1
  303. package/dist/modules/launcher/status_reporting.d.ts +1 -1
  304. package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
  305. package/dist/modules/launcher/status_reporting.js +15 -36
  306. package/dist/modules/launcher/status_reporting.js.map +1 -1
  307. package/dist/modules/launcher/supervisor_control.js +4 -9
  308. package/dist/modules/launcher/supervisor_control.js.map +1 -1
  309. package/dist/modules/logger.d.ts +1 -1
  310. package/dist/modules/logger.d.ts.map +1 -1
  311. package/dist/modules/logger.js +3 -38
  312. package/dist/modules/logger.js.map +1 -1
  313. package/dist/modules/market_adapter_whitelist.js +9 -18
  314. package/dist/modules/market_adapter_whitelist.js.map +1 -1
  315. package/dist/modules/node_failure_ledger.js +1 -3
  316. package/dist/modules/node_failure_ledger.js.map +1 -1
  317. package/dist/modules/node_health_cache.d.ts.map +1 -1
  318. package/dist/modules/node_health_cache.js +15 -25
  319. package/dist/modules/node_health_cache.js.map +1 -1
  320. package/dist/modules/node_manager.d.ts +1 -1
  321. package/dist/modules/node_manager.d.ts.map +1 -1
  322. package/dist/modules/node_manager.js +44 -43
  323. package/dist/modules/node_manager.js.map +1 -1
  324. package/dist/modules/order/accounting.d.ts.map +1 -1
  325. package/dist/modules/order/accounting.js +102 -118
  326. package/dist/modules/order/accounting.js.map +1 -1
  327. package/dist/modules/order/async_lock.d.ts +3 -15
  328. package/dist/modules/order/async_lock.d.ts.map +1 -1
  329. package/dist/modules/order/async_lock.js +6 -26
  330. package/dist/modules/order/async_lock.js.map +1 -1
  331. package/dist/modules/order/export.js +34 -75
  332. package/dist/modules/order/export.js.map +1 -1
  333. package/dist/modules/order/format.d.ts +1 -3
  334. package/dist/modules/order/format.d.ts.map +1 -1
  335. package/dist/modules/order/format.js +4 -24
  336. package/dist/modules/order/format.js.map +1 -1
  337. package/dist/modules/order/grid.d.ts +3 -3
  338. package/dist/modules/order/grid.d.ts.map +1 -1
  339. package/dist/modules/order/grid.js +206 -262
  340. package/dist/modules/order/grid.js.map +1 -1
  341. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  342. package/dist/modules/order/grid_reconcile.js +77 -94
  343. package/dist/modules/order/grid_reconcile.js.map +1 -1
  344. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  345. package/dist/modules/order/grid_reconcile_internal.js +117 -149
  346. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  347. package/dist/modules/order/index.d.ts.map +1 -1
  348. package/dist/modules/order/index.js +11 -45
  349. package/dist/modules/order/index.js.map +1 -1
  350. package/dist/modules/order/logger.js +28 -69
  351. package/dist/modules/order/logger.js.map +1 -1
  352. package/dist/modules/order/logger_state.d.ts.map +1 -1
  353. package/dist/modules/order/logger_state.js +3 -4
  354. package/dist/modules/order/logger_state.js.map +1 -1
  355. package/dist/modules/order/manager.d.ts +10 -0
  356. package/dist/modules/order/manager.d.ts.map +1 -1
  357. package/dist/modules/order/manager.js +131 -151
  358. package/dist/modules/order/manager.js.map +1 -1
  359. package/dist/modules/order/processed_fill_store.js +2 -7
  360. package/dist/modules/order/processed_fill_store.js.map +1 -1
  361. package/dist/modules/order/strategy.js +23 -25
  362. package/dist/modules/order/strategy.js.map +1 -1
  363. package/dist/modules/order/sync_engine.d.ts +27 -0
  364. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  365. package/dist/modules/order/sync_engine.js +232 -181
  366. package/dist/modules/order/sync_engine.js.map +1 -1
  367. package/dist/modules/order/utils/math.d.ts +1 -25
  368. package/dist/modules/order/utils/math.d.ts.map +1 -1
  369. package/dist/modules/order/utils/math.js +49 -172
  370. package/dist/modules/order/utils/math.js.map +1 -1
  371. package/dist/modules/order/utils/order.d.ts +46 -2
  372. package/dist/modules/order/utils/order.d.ts.map +1 -1
  373. package/dist/modules/order/utils/order.js +165 -143
  374. package/dist/modules/order/utils/order.js.map +1 -1
  375. package/dist/modules/order/utils/system.d.ts +3 -1
  376. package/dist/modules/order/utils/system.d.ts.map +1 -1
  377. package/dist/modules/order/utils/system.js +152 -211
  378. package/dist/modules/order/utils/system.js.map +1 -1
  379. package/dist/modules/order/utils/timeout.js +1 -4
  380. package/dist/modules/order/utils/timeout.js.map +1 -1
  381. package/dist/modules/order/utils/validate.js +91 -142
  382. package/dist/modules/order/utils/validate.js.map +1 -1
  383. package/dist/modules/order/utils/withPoolRef.js +21 -61
  384. package/dist/modules/order/utils/withPoolRef.js.map +1 -1
  385. package/dist/modules/order/working_grid.js +6 -9
  386. package/dist/modules/order/working_grid.js.map +1 -1
  387. package/dist/modules/path_api.d.ts.map +1 -1
  388. package/dist/modules/path_api.js +8 -11
  389. package/dist/modules/path_api.js.map +1 -1
  390. package/dist/modules/paths.d.ts.map +1 -1
  391. package/dist/modules/paths.js +61 -67
  392. package/dist/modules/paths.js.map +1 -1
  393. package/dist/modules/process_discovery.js +13 -21
  394. package/dist/modules/process_discovery.js.map +1 -1
  395. package/dist/modules/runtime.js +7 -11
  396. package/dist/modules/runtime.js.map +1 -1
  397. package/dist/modules/runtime_settings.d.ts.map +1 -1
  398. package/dist/modules/runtime_settings.js +14 -16
  399. package/dist/modules/runtime_settings.js.map +1 -1
  400. package/dist/modules/settings_merge.js +1 -3
  401. package/dist/modules/settings_merge.js.map +1 -1
  402. package/dist/modules/socket_json_client.js +3 -5
  403. package/dist/modules/socket_json_client.js.map +1 -1
  404. package/dist/modules/storage/browser_adapter.js +1 -4
  405. package/dist/modules/storage/browser_adapter.js.map +1 -1
  406. package/dist/modules/storage/index.d.ts +3 -2
  407. package/dist/modules/storage/index.d.ts.map +1 -1
  408. package/dist/modules/storage/index.js +5 -8
  409. package/dist/modules/storage/index.js.map +1 -1
  410. package/dist/modules/storage/node_adapter.d.ts +3 -4
  411. package/dist/modules/storage/node_adapter.d.ts.map +1 -1
  412. package/dist/modules/storage/node_adapter.js +12 -16
  413. package/dist/modules/storage/node_adapter.js.map +1 -1
  414. package/dist/modules/storage/types.js +1 -2
  415. package/dist/modules/types.d.ts +0 -6
  416. package/dist/modules/types.d.ts.map +1 -1
  417. package/dist/modules/types.js +1 -2
  418. package/dist/modules/types.js.map +1 -1
  419. package/dist/modules/utils/base58check.js +8 -15
  420. package/dist/modules/utils/base58check.js.map +1 -1
  421. package/dist/modules/utils/build_dir.js +3 -7
  422. package/dist/modules/utils/build_dir.js.map +1 -1
  423. package/dist/modules/utils/errors.js +1 -5
  424. package/dist/modules/utils/errors.js.map +1 -1
  425. package/dist/modules/utils/math_utils.d.ts +1 -1
  426. package/dist/modules/utils/math_utils.d.ts.map +1 -1
  427. package/dist/modules/utils/math_utils.js +2 -7
  428. package/dist/modules/utils/math_utils.js.map +1 -1
  429. package/dist/modules/validate_profiles.d.ts.map +1 -1
  430. package/dist/modules/validate_profiles.js +18 -25
  431. package/dist/modules/validate_profiles.js.map +1 -1
  432. package/dist/pm2.d.ts +4 -70
  433. package/dist/pm2.d.ts.map +1 -1
  434. package/dist/pm2.js +106 -132
  435. package/dist/pm2.js.map +1 -1
  436. package/dist/scripts/analyze-git.js +13 -17
  437. package/dist/scripts/analyze-git.js.map +1 -1
  438. package/dist/scripts/analyze-orders.d.ts.map +1 -1
  439. package/dist/scripts/analyze-orders.js +48 -63
  440. package/dist/scripts/analyze-orders.js.map +1 -1
  441. package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -1
  442. package/dist/scripts/diagnose-kibana-candles.js +2 -1
  443. package/dist/scripts/diagnose-kibana-candles.js.map +1 -1
  444. package/dist/scripts/diagnose-pool-history.d.ts.map +1 -1
  445. package/dist/scripts/diagnose-pool-history.js +2 -1
  446. package/dist/scripts/diagnose-pool-history.js.map +1 -1
  447. package/dist/scripts/divergence-calc.d.ts.map +1 -1
  448. package/dist/scripts/divergence-calc.js +2 -2
  449. package/dist/scripts/divergence-calc.js.map +1 -1
  450. package/dist/scripts/fix-err-message.js +17 -22
  451. package/dist/scripts/fix-err-message.js.map +1 -1
  452. package/dist/scripts/generate_lp_chart.d.ts.map +1 -1
  453. package/dist/scripts/generate_lp_chart.js +7 -15
  454. package/dist/scripts/generate_lp_chart.js.map +1 -1
  455. package/dist/scripts/generate_mainnet_corpus_report.d.ts.map +1 -1
  456. package/dist/scripts/generate_mainnet_corpus_report.js +3 -2
  457. package/dist/scripts/generate_mainnet_corpus_report.js.map +1 -1
  458. package/dist/scripts/generate_market_adapter_whitelist.d.ts.map +1 -1
  459. package/dist/scripts/generate_market_adapter_whitelist.js +18 -24
  460. package/dist/scripts/generate_market_adapter_whitelist.js.map +1 -1
  461. package/dist/scripts/native_release_gates.js +15 -19
  462. package/dist/scripts/native_release_gates.js.map +1 -1
  463. package/dist/scripts/print_grid.d.ts.map +1 -1
  464. package/dist/scripts/print_grid.js +2 -2
  465. package/dist/scripts/print_grid.js.map +1 -1
  466. package/dist/scripts/run-tests.js +12 -17
  467. package/dist/scripts/run-tests.js.map +1 -1
  468. package/dist/scripts/runner.d.ts.map +1 -1
  469. package/dist/scripts/runner.js +18 -20
  470. package/dist/scripts/runner.js.map +1 -1
  471. package/dist/scripts/sync-version.js +2 -2
  472. package/dist/scripts/sync-version.js.map +1 -1
  473. package/dist/scripts/test-credit-renewal.d.ts.map +1 -1
  474. package/dist/scripts/test-credit-renewal.js +4 -3
  475. package/dist/scripts/test-credit-renewal.js.map +1 -1
  476. package/dist/scripts/update.js +77 -89
  477. package/dist/scripts/update.js.map +1 -1
  478. package/dist/scripts/validate_bots.d.ts.map +1 -1
  479. package/dist/scripts/validate_bots.js +2 -2
  480. package/dist/scripts/validate_bots.js.map +1 -1
  481. package/dist/scripts/verify-browser-bundle.js +12 -17
  482. package/dist/scripts/verify-browser-bundle.js.map +1 -1
  483. package/dist/unlock.d.ts +0 -30
  484. package/dist/unlock.d.ts.map +1 -1
  485. package/dist/unlock.js +95 -143
  486. package/dist/unlock.js.map +1 -1
  487. package/package.json +5 -8
  488. package/scripts/README.md +1 -1
  489. package/scripts/create-bot-symlinks.sh +2 -2
  490. package/dist/modules/utils/fs_utils.d.ts +0 -18
  491. package/dist/modules/utils/fs_utils.d.ts.map +0 -1
  492. package/dist/modules/utils/fs_utils.js +0 -32
  493. package/dist/modules/utils/fs_utils.js.map +0 -1
  494. package/dist/scripts/migrate_bot_keys.d.ts +0 -3
  495. package/dist/scripts/migrate_bot_keys.d.ts.map +0 -1
  496. package/dist/scripts/migrate_bot_keys.js +0 -225
  497. package/dist/scripts/migrate_bot_keys.js.map +0 -1
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * modules/order/grid.ts - Grid Engine
4
3
  *
@@ -94,67 +93,12 @@
94
93
  *
95
94
  * ===============================================================================
96
95
  */
97
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
98
- if (k2 === undefined) k2 = k;
99
- var desc = Object.getOwnPropertyDescriptor(m, k);
100
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
101
- desc = { enumerable: true, get: function() { return m[k]; } };
102
- }
103
- Object.defineProperty(o, k2, desc);
104
- }) : (function(o, m, k, k2) {
105
- if (k2 === undefined) k2 = k;
106
- o[k2] = m[k];
107
- }));
108
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
109
- Object.defineProperty(o, "default", { enumerable: true, value: v });
110
- }) : function(o, v) {
111
- o["default"] = v;
112
- });
113
- var __importStar = (this && this.__importStar) || (function () {
114
- var ownKeys = function(o) {
115
- ownKeys = Object.getOwnPropertyNames || function (o) {
116
- var ar = [];
117
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
118
- return ar;
119
- };
120
- return ownKeys(o);
121
- };
122
- return function (mod) {
123
- if (mod && mod.__esModule) return mod;
124
- var result = {};
125
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
126
- __setModuleDefault(result, mod);
127
- return result;
128
- };
129
- })();
130
- Object.defineProperty(exports, "__esModule", { value: true });
131
- exports.calculateGapSlots = calculateGapSlots;
132
- exports.isGridBloated = isGridBloated;
133
- exports.isGridBloatGraceActive = isGridBloatGraceActive;
134
- exports.clearGridBloatFlag = clearGridBloatFlag;
135
- exports.getSizingContext = getSizingContext;
136
- exports._getSizingContext = _getSizingContext;
137
- exports.createOrderGrid = createOrderGrid;
138
- exports.loadGrid = loadGrid;
139
- exports.initializeGrid = initializeGrid;
140
- exports.recalculateGrid = recalculateGrid;
141
- exports.checkAndUpdateGridIfNeeded = checkAndUpdateGridIfNeeded;
142
- exports._recalculateGridOrderSizesFromBlockchain = _recalculateGridOrderSizesFromBlockchain;
143
- exports.updateGridFromBlockchainSnapshot = updateGridFromBlockchainSnapshot;
144
- exports.compareGrids = compareGrids;
145
- exports.monitorDivergence = monitorDivergence;
146
- exports.calculateCurrentSpread = calculateCurrentSpread;
147
- exports.checkSpreadCondition = checkSpreadCondition;
148
- exports.checkGridHealth = checkGridHealth;
149
- exports.checkWindowDust = checkWindowDust;
150
- exports.hasAnyDust = hasAnyDust;
151
- exports.getDustOrders = getDustOrders;
152
- exports.determineOrderSideByFunds = determineOrderSideByFunds;
153
- exports.prepareSpreadCorrectionOrders = prepareSpreadCorrectionOrders;
154
- const constants_1 = require("../constants");
155
- const { GRID_COMPARISON } = constants_1.GRID_LIMITS;
156
- const Format = __importStar(require("./format"));
157
- const asymmetric_bounds_1 = require("../../market_adapter/core/asymmetric_bounds");
96
+ import { createRequire } from 'node:module';
97
+ const require = createRequire(import.meta.url);
98
+ import { ORDER_TYPES, ORDER_STATES, COW_ACTIONS, DEFAULT_CONFIG, GRID_LIMITS, TIMING, PIPELINE_TIMING, MARKET_ADAPTER, INCREMENT_BOUNDS } from '../constants.js';
99
+ const { GRID_COMPARISON } = GRID_LIMITS;
100
+ import * as Format from './format.js';
101
+ import { resolveMaxAsymmetryFactor, applyAsymmetricBounds, } from '../../market_adapter/core/asymmetric_bounds.js';
158
102
  // FIX: Extract magic numbers to named constants for maintainability
159
103
  const GRID_CONSTANTS = {
160
104
  RMS_PERCENTAGE_SCALE: 100, // Convert RMS percentage threshold from percent to decimal
@@ -167,16 +111,16 @@ function _snapshotFundState(manager) {
167
111
  sellLocked: Number(manager.accountTotals?.sellLocked || 0),
168
112
  };
169
113
  }
170
- const math_1 = require("./utils/math");
171
- const order_1 = require("./utils/order");
172
- const system_1 = require("./utils/system");
173
- const withPoolRef_1 = require("./utils/withPoolRef");
174
- const market_adapter_whitelist_1 = require("../market_adapter_whitelist");
175
- const errors_1 = require("../utils/errors");
176
- function calculateGapSlots(incrementPercent, targetSpreadPercent, gridLimitsOverride) {
177
- return (0, math_1.calculateGapSlots)(incrementPercent, targetSpreadPercent, gridLimitsOverride ?? constants_1.GRID_LIMITS);
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';
115
+ import { filterOrdersByType, checkSizesBeforeMinimum, checkSizeThreshold, resolveConfiguredPriceBound, shouldFlagOutOfSpread, isOrderHealthy, isPhantomOrder, isSlotAvailable, isOrderOnChain, isOrderPlaced, hasOnChainId, isEmptyGridSlot, parseSlotIndex, calculateIdealBoundary, assignGridRoles, resolveOnChainRetypeType } from './utils/order.js';
116
+ import { loadAmaCenterPrice, loadAmaCenterSnapshot, withBlockchainRetry } from './utils/system.js';
117
+ import { derivePriceWithPoolRef } from './utils/withPoolRef.js';
118
+ import { getWhitelistFlags } from '../market_adapter_whitelist.js';
119
+ import { getErrorMessage } from '../utils/errors.js';
120
+ export function calculateGapSlots(incrementPercent, targetSpreadPercent, gridLimitsOverride) {
121
+ return _mathGapSlots(incrementPercent, targetSpreadPercent, gridLimitsOverride ?? GRID_LIMITS);
178
122
  }
179
- function isGridBloated(manager, orders) {
123
+ export function isGridBloated(manager, orders) {
180
124
  const gridSize = Array.isArray(orders) ? orders.length : orders.size;
181
125
  if (!gridSize || !manager?.config)
182
126
  return { bloated: false };
@@ -186,11 +130,11 @@ function isGridBloated(manager, orders) {
186
130
  return { bloated: false };
187
131
  const targetSpreadPct = config.targetSpreadPercent || incPct * 2;
188
132
  const orderList = Array.isArray(orders) ? orders : Array.from(orders.values());
189
- const numBuyActive = orderList.filter((o) => o.type === constants_1.ORDER_TYPES.BUY &&
190
- (o.state === constants_1.ORDER_STATES.ACTIVE || o.state === constants_1.ORDER_STATES.PARTIAL) &&
133
+ const numBuyActive = orderList.filter((o) => o.type === ORDER_TYPES.BUY &&
134
+ (o.state === ORDER_STATES.ACTIVE || o.state === ORDER_STATES.PARTIAL) &&
191
135
  o.orderId).length;
192
- const numSellActive = orderList.filter((o) => o.type === constants_1.ORDER_TYPES.SELL &&
193
- (o.state === constants_1.ORDER_STATES.ACTIVE || o.state === constants_1.ORDER_STATES.PARTIAL) &&
136
+ const numSellActive = orderList.filter((o) => o.type === ORDER_TYPES.SELL &&
137
+ (o.state === ORDER_STATES.ACTIVE || o.state === ORDER_STATES.PARTIAL) &&
194
138
  o.orderId).length;
195
139
  const placedCount = numBuyActive + numSellActive;
196
140
  if (!placedCount)
@@ -221,7 +165,7 @@ function isGridBloated(manager, orders) {
221
165
  }
222
166
  }
223
167
  const railEstimate = Math.max(expectedTotal, placedCount);
224
- const buffer = (config.gridLimits?.MIN_SPREAD_ORDERS ?? constants_1.GRID_LIMITS.MIN_SPREAD_ORDERS);
168
+ const buffer = (config.gridLimits?.MIN_SPREAD_ORDERS ?? GRID_LIMITS.MIN_SPREAD_ORDERS);
225
169
  const maxAllowed = railEstimate + gapSlots + buffer;
226
170
  return {
227
171
  bloated: gridSize > maxAllowed,
@@ -241,8 +185,8 @@ function isGridBloated(manager, orders) {
241
185
  * @param {Object} manager - OrderManager instance.
242
186
  * @returns {{active: boolean, elapsed: number, graceMs: number}}
243
187
  */
244
- function isGridBloatGraceActive(manager) {
245
- const graceMs = Number(constants_1.TIMING?.GRID_BLOAT_RESYNC_GRACE_MS) || constants_1.TIMING.GRID_BLOAT_RESYNC_GRACE_MS;
188
+ export function isGridBloatGraceActive(manager) {
189
+ const graceMs = Number(TIMING?.GRID_BLOAT_RESYNC_GRACE_MS) || TIMING.GRID_BLOAT_RESYNC_GRACE_MS;
246
190
  if (!manager._gridBloatDetectedAt) {
247
191
  return { active: false, elapsed: 0, graceMs };
248
192
  }
@@ -254,7 +198,7 @@ function isGridBloatGraceActive(manager) {
254
198
  * returned to normal. Shared so both call sites use the same key.
255
199
  * @param {Object} manager - OrderManager instance.
256
200
  */
257
- function clearGridBloatFlag(manager) {
201
+ export function clearGridBloatFlag(manager) {
258
202
  delete manager._gridBloatDetectedAt;
259
203
  }
260
204
  /**
@@ -265,7 +209,7 @@ function clearGridBloatFlag(manager) {
265
209
  * @param {'buy'|'sell'} side
266
210
  * @returns {Promise<import('./types').SizingContext|null>}
267
211
  */
268
- async function getSizingContext(manager, side) {
212
+ export async function getSizingContext(manager, side) {
269
213
  return await _getSizingContext(manager, side);
270
214
  }
271
215
  /**
@@ -277,7 +221,7 @@ async function getSizingContext(manager, side) {
277
221
  * @returns {Promise<import('./types').SizingContext|null>}
278
222
  * @private
279
223
  */
280
- async function _getSizingContext(manager, side, { skipRecalc = false } = {}) {
224
+ export async function _getSizingContext(manager, side, { skipRecalc = false } = {}) {
281
225
  if (!manager || !manager.assets)
282
226
  return null;
283
227
  // 1. Ensure fund state is fresh before sizing
@@ -286,7 +230,7 @@ async function _getSizingContext(manager, side, { skipRecalc = false } = {}) {
286
230
  }
287
231
  const snap = manager.getChainFundsSnapshot ? manager.getChainFundsSnapshot() : {};
288
232
  const isBuy = side === 'buy';
289
- const type = isBuy ? constants_1.ORDER_TYPES.BUY : constants_1.ORDER_TYPES.SELL;
233
+ const type = isBuy ? ORDER_TYPES.BUY : ORDER_TYPES.SELL;
290
234
  // 2. Determine base budget: Always use ALLOCATED funds (respects botFunds %)
291
235
  // This ensures the bot only "thinks" about the capital it is allowed to use.
292
236
  let budget = isBuy ? (snap.allocatedBuy || 0) : (snap.allocatedSell || 0);
@@ -297,15 +241,15 @@ async function _getSizingContext(manager, side, { skipRecalc = false } = {}) {
297
241
  const targetBuy = Math.max(0, manager.config.activeOrders?.buy ?? 1);
298
242
  const targetSell = Math.max(0, manager.config.activeOrders?.sell ?? 1);
299
243
  const totalTarget = targetBuy + targetSell;
300
- const btsOrderType = (0, math_1.getBtsSide)(manager.config?.assetA, manager.config?.assetB);
301
- const isBtsSide = isBuy ? (btsOrderType === constants_1.ORDER_TYPES.BUY) : (btsOrderType === constants_1.ORDER_TYPES.SELL);
302
- const formulaBudget = (0, math_1.calculateOrderCreationFees)(manager.config.assetA, manager.config.assetB, totalTarget, manager.config?.feeParams?.BTS_RESERVATION_MULTIPLIER);
303
- budget = (0, math_1.adjustBudgetForBtsFees)(budget, isBtsSide, formulaBudget, manager.config.min_BTS_value || 0, Format.toFiniteNumber(manager.funds?.btsBalance?.free, 0), Format.toFiniteNumber(isBuy ? (snap.allocatedBuy || 0) : (snap.allocatedSell || 0)), Format.toFiniteNumber(snap.allocatedBuy || 0)
244
+ const btsOrderType = getBtsSide(manager.config?.assetA, manager.config?.assetB);
245
+ const isBtsSide = isBuy ? (btsOrderType === ORDER_TYPES.BUY) : (btsOrderType === ORDER_TYPES.SELL);
246
+ const formulaBudget = calculateOrderCreationFees(manager.config.assetA, manager.config.assetB, totalTarget, manager.config?.feeParams?.BTS_RESERVATION_MULTIPLIER);
247
+ budget = adjustBudgetForBtsFees(budget, isBtsSide, formulaBudget, manager.config.min_BTS_value || 0, Format.toFiniteNumber(manager.funds?.btsBalance?.free, 0), Format.toFiniteNumber(isBuy ? (snap.allocatedBuy || 0) : (snap.allocatedSell || 0)), Format.toFiniteNumber(snap.allocatedBuy || 0)
304
248
  + Format.toFiniteNumber(snap.allocatedSell || 0));
305
249
  }
306
250
  return {
307
251
  budget,
308
- precision: (0, math_1.getPrecisionByOrderType)(manager.assets, type),
252
+ precision: getPrecisionByOrderType(manager.assets, type),
309
253
  config: manager.config
310
254
  };
311
255
  }
@@ -358,7 +302,7 @@ async function _getSizingContext(manager, side, { skipRecalc = false } = {}) {
358
302
  * @param {import('./types').GridConfig} config - Grid configuration
359
303
  * @returns {import('./types').GridCreationResult}
360
304
  */
361
- function createOrderGrid(config) {
305
+ export function createOrderGrid(config) {
362
306
  const { startPrice, minPrice, maxPrice, incrementPercent } = config;
363
307
  // FIX: Add comprehensive input validation to prevent silent grid creation failures
364
308
  if (!Number.isFinite(startPrice)) {
@@ -388,7 +332,7 @@ function createOrderGrid(config) {
388
332
  // Fall back to the canonical INCREMENT_BOUNDS when the config omits
389
333
  // incrementBounds. Without this, a non-positive incrementPercent (e.g. 0)
390
334
  // silently passes validation and the geometric loop below spins forever.
391
- const incrementBounds = config.incrementBounds || constants_1.INCREMENT_BOUNDS;
335
+ const incrementBounds = config.incrementBounds || INCREMENT_BOUNDS;
392
336
  const minPercent = incrementBounds.MIN_PERCENT;
393
337
  const maxPercent = incrementBounds.MAX_PERCENT;
394
338
  if (incrementPercent <= 0 || incrementPercent < minPercent || incrementPercent > maxPercent) {
@@ -439,7 +383,7 @@ function createOrderGrid(config) {
439
383
  // Determine the boundary and assign roles (BUY/SPREAD/SELL) to each slot.
440
384
  //
441
385
  // STRATEGY: Center the spread gap around startPrice
442
- const boundaryIdx = (0, order_1.calculateIdealBoundary)(priceLevels.map((p) => ({ price: p })), startPrice, gapSlots);
386
+ const boundaryIdx = calculateIdealBoundary(priceLevels.map((p) => ({ price: p })), startPrice, gapSlots);
443
387
  // ================================================================================
444
388
  // STEP 4: CREATE ORDER OBJECTS
445
389
  // ================================================================================
@@ -448,12 +392,12 @@ function createOrderGrid(config) {
448
392
  id: `slot-${i}`,
449
393
  price,
450
394
  type: null, // assigned below
451
- state: constants_1.ORDER_STATES.VIRTUAL,
395
+ state: ORDER_STATES.VIRTUAL,
452
396
  size: 0
453
397
  }));
454
- const updatedOrders = (0, order_1.assignGridRoles)(orders, boundaryIdx, gapSlots, constants_1.ORDER_TYPES, constants_1.ORDER_STATES);
455
- const buyCount = updatedOrders.filter((o) => o.type === constants_1.ORDER_TYPES.BUY).length;
456
- const sellCount = updatedOrders.filter((o) => o.type === constants_1.ORDER_TYPES.SELL).length;
398
+ const updatedOrders = assignGridRoles(orders, boundaryIdx, gapSlots, ORDER_TYPES, ORDER_STATES);
399
+ const buyCount = updatedOrders.filter((o) => o.type === ORDER_TYPES.BUY).length;
400
+ const sellCount = updatedOrders.filter((o) => o.type === ORDER_TYPES.SELL).length;
457
401
  if (buyCount === 0 || sellCount === 0) {
458
402
  throw new Error(`Grid generation produced an imbalanced rail (buy=${buyCount}, sell=${sellCount}) for ` +
459
403
  `startPrice=${startPrice}, bounds=[${minPrice}, ${maxPrice}], incrementPercent=${incrementPercent}, ` +
@@ -503,15 +447,15 @@ function _clearOrderCachesLogic(manager) {
503
447
  * @param {number|null} [boundaryIdx=null] - The master boundary index.
504
448
  * @returns {Promise<void>}
505
449
  */
506
- async function loadGrid(manager, grid, boundaryIdx = null) {
450
+ export async function loadGrid(manager, grid, boundaryIdx = null) {
507
451
  if (!Array.isArray(grid))
508
452
  return;
509
453
  return await manager._gridLock.acquire(async () => {
510
454
  try {
511
- await (0, system_1.withBlockchainRetry)(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
455
+ await withBlockchainRetry(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
512
456
  }
513
457
  catch (e) {
514
- manager.logger?.log?.(`Asset initialization failed during grid load: ${(0, errors_1.getErrorMessage)(e)}`, 'warn');
458
+ manager.logger?.log?.(`Asset initialization failed during grid load: ${getErrorMessage(e)}`, 'warn');
515
459
  }
516
460
  // RC-2: Use logic helper
517
461
  _clearOrderCachesLogic(manager);
@@ -540,14 +484,14 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
540
484
  const gapSlots = calculateGapSlots(manager.config?.incrementPercent, manager.config?.targetSpreadPercent, manager.config?.gridLimits);
541
485
  manager._gapSlots = gapSlots;
542
486
  const buyEndIdx = boundaryIdx;
543
- const sellStartIdx = (0, math_1.getSellStartIdx)(boundaryIdx, gapSlots);
487
+ const sellStartIdx = getSellStartIdx(boundaryIdx, gapSlots);
544
488
  let reassignCount = 0;
545
489
  grid = grid.map((slot, i) => {
546
490
  const correctType = (i <= buyEndIdx)
547
- ? constants_1.ORDER_TYPES.BUY
491
+ ? ORDER_TYPES.BUY
548
492
  : (i >= sellStartIdx)
549
- ? constants_1.ORDER_TYPES.SELL
550
- : constants_1.ORDER_TYPES.SPREAD;
493
+ ? ORDER_TYPES.SELL
494
+ : ORDER_TYPES.SPREAD;
551
495
  // DEFENSIVE BACKSTOP: a VIRTUAL slot with no orderId and
552
496
  // zero size is side-neutral — it is a reusable placeholder
553
497
  // that may be activated on either rail. Storing a stale
@@ -562,10 +506,10 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
562
506
  // boundary-shift and strategy re-plan paths use
563
507
  // assignGridRoles (order.ts) with assignOnChain, where
564
508
  // geometry-based typing wins.
565
- if ((0, order_1.isEmptyGridSlot)(slot, slot, { allowNullType: true })) {
566
- if (slot.type !== constants_1.ORDER_TYPES.SPREAD)
509
+ if (isEmptyGridSlot(slot, slot, { allowNullType: true })) {
510
+ if (slot.type !== ORDER_TYPES.SPREAD)
567
511
  reassignCount++;
568
- return { ...slot, type: constants_1.ORDER_TYPES.SPREAD };
512
+ return { ...slot, type: ORDER_TYPES.SPREAD };
569
513
  }
570
514
  if (slot.type !== correctType) {
571
515
  let newType = correctType;
@@ -583,8 +527,8 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
583
527
  // to a number by initializeGrid), which makes every
584
528
  // comparison false and wrongly resolves below-center
585
529
  // slots to SELL.
586
- if (newType === constants_1.ORDER_TYPES.SPREAD && (0, order_1.isOrderOnChain)(slot)) {
587
- newType = (0, order_1.resolveOnChainRetypeType)(slot, i, buyEndIdx, constants_1.ORDER_TYPES);
530
+ if (newType === ORDER_TYPES.SPREAD && isOrderOnChain(slot)) {
531
+ newType = resolveOnChainRetypeType(slot, i, buyEndIdx, ORDER_TYPES);
588
532
  }
589
533
  reassignCount++;
590
534
  return { ...slot, type: newType };
@@ -612,7 +556,7 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
612
556
  manager._gridBloatDetectedAt = Date.now();
613
557
  if (typeof manager.requestStructuralGridResync === 'function') {
614
558
  manager.requestStructuralGridResync('grid-bloat-detected', { reason: `Grid size ${d.gridSize} exceeds maximum ${d.maxAllowed}` }).catch((err) => {
615
- manager.logger?.log?.(`[GRID-BLOAT] Structural resync request failed: ${(0, errors_1.getErrorMessage)(err)}`, 'error');
559
+ manager.logger?.log?.(`[GRID-BLOAT] Structural resync request failed: ${getErrorMessage(err)}`, 'error');
616
560
  });
617
561
  }
618
562
  }
@@ -623,9 +567,9 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
623
567
  // RC-2: Use applyOrderUpdate (PRIVATE/UNLOCKED)
624
568
  for (const order of grid) {
625
569
  let currentOrder = order;
626
- if ((0, order_1.isPhantomOrder)(order)) {
570
+ if (isPhantomOrder(order)) {
627
571
  manager.logger?.log?.(`Sanitizing corrupted order ${order.id}: ACTIVE/PARTIAL without orderId -> VIRTUAL`, 'warn');
628
- currentOrder = { ...order, state: constants_1.ORDER_STATES.VIRTUAL };
572
+ currentOrder = { ...order, state: ORDER_STATES.VIRTUAL };
629
573
  }
630
574
  await manager._applyOrderUpdate(currentOrder, 'grid-load', { skipAccounting: true });
631
575
  }
@@ -638,8 +582,8 @@ async function loadGrid(manager, grid, boundaryIdx = null) {
638
582
  // at creation) so the count is order-independent, matching the
639
583
  // accountant (accounting.ts). Fall back to array position only
640
584
  // for ids that are not grid slot ids.
641
- const spreadCount = (0, math_1.countGapBandSpread)(manager, grid, (o, i) => {
642
- const idx = (0, order_1.parseSlotIndex)(o?.id);
585
+ const spreadCount = countGapBandSpread(manager, grid, (o, i) => {
586
+ const idx = parseSlotIndex(o?.id);
643
587
  return idx === null ? i : idx;
644
588
  });
645
589
  manager.initialSpreadCount = spreadCount;
@@ -659,7 +603,7 @@ function resolveMinScaleSlots(primary, secondary) {
659
603
  const s = Number(secondary);
660
604
  if (Number.isFinite(s))
661
605
  return Math.max(0, Math.floor(s));
662
- return constants_1.MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MIN_SCALE_SLOTS;
606
+ return MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MIN_SCALE_SLOTS;
663
607
  }
664
608
  /**
665
609
  * Initialize and orchestrate the order grid.
@@ -667,14 +611,14 @@ function resolveMinScaleSlots(primary, secondary) {
667
611
  * @return {Promise<void>}
668
612
  * @throws {Error} If initialization fails or account totals are missing.
669
613
  */
670
- async function initializeGrid(manager) {
614
+ export async function initializeGrid(manager) {
671
615
  if (!manager)
672
616
  throw new Error('initializeGrid requires a manager instance');
673
617
  try {
674
- await (0, system_1.withBlockchainRetry)(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
618
+ await withBlockchainRetry(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
675
619
  }
676
620
  catch (e) {
677
- manager.logger?.log?.(`Asset initialization failed during grid init: ${(0, errors_1.getErrorMessage)(e)}`, 'warn');
621
+ manager.logger?.log?.(`Asset initialization failed during grid init: ${getErrorMessage(e)}`, 'warn');
678
622
  }
679
623
  // FIX: Add explicit state validation to prevent cryptic errors later
680
624
  if (!manager.assets || !manager.assets.assetA || !manager.assets.assetB) {
@@ -689,7 +633,7 @@ async function initializeGrid(manager) {
689
633
  if (typeof mpRaw !== 'number' || isNaN(mpRaw)) {
690
634
  try {
691
635
  const { BitShares } = require('../bitshares_client');
692
- const derived = await (0, withPoolRef_1.derivePriceWithPoolRef)(BitShares, manager.config.assetA, manager.config.assetB, manager.config.priceMode || 'auto', manager.config.poolRef);
636
+ const derived = await derivePriceWithPoolRef(BitShares, manager.config.assetA, manager.config.assetB, manager.config.priceMode || 'auto', manager.config.poolRef);
693
637
  if (derived) {
694
638
  manager.logger?.log?.(`[DIAGNOSTIC] initializeGrid: Derived new startPrice=${derived.toFixed(8)} (mode=${manager.config.priceMode || 'auto'})`, 'info');
695
639
  manager.config.startPrice = Number(derived);
@@ -699,7 +643,7 @@ async function initializeGrid(manager) {
699
643
  }
700
644
  }
701
645
  catch (err) {
702
- manager.logger?.log?.(`Failed to derive market price: ${(0, errors_1.getErrorMessage)(err)}`, 'warn');
646
+ manager.logger?.log?.(`Failed to derive market price: ${getErrorMessage(err)}`, 'warn');
703
647
  throw err; // Re-throw to prevent "pool" string reaching numeric math
704
648
  }
705
649
  }
@@ -715,7 +659,7 @@ async function initializeGrid(manager) {
715
659
  let gp = mp;
716
660
  let gpSource = 'startPrice';
717
661
  let amaSnapshot = null;
718
- const whitelistFlags = (0, market_adapter_whitelist_1.getWhitelistFlags)(manager.config.botKey);
662
+ const whitelistFlags = getWhitelistFlags(manager.config.botKey);
719
663
  const isGridRangeScalingWhitelisted = whitelistFlags.asymmetricBounds === true;
720
664
  let gridPriceOffsetPct = 0;
721
665
  const gpRaw = manager.config.gridPrice;
@@ -728,7 +672,7 @@ async function initializeGrid(manager) {
728
672
  else if (gpMode === 'pool' || gpMode === 'book') {
729
673
  try {
730
674
  const { BitShares } = require('../bitshares_client');
731
- const derived = await (0, withPoolRef_1.derivePriceWithPoolRef)(BitShares, manager.config.assetA, manager.config.assetB, gpMode, manager.config.poolRef);
675
+ const derived = await derivePriceWithPoolRef(BitShares, manager.config.assetA, manager.config.assetB, gpMode, manager.config.poolRef);
732
676
  if (derived) {
733
677
  gp = Number(derived);
734
678
  gpSource = gpMode;
@@ -739,12 +683,12 @@ async function initializeGrid(manager) {
739
683
  }
740
684
  }
741
685
  catch (err) {
742
- manager.logger?.log?.(`initializeGrid: ${gpMode} gridPrice derivation failed: ${(0, errors_1.getErrorMessage)(err)}`, 'warn');
686
+ manager.logger?.log?.(`initializeGrid: ${gpMode} gridPrice derivation failed: ${getErrorMessage(err)}`, 'warn');
743
687
  }
744
688
  }
745
689
  else if (/^ama(?:[1-4])?$/.test(gpMode || '')) {
746
- amaSnapshot = (0, system_1.loadAmaCenterSnapshot)(manager.config.botKey);
747
- const amaCenter = amaSnapshot?.gridCenterPrice ?? (0, system_1.loadAmaCenterPrice)(manager.config.botKey);
690
+ amaSnapshot = loadAmaCenterSnapshot(manager.config.botKey);
691
+ const amaCenter = amaSnapshot?.gridCenterPrice ?? loadAmaCenterPrice(manager.config.botKey);
748
692
  if (Number.isFinite(amaCenter) && amaCenter > 0) {
749
693
  gp = amaCenter;
750
694
  gpSource = 'ama';
@@ -759,8 +703,8 @@ async function initializeGrid(manager) {
759
703
  manager.logger?.log?.(`initializeGrid: AMA center unavailable for gridPrice, falling back to startPrice`, 'warn');
760
704
  }
761
705
  }
762
- const minP = (0, order_1.resolveConfiguredPriceBound)(manager.config.minPrice, constants_1.DEFAULT_CONFIG.minPrice, gp, 'min');
763
- const maxP = (0, order_1.resolveConfiguredPriceBound)(manager.config.maxPrice, constants_1.DEFAULT_CONFIG.maxPrice, gp, 'max');
706
+ const minP = resolveConfiguredPriceBound(manager.config.minPrice, DEFAULT_CONFIG.minPrice, gp, 'min');
707
+ const maxP = resolveConfiguredPriceBound(manager.config.maxPrice, DEFAULT_CONFIG.maxPrice, gp, 'max');
764
708
  // Asymmetric bound adjustment: widen the bound in the AMA trend direction
765
709
  // and tighten the opposite side, giving the grid more room when the center
766
710
  // trails price. Uses slope data from the dynamicgrid.json snapshot.
@@ -779,8 +723,8 @@ async function initializeGrid(manager) {
779
723
  ? amaSnapshot.asymmetricBounds
780
724
  : null;
781
725
  if (dw) {
782
- const maxAsymmetryFactor = (0, asymmetric_bounds_1.resolveMaxAsymmetryFactor)(manager.config.asymmetricBounds?.maxAsymmetryFactor, dw?.maxAsymmetryFactor, constants_1.MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MAX_ASYMMETRY_FACTOR);
783
- const adjustment = (0, asymmetric_bounds_1.applyAsymmetricBounds)({
726
+ const maxAsymmetryFactor = resolveMaxAsymmetryFactor(manager.config.asymmetricBounds?.maxAsymmetryFactor, dw?.maxAsymmetryFactor, MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MAX_ASYMMETRY_FACTOR);
727
+ const adjustment = applyAsymmetricBounds({
784
728
  centerPrice: gp,
785
729
  minPrice: minP,
786
730
  maxPrice: maxP,
@@ -889,14 +833,14 @@ async function initializeGrid(manager) {
889
833
  // Ensure percentage-based funds are resolved before sizing
890
834
  try {
891
835
  if (manager.accountId && !manager.accountTotals) {
892
- await manager.waitForAccountTotals(constants_1.TIMING.ACCOUNT_TOTALS_TIMEOUT_MS);
836
+ await manager.waitForAccountTotals(TIMING.ACCOUNT_TOTALS_TIMEOUT_MS);
893
837
  }
894
838
  }
895
839
  catch (e) {
896
- manager.logger?.log?.(`Failed to load account totals: ${(0, errors_1.getErrorMessage)(e)}`, 'warn');
840
+ manager.logger?.log?.(`Failed to load account totals: ${getErrorMessage(e)}`, 'warn');
897
841
  // FIX: Add error handling - cannot proceed with grid initialization without account totals
898
842
  // Continuing would create grid with 0 fund allocation, rendering it non-functional
899
- throw new Error(`Cannot initialize grid without account totals: ${(0, errors_1.getErrorMessage)(e)}`);
843
+ throw new Error(`Cannot initialize grid without account totals: ${getErrorMessage(e)}`);
900
844
  }
901
845
  const { orders, boundaryIdx, initialSpreadCount, gapSlots } = createOrderGrid({
902
846
  ...manager.config,
@@ -915,13 +859,13 @@ async function initializeGrid(manager) {
915
859
  manager.notifyBoundaryUpdate(boundaryIdx);
916
860
  }
917
861
  catch (err) {
918
- manager.logger?.log?.(`Error notifying boundary update: ${(0, errors_1.getErrorMessage)(err)}`, 'warn');
862
+ manager.logger?.log?.(`Error notifying boundary update: ${getErrorMessage(err)}`, 'warn');
919
863
  }
920
864
  }
921
865
  }
922
- const minSellSize = (0, math_1.getMinAbsoluteOrderSize)(constants_1.ORDER_TYPES.SELL, manager.assets);
923
- const minBuySize = (0, math_1.getMinAbsoluteOrderSize)(constants_1.ORDER_TYPES.BUY, manager.assets);
924
- const { A: precA, B: precB } = (0, math_1.getPrecisionsForManager)(manager.assets);
866
+ const minSellSize = getMinAbsoluteOrderSize(ORDER_TYPES.SELL, manager.assets);
867
+ const minBuySize = getMinAbsoluteOrderSize(ORDER_TYPES.BUY, manager.assets);
868
+ const { A: precA, B: precB } = getPrecisionsForManager(manager.assets);
925
869
  // Use centralized sizing context for both sides.
926
870
  // Resolve funds once upfront so both contexts share the same snapshot,
927
871
  // avoiding a redundant recalculateFunds inside the second _getSizingContext call.
@@ -930,17 +874,17 @@ async function initializeGrid(manager) {
930
874
  const buyCtx = await _getSizingContext(manager, 'buy', { skipRecalc: true });
931
875
  if (!sellCtx || !buyCtx)
932
876
  throw new Error('Failed to retrieve sizing context for grid initialization');
933
- let sizedOrders = (0, math_1.calculateOrderSizes)(orders, manager.config, sellCtx.budget, buyCtx.budget, minSellSize, minBuySize, precA, precB);
877
+ let sizedOrders = calculateOrderSizes(orders, manager.config, sellCtx.budget, buyCtx.budget, minSellSize, minBuySize, precA, precB);
934
878
  // Verification of sizes
935
- const sells = (0, order_1.filterOrdersByType)(sizedOrders, constants_1.ORDER_TYPES.SELL).map((o) => Number(o.size || 0));
936
- const buys = (0, order_1.filterOrdersByType)(sizedOrders, constants_1.ORDER_TYPES.BUY).map((o) => Number(o.size || 0));
937
- if ((0, order_1.checkSizesBeforeMinimum)(sells, minSellSize, precA) || (0, order_1.checkSizesBeforeMinimum)(buys, minBuySize, precB)) {
879
+ const sells = filterOrdersByType(sizedOrders, ORDER_TYPES.SELL).map((o) => Number(o.size || 0));
880
+ const buys = filterOrdersByType(sizedOrders, ORDER_TYPES.BUY).map((o) => Number(o.size || 0));
881
+ if (checkSizesBeforeMinimum(sells, minSellSize, precA) || checkSizesBeforeMinimum(buys, minBuySize, precB)) {
938
882
  throw new Error('Calculated orders fall below minimum allowable size.');
939
883
  }
940
884
  // Check for warning if orders are near minimal size (regression fix)
941
- const warningSellSize = minSellSize > 0 ? (0, math_1.getMinAbsoluteOrderSize)(constants_1.ORDER_TYPES.SELL, manager.assets, 100) : 0;
942
- const warningBuySize = minBuySize > 0 ? (0, math_1.getMinAbsoluteOrderSize)(constants_1.ORDER_TYPES.BUY, manager.assets, 100) : 0;
943
- if ((0, order_1.checkSizeThreshold)(sells, warningSellSize, precA, false) || (0, order_1.checkSizeThreshold)(buys, warningBuySize, precB, false)) {
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;
887
+ if (checkSizeThreshold(sells, warningSellSize, precA, false) || checkSizeThreshold(buys, warningBuySize, precB, false)) {
944
888
  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");
945
889
  }
946
890
  // RC-2: Wrap atomic changes in grid lock
@@ -985,13 +929,13 @@ async function initializeGrid(manager) {
985
929
  * @param {string} opts.privateKey - Private key.
986
930
  * @returns {Promise<void>}
987
931
  */
988
- async function recalculateGrid(manager, opts) {
932
+ export async function recalculateGrid(manager, opts) {
989
933
  const { readOpenOrdersFn, chainOrders, account, privateKey } = opts;
990
934
  // Suppress invariant warnings during full resync
991
935
  manager.startBootstrap();
992
936
  // Total timeout across all steps — prevents indefinite hang even if
993
937
  // an individual withBlockchainRetry step pins the event loop.
994
- const totalTimeoutMs = constants_1.PIPELINE_TIMING.TIMEOUT_MS * 2; // 10 min
938
+ const totalTimeoutMs = PIPELINE_TIMING.TIMEOUT_MS * 2; // 10 min
995
939
  let _resyncAborted = false;
996
940
  const work = (async () => {
997
941
  try {
@@ -1000,24 +944,24 @@ async function recalculateGrid(manager, opts) {
1000
944
  return;
1001
945
  // #1: Initialize assets with timeout + retry + node failover
1002
946
  try {
1003
- await (0, system_1.withBlockchainRetry)(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
947
+ await withBlockchainRetry(() => manager._initializeAssets(), 'initializeAssets', { logger: manager.logger });
1004
948
  }
1005
949
  catch (e) {
1006
- manager.logger?.log?.(`Asset initialization failed during resync: ${(0, errors_1.getErrorMessage)(e)}`, 'warn');
950
+ manager.logger?.log?.(`Asset initialization failed during resync: ${getErrorMessage(e)}`, 'warn');
1007
951
  }
1008
952
  if (_resyncAborted)
1009
953
  return;
1010
954
  // #2: Fetch account totals with timeout + retry + node failover
1011
- await (0, system_1.withBlockchainRetry)(() => manager.fetchAccountTotals(), 'fetchAccountTotals', { logger: manager.logger });
955
+ await withBlockchainRetry(() => manager.fetchAccountTotals(), 'fetchAccountTotals', { logger: manager.logger });
1012
956
  if (_resyncAborted)
1013
957
  return;
1014
958
  // #3: Read open orders with timeout + retry + node failover
1015
- const chainOpenOrders = await (0, system_1.withBlockchainRetry)(() => readOpenOrdersFn(), 'readOpenOrders', { logger: manager.logger });
959
+ const chainOpenOrders = await withBlockchainRetry(() => readOpenOrdersFn(), 'readOpenOrders', { logger: manager.logger });
1016
960
  if (_resyncAborted)
1017
961
  return;
1018
962
  if (!Array.isArray(chainOpenOrders))
1019
963
  return;
1020
- await (0, system_1.withBlockchainRetry)(() => manager.syncFromOpenOrders(chainOpenOrders, { skipAccounting: true }), 'syncFromOpenOrders', { logger: manager.logger });
964
+ await withBlockchainRetry(() => manager.syncFromOpenOrders(chainOpenOrders, { skipAccounting: true }), 'syncFromOpenOrders', { logger: manager.logger });
1021
965
  if (_resyncAborted)
1022
966
  return;
1023
967
  // resetFunds under _fundLock + snapshot; persistGrid outside lock to
@@ -1057,8 +1001,8 @@ async function recalculateGrid(manager, opts) {
1057
1001
  await reconcileGridOrders({ manager, config: manager.config, account, privateKey, chainOrders, chainOpenOrders });
1058
1002
  }
1059
1003
  catch (err) {
1060
- manager.logger?.log?.(`Error during startup order reconciliation: ${(0, errors_1.getErrorMessage)(err)}`, 'error');
1061
- throw new Error(`Grid recalculation failed during order reconciliation: ${(0, errors_1.getErrorMessage)(err)}`);
1004
+ manager.logger?.log?.(`Error during startup order reconciliation: ${getErrorMessage(err)}`, 'error');
1005
+ throw new Error(`Grid recalculation failed during order reconciliation: ${getErrorMessage(err)}`);
1062
1006
  }
1063
1007
  if (_resyncAborted)
1064
1008
  return;
@@ -1089,20 +1033,20 @@ async function recalculateGrid(manager, opts) {
1089
1033
  * @param {import('./types').OrderManager} manager - Manager instance with order state
1090
1034
  * @returns {import('./types').SideUpdateFlags}
1091
1035
  */
1092
- function checkAndUpdateGridIfNeeded(manager) {
1036
+ export function checkAndUpdateGridIfNeeded(manager) {
1093
1037
  const threshold = manager.config?.gridLimits?.GRID_REGENERATION_PERCENTAGE;
1094
1038
  const chainSnap = manager.getChainFundsSnapshot();
1095
1039
  const gridBuy = Number(manager.funds?.total?.grid?.buy || 0);
1096
1040
  const gridSell = Number(manager.funds?.total?.grid?.sell || 0);
1097
1041
  const result = { buyUpdated: false, sellUpdated: false };
1098
1042
  const sides = [
1099
- { name: 'buy', grid: gridBuy, orderType: constants_1.ORDER_TYPES.BUY },
1100
- { name: 'sell', grid: gridSell, orderType: constants_1.ORDER_TYPES.SELL }
1043
+ { name: 'buy', grid: gridBuy, orderType: ORDER_TYPES.BUY },
1044
+ { name: 'sell', grid: gridSell, orderType: ORDER_TYPES.SELL }
1101
1045
  ];
1102
1046
  for (const s of sides) {
1103
1047
  if (s.grid <= 0)
1104
1048
  continue;
1105
- const availableFunds = (0, math_1.calculateAvailableFundsValue)(s.name, manager.accountTotals, manager.funds, manager.config.assetA, manager.config.assetB, manager.config.activeOrders, manager.config.min_BTS_value, manager.config.feeParams ?? null);
1049
+ const availableFunds = calculateAvailableFundsValue(s.name, manager.accountTotals, manager.funds, manager.config.assetA, manager.config.assetB, manager.config.activeOrders, manager.config.min_BTS_value, manager.config.feeParams ?? null);
1106
1050
  // Denominator: side's allocated capital (or chain total fallback).
1107
1051
  const allocated = s.name === 'buy' ? chainSnap.allocatedBuy : chainSnap.allocatedSell;
1108
1052
  const denominator = (allocated > 0) ? allocated : (s.grid + availableFunds);
@@ -1172,16 +1116,16 @@ function checkAndUpdateGridIfNeeded(manager) {
1172
1116
  * @param {import('./types').OrderManager} manager - OrderManager instance
1173
1117
  * @param {string} orderType - ORDER_TYPES.BUY or ORDER_TYPES.SELL
1174
1118
  * @param {Object} [options] - Options object
1175
- * @param {import('./working_grid')} [options.workingGrid] - Working grid for COW pattern
1119
+ * @param {import('./working_grid.js')} [options.workingGrid] - Working grid for COW pattern
1176
1120
  * @returns {Promise<{actions: Array, changed: boolean}|undefined>} - COW result or undefined
1177
1121
  * @private
1178
1122
  */
1179
- async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, options = {}) {
1123
+ export async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, options = {}) {
1180
1124
  if (!manager.assets)
1181
1125
  return options?.workingGrid ? { actions: [], changed: false } : undefined;
1182
1126
  const workingGrid = options?.workingGrid || null;
1183
1127
  const collectActions = !!workingGrid;
1184
- const isBuy = orderType === constants_1.ORDER_TYPES.BUY;
1128
+ const isBuy = orderType === ORDER_TYPES.BUY;
1185
1129
  const sideName = isBuy ? 'buy' : 'sell';
1186
1130
  // Use centralized sizing context (respects botFunds % allocation)
1187
1131
  const ctx = await _getSizingContext(manager, sideName);
@@ -1217,7 +1161,7 @@ async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, opti
1217
1161
  if (allSideSlots.length === 0)
1218
1162
  return collectActions ? { actions: [], changed: false } : undefined;
1219
1163
  // Calculate geometric sizes for the ENTIRE rail
1220
- const newSizes = (0, math_1.calculateRotationOrderSizes)(ctx.budget, 0, allSideSlots.length, orderType, manager.config, 0, ctx.precision);
1164
+ const newSizes = calculateRotationOrderSizes(ctx.budget, 0, allSideSlots.length, orderType, manager.config, 0, ctx.precision);
1221
1165
  const actions = [];
1222
1166
  let changed = false;
1223
1167
  const freeKey = isBuy ? 'buyFree' : 'sellFree';
@@ -1236,7 +1180,7 @@ async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, opti
1236
1180
  // NOTE: BTS update fees are paid from BTS balance (separate from asset balance),
1237
1181
  // so they don't affect this asset-side size cap. Fee budgets are tracked in
1238
1182
  // funds.btsFeesOwed and reserved separately via btsFeesReservation.
1239
- const isCommitted = (0, order_1.isOrderOnChain)(slot);
1183
+ const isCommitted = isOrderOnChain(slot);
1240
1184
  if (isCommitted) {
1241
1185
  const currentSize = Number(slot.size || 0);
1242
1186
  const delta = newSize - currentSize;
@@ -1256,8 +1200,8 @@ async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, opti
1256
1200
  }
1257
1201
  }
1258
1202
  // Use integer comparison to avoid redundant updates from float noise
1259
- const currentSizeInt = (0, math_1.floatToBlockchainInt)(slot.size || 0, ctx.precision);
1260
- const newSizeInt = (0, math_1.floatToBlockchainInt)(newSize, ctx.precision);
1203
+ const currentSizeInt = floatToBlockchainInt(slot.size || 0, ctx.precision);
1204
+ const newSizeInt = floatToBlockchainInt(newSize, ctx.precision);
1261
1205
  if (slot.size === undefined || currentSizeInt !== newSizeInt) {
1262
1206
  changed = true;
1263
1207
  if (collectActions) {
@@ -1265,9 +1209,9 @@ async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, opti
1265
1209
  ...slot,
1266
1210
  size: newSize
1267
1211
  });
1268
- if (isCommitted && (0, order_1.hasOnChainId)(slot)) {
1212
+ if (isCommitted && hasOnChainId(slot)) {
1269
1213
  actions.push({
1270
- type: constants_1.COW_ACTIONS.UPDATE,
1214
+ type: COW_ACTIONS.UPDATE,
1271
1215
  id: slot.id,
1272
1216
  orderId: slot.orderId,
1273
1217
  newGridId: slot.id,
@@ -1313,9 +1257,9 @@ async function _recalculateGridOrderSizesFromBlockchain(manager, orderType, opti
1313
1257
  * @param {string} orderType - 'buy', 'sell', or 'both' - which sides to update
1314
1258
  * @param {boolean} [fromBlockchainTimer=false] - If true, skip refetch of account totals (already current)
1315
1259
  * @param {number|null} [overrideBoundaryIdx=null] - Optional override for boundary index
1316
- * @returns {Promise<{actions: Array, workingGrid: import('./working_grid'), workingIndexes: Object, workingBoundary: number, hasWorkingChanges: boolean, aborted: boolean}|null>}
1260
+ * @returns {Promise<{actions: Array, workingGrid: import('./working_grid.js'), workingIndexes: Object, workingBoundary: number, hasWorkingChanges: boolean, aborted: boolean}|null>}
1317
1261
  */
1318
- async function updateGridFromBlockchainSnapshot(manager, orderType = 'both', fromBlockchainTimer = false, overrideBoundaryIdx = null) {
1262
+ export async function updateGridFromBlockchainSnapshot(manager, orderType = 'both', fromBlockchainTimer = false, overrideBoundaryIdx = null) {
1319
1263
  if (!fromBlockchainTimer && manager.config?.accountId) {
1320
1264
  await manager.fetchAccountTotals(manager.config.accountId);
1321
1265
  }
@@ -1341,7 +1285,7 @@ async function updateGridFromBlockchainSnapshot(manager, orderType = 'both', fro
1341
1285
  const allSlots = Array.from(workingGrid.values())
1342
1286
  .filter((s) => s.price != null)
1343
1287
  .sort((a, b) => a.price - b.price);
1344
- const updatedSlots = (0, order_1.assignGridRoles)(allSlots, newBoundary, gapSlots, constants_1.ORDER_TYPES, constants_1.ORDER_STATES, { assignOnChain: true });
1288
+ const updatedSlots = assignGridRoles(allSlots, newBoundary, gapSlots, ORDER_TYPES, ORDER_STATES, { assignOnChain: true });
1345
1289
  for (const slot of updatedSlots) {
1346
1290
  workingGrid.set(slot.id, slot);
1347
1291
  }
@@ -1350,13 +1294,13 @@ async function updateGridFromBlockchainSnapshot(manager, orderType = 'both', fro
1350
1294
  // Calculate size updates for each side (via existing sizing function in COW mode).
1351
1295
  // _recalculateGridOrderSizesFromBlockchain reads types from the working grid when
1352
1296
  // one is passed, so boundary-crossing slots are now correctly classified.
1353
- if (orderType === constants_1.ORDER_TYPES.BUY || orderType === 'both') {
1354
- const buyResult = await _recalculateGridOrderSizesFromBlockchain(manager, constants_1.ORDER_TYPES.BUY, { workingGrid });
1297
+ if (orderType === ORDER_TYPES.BUY || orderType === 'both') {
1298
+ const buyResult = await _recalculateGridOrderSizesFromBlockchain(manager, ORDER_TYPES.BUY, { workingGrid });
1355
1299
  allActions.push(...buyResult.actions);
1356
1300
  hasWorkingChanges = hasWorkingChanges || buyResult.changed;
1357
1301
  }
1358
- if (orderType === constants_1.ORDER_TYPES.SELL || orderType === 'both') {
1359
- const sellResult = await _recalculateGridOrderSizesFromBlockchain(manager, constants_1.ORDER_TYPES.SELL, { workingGrid });
1302
+ if (orderType === ORDER_TYPES.SELL || orderType === 'both') {
1303
+ const sellResult = await _recalculateGridOrderSizesFromBlockchain(manager, ORDER_TYPES.SELL, { workingGrid });
1360
1304
  allActions.push(...sellResult.actions);
1361
1305
  hasWorkingChanges = hasWorkingChanges || sellResult.changed;
1362
1306
  }
@@ -1402,7 +1346,7 @@ async function updateGridFromBlockchainSnapshot(manager, orderType = 'both', fro
1402
1346
  * @param {import('./types').OrderManager|null} [manager=null] - Manager instance (for grid lock access)
1403
1347
  * @returns {Promise<import('./types').GridComparisonResult>}
1404
1348
  */
1405
- async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1349
+ export async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1406
1350
  if (!Array.isArray(calculatedGrid) || !Array.isArray(persistedGrid)) {
1407
1351
  return { buy: { metric: 0, updated: false }, sell: { metric: 0, updated: false } };
1408
1352
  }
@@ -1425,14 +1369,14 @@ async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1425
1369
  // they are instead handled by the available-funds ratio check or follow-up correction.
1426
1370
  // Must be sorted ASC for calculateRotationOrderSizes to match geometric weight distribution
1427
1371
  const filterForRms = (orders, type) => {
1428
- const result = Array.isArray(orders) ? orders.filter((o) => o && o.type === type && o.state === constants_1.ORDER_STATES.ACTIVE) : [];
1372
+ const result = Array.isArray(orders) ? orders.filter((o) => o && o.type === type && o.state === ORDER_STATES.ACTIVE) : [];
1429
1373
  return result
1430
1374
  .sort((a, b) => (a.price ?? 0) - (b.price ?? 0));
1431
1375
  };
1432
- const calculatedBuys = filterForRms(calculatedSnap, constants_1.ORDER_TYPES.BUY);
1433
- const calculatedSells = filterForRms(calculatedSnap, constants_1.ORDER_TYPES.SELL);
1434
- const persistedBuys = filterForRms(persistedSnap, constants_1.ORDER_TYPES.BUY);
1435
- const persistedSells = filterForRms(persistedSnap, constants_1.ORDER_TYPES.SELL);
1376
+ const calculatedBuys = filterForRms(calculatedSnap, ORDER_TYPES.BUY);
1377
+ const calculatedSells = filterForRms(calculatedSnap, ORDER_TYPES.SELL);
1378
+ const persistedBuys = filterForRms(persistedSnap, ORDER_TYPES.BUY);
1379
+ const persistedSells = filterForRms(persistedSnap, ORDER_TYPES.SELL);
1436
1380
  // Calculate ideal sizes for each order based on current available budget.
1437
1381
  // The sizing context (which includes recalculateFunds) is resolved once per side up front
1438
1382
  // so both buy and sell metrics share a single fund snapshot. This avoids the previous
@@ -1455,7 +1399,7 @@ async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1455
1399
  return activeOrders;
1456
1400
  // Calculate geometric ideals for the ENTIRE side (all slots)
1457
1401
  try {
1458
- const allIdealSizes = (0, math_1.calculateRotationOrderSizes)(ctx.budget, 0, sideSlots.length, type, manager.config, 0, ctx.precision);
1402
+ const allIdealSizes = calculateRotationOrderSizes(ctx.budget, 0, sideSlots.length, type, manager.config, 0, ctx.precision);
1459
1403
  // Map Ideal sizes to IDs for quick lookup
1460
1404
  const idealMap = new Map();
1461
1405
  sideSlots.forEach((slot, i) => idealMap.set(slot.id, allIdealSizes[i]));
@@ -1477,11 +1421,11 @@ async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1477
1421
  const sellCtx = needsSell
1478
1422
  ? await _getSizingContext(manager, 'sell', { skipRecalc: true })
1479
1423
  : null;
1480
- const buyIdeals = computeSideIdeals(calculatedBuys, constants_1.ORDER_TYPES.BUY, buyCtx);
1481
- const sellIdeals = computeSideIdeals(calculatedSells, constants_1.ORDER_TYPES.SELL, sellCtx);
1424
+ const buyIdeals = computeSideIdeals(calculatedBuys, ORDER_TYPES.BUY, buyCtx);
1425
+ const sellIdeals = computeSideIdeals(calculatedSells, ORDER_TYPES.SELL, sellCtx);
1482
1426
  // Calculate RMS divergence metric for each side
1483
- const buyMetric = (0, math_1.calculateGridSideDivergenceMetric)(buyIdeals, persistedBuys, 'buy');
1484
- const sellMetric = (0, math_1.calculateGridSideDivergenceMetric)(sellIdeals, persistedSells, 'sell');
1427
+ const buyMetric = calculateGridSideDivergenceMetric(buyIdeals, persistedBuys, 'buy');
1428
+ const sellMetric = calculateGridSideDivergenceMetric(sellIdeals, persistedSells, 'sell');
1485
1429
  // Check if metrics exceed threshold and flag sides for regeneration
1486
1430
  // Set RMS_PERCENTAGE to 0 to disable RMS divergence checks
1487
1431
  let buyUpdated = false, sellUpdated = false;
@@ -1491,14 +1435,14 @@ async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1491
1435
  // RC-3: Use Set for automatic duplicate prevention
1492
1436
  if (!(manager._gridSidesUpdated instanceof Set))
1493
1437
  manager._gridSidesUpdated = new Set();
1494
- manager._gridSidesUpdated.add(constants_1.ORDER_TYPES.BUY);
1438
+ manager._gridSidesUpdated.add(ORDER_TYPES.BUY);
1495
1439
  buyUpdated = true;
1496
1440
  }
1497
1441
  if (sellMetric > limit) {
1498
1442
  // RC-3: Use Set for automatic duplicate prevention
1499
1443
  if (!(manager._gridSidesUpdated instanceof Set))
1500
1444
  manager._gridSidesUpdated = new Set();
1501
- manager._gridSidesUpdated.add(constants_1.ORDER_TYPES.SELL);
1445
+ manager._gridSidesUpdated.add(ORDER_TYPES.SELL);
1502
1446
  sellUpdated = true;
1503
1447
  }
1504
1448
  }
@@ -1517,7 +1461,7 @@ async function compareGrids(calculatedGrid, persistedGrid, manager = null) {
1517
1461
  * @param {Array<import('./types').GridOrderSlot>} persistedGrid - Current/persisted grid
1518
1462
  * @returns {Promise<import('./types').DivergenceResult>}
1519
1463
  */
1520
- async function monitorDivergence(manager, calculatedGrid, persistedGrid) {
1464
+ export async function monitorDivergence(manager, calculatedGrid, persistedGrid) {
1521
1465
  // 1. Check ratio-based divergence (available funds vs allocated)
1522
1466
  const ratioResult = checkAndUpdateGridIfNeeded(manager);
1523
1467
  if (ratioResult.buyUpdated || ratioResult.sellUpdated) {
@@ -1549,12 +1493,12 @@ async function monitorDivergence(manager, calculatedGrid, persistedGrid) {
1549
1493
  */
1550
1494
  function _getOnChainOrders(manager) {
1551
1495
  const onChainBuys = [
1552
- ...manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.BUY, constants_1.ORDER_STATES.ACTIVE),
1553
- ...manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.BUY, constants_1.ORDER_STATES.PARTIAL)
1496
+ ...manager.getOrdersByTypeAndState(ORDER_TYPES.BUY, ORDER_STATES.ACTIVE),
1497
+ ...manager.getOrdersByTypeAndState(ORDER_TYPES.BUY, ORDER_STATES.PARTIAL)
1554
1498
  ].filter((o) => o?.orderId && Number(o?.size || 0) > 0);
1555
1499
  const onChainSells = [
1556
- ...manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.SELL, constants_1.ORDER_STATES.ACTIVE),
1557
- ...manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.SELL, constants_1.ORDER_STATES.PARTIAL)
1500
+ ...manager.getOrdersByTypeAndState(ORDER_TYPES.SELL, ORDER_STATES.ACTIVE),
1501
+ ...manager.getOrdersByTypeAndState(ORDER_TYPES.SELL, ORDER_STATES.PARTIAL)
1558
1502
  ].filter((o) => o?.orderId && Number(o?.size || 0) > 0);
1559
1503
  return { onChainBuys, onChainSells };
1560
1504
  }
@@ -1563,9 +1507,9 @@ function _getOnChainOrders(manager) {
1563
1507
  * @param {import('./types').OrderManager} manager - The manager instance.
1564
1508
  * @returns {number} The calculated spread percentage.
1565
1509
  */
1566
- function calculateCurrentSpread(manager) {
1510
+ export function calculateCurrentSpread(manager) {
1567
1511
  const { onChainBuys, onChainSells } = _getOnChainOrders(manager);
1568
- return (0, math_1.calculateSpreadFromOrders)(onChainBuys, onChainSells);
1512
+ return calculateSpreadFromOrders(onChainBuys, onChainSells);
1569
1513
  }
1570
1514
  /**
1571
1515
  * Proactive spread correction check.
@@ -1590,7 +1534,7 @@ function calculateCurrentSpread(manager) {
1590
1534
  * @param {Function|null} [updateOrdersOnChainBatch=null] - Optional batch update function
1591
1535
  * @returns {Promise<import('./types').SpreadCheckResult>}
1592
1536
  */
1593
- async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatch = null) {
1537
+ export async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatch = null) {
1594
1538
  // CRITICAL: Acquire corrections lock to serialize spread correction operations
1595
1539
  // This prevents concurrent fill processing from modifying funds while we're making decisions
1596
1540
  let correction = null;
@@ -1604,7 +1548,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1604
1548
  // Mid between best bid and best ask is the most current price the bot has.
1605
1549
  // Falls back to config.startPrice when either side is empty (e.g. at startup).
1606
1550
  const { onChainBuys, onChainSells } = _getOnChainOrders(manager);
1607
- const { bestBuy, bestSell } = (0, math_1.getGridBestPrices)(onChainBuys, onChainSells);
1551
+ const { bestBuy, bestSell } = getGridBestPrices(onChainBuys, onChainSells);
1608
1552
  const lastPrice = (bestBuy !== null && bestSell !== null)
1609
1553
  ? (bestBuy + bestSell) / 2
1610
1554
  : Number(manager.config.startPrice) || 0;
@@ -1622,18 +1566,18 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1622
1566
  const currentSpread = calculateCurrentSpread(manager);
1623
1567
  // Nominal spread is the configured target spread percentage.
1624
1568
  // Keep this fixed: doubled-side flags are fill/replacement mechanics only.
1625
- const nominalSpread = manager.config.targetSpreadPercent ?? constants_1.DEFAULT_CONFIG.targetSpreadPercent;
1569
+ const nominalSpread = manager.config.targetSpreadPercent ?? DEFAULT_CONFIG.targetSpreadPercent;
1626
1570
  // Fixed tolerance: 0.5 steps = half increment (tighter spread check).
1627
1571
  const toleranceSteps = 0.5;
1628
- const buyCount = manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.BUY, constants_1.ORDER_STATES.ACTIVE)
1629
- .concat(manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.BUY, constants_1.ORDER_STATES.PARTIAL))
1572
+ const buyCount = manager.getOrdersByTypeAndState(ORDER_TYPES.BUY, ORDER_STATES.ACTIVE)
1573
+ .concat(manager.getOrdersByTypeAndState(ORDER_TYPES.BUY, ORDER_STATES.PARTIAL))
1630
1574
  .filter((o) => o?.orderId && Number(o?.size || 0) > 0)
1631
1575
  .length;
1632
- const sellCount = manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.SELL, constants_1.ORDER_STATES.ACTIVE)
1633
- .concat(manager.getOrdersByTypeAndState(constants_1.ORDER_TYPES.SELL, constants_1.ORDER_STATES.PARTIAL))
1576
+ const sellCount = manager.getOrdersByTypeAndState(ORDER_TYPES.SELL, ORDER_STATES.ACTIVE)
1577
+ .concat(manager.getOrdersByTypeAndState(ORDER_TYPES.SELL, ORDER_STATES.PARTIAL))
1634
1578
  .filter((o) => o?.orderId && Number(o?.size || 0) > 0)
1635
1579
  .length;
1636
- manager.outOfSpread = (0, order_1.shouldFlagOutOfSpread)(currentSpread, nominalSpread, toleranceSteps, buyCount, sellCount, manager.config.incrementPercent);
1580
+ manager.outOfSpread = shouldFlagOutOfSpread(currentSpread, nominalSpread, toleranceSteps, buyCount, sellCount, manager.config.incrementPercent);
1637
1581
  if (manager.outOfSpread === 0)
1638
1582
  return false;
1639
1583
  // Check whether the empty side is caused by boundary-at-rail-edge.
@@ -1649,7 +1593,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1649
1593
  const gapSlots = manager._gapSlots ?? calculateGapSlots(manager.config.incrementPercent, manager.config.targetSpreadPercent, manager.config.gridLimits);
1650
1594
  const railLen = allSlots.length;
1651
1595
  const buyEndIdx = manager.boundaryIdx;
1652
- const sellStartIdx = (0, math_1.getSellStartIdx)(manager.boundaryIdx, gapSlots);
1596
+ const sellStartIdx = getSellStartIdx(manager.boundaryIdx, gapSlots);
1653
1597
  const buySideCount = Math.max(0, Math.min(railLen, buyEndIdx + 1));
1654
1598
  const sellSideCount = Math.max(0, railLen - sellStartIdx);
1655
1599
  // Structural resync: both sides have room but one is empty.
@@ -1663,7 +1607,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1663
1607
  `Requesting structural grid resync to re-center.`, 'warn');
1664
1608
  if (typeof manager.requestStructuralGridResync === 'function') {
1665
1609
  manager.requestStructuralGridResync('boundary-at-rail-edge', { reason: `Boundary ${manager.boundaryIdx} leaves ${buySideCount} buy / ${sellSideCount} sell slots` }).catch((err) => {
1666
- manager.logger?.log?.(`[SPREAD] Structural resync request failed: ${(0, errors_1.getErrorMessage)(err)}`, 'error');
1610
+ manager.logger?.log?.(`[SPREAD] Structural resync request failed: ${getErrorMessage(err)}`, 'error');
1667
1611
  });
1668
1612
  }
1669
1613
  }
@@ -1683,7 +1627,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1683
1627
  // STARVATION FALLBACK: If the selected side has no correctable slots (e.g.
1684
1628
  // all SPREAD slots already filled or misaligned), try the opposite side.
1685
1629
  if ((placeCount + updateCount) === 0) {
1686
- const oppositeSide = decision.side === constants_1.ORDER_TYPES.BUY ? constants_1.ORDER_TYPES.SELL : constants_1.ORDER_TYPES.BUY;
1630
+ const oppositeSide = decision.side === ORDER_TYPES.BUY ? ORDER_TYPES.SELL : ORDER_TYPES.BUY;
1687
1631
  manager.logger?.log?.(`[SPREAD] Side ${decision.side} produced zero candidates; ` +
1688
1632
  `trying opposite side ${oppositeSide}.`, 'debug');
1689
1633
  const oppositeCorrection = await prepareSpreadCorrectionOrders(manager, oppositeSide, manager.outOfSpread);
@@ -1701,7 +1645,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1701
1645
  shouldApplyCorrection = await manager._gridLock.acquire(executeSpreadCheck);
1702
1646
  }
1703
1647
  catch (err) {
1704
- manager.logger?.log?.(`Error checking spread condition: ${(0, errors_1.getErrorMessage)(err)}`, 'error');
1648
+ manager.logger?.log?.(`Error checking spread condition: ${getErrorMessage(err)}`, 'error');
1705
1649
  // Track failure in recovery state for external monitoring.
1706
1650
  // Do NOT throw — the startup runtime path lacks a try/catch and
1707
1651
  // a throw would crash startup. The error is symptom of a deeper
@@ -1732,7 +1676,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1732
1676
  // Refresh lastPrice from current grid state — the grid may
1733
1677
  // have changed since function entry (TOCTOU).
1734
1678
  const freshOnChain = _getOnChainOrders(manager);
1735
- const freshBest = (0, math_1.getGridBestPrices)(freshOnChain.onChainBuys, freshOnChain.onChainSells);
1679
+ const freshBest = getGridBestPrices(freshOnChain.onChainBuys, freshOnChain.onChainSells);
1736
1680
  const freshPrice = (freshBest.bestBuy !== null && freshBest.bestSell !== null)
1737
1681
  ? (freshBest.bestBuy + freshBest.bestSell) / 2
1738
1682
  : Number(manager.config.startPrice) || 0;
@@ -1766,7 +1710,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1766
1710
  return { ordersPlaced: placed + updated, partialsMoved: updated };
1767
1711
  }
1768
1712
  catch (err) {
1769
- manager.logger?.log?.(`Error applying spread correction on-chain: ${(0, errors_1.getErrorMessage)(err)}`, 'warn');
1713
+ manager.logger?.log?.(`Error applying spread correction on-chain: ${getErrorMessage(err)}`, 'warn');
1770
1714
  return { ordersPlaced: 0, partialsMoved: 0 };
1771
1715
  }
1772
1716
  }
@@ -1785,7 +1729,7 @@ async function checkSpreadCondition(manager, _BitShares, updateOrdersOnChainBatc
1785
1729
  * @param {Function|null} [updateOrdersOnChainBatch=null] - Optional batch update function.
1786
1730
  * @returns {Promise<import('./types').DustCheckResult>}
1787
1731
  */
1788
- async function checkGridHealth(manager, _updateOrdersOnChainBatch = null) {
1732
+ export async function checkGridHealth(manager, _updateOrdersOnChainBatch = null) {
1789
1733
  if (!manager)
1790
1734
  return { buyDust: false, sellDust: false, buyDustOrders: [], sellDustOrders: [] };
1791
1735
  // Skip health checks during bootstrap to prevent spamming warnings
@@ -1811,25 +1755,25 @@ async function checkGridHealth(manager, _updateOrdersOnChainBatch = null) {
1811
1755
  * the sibling active order already covers that price level.
1812
1756
  *
1813
1757
  * Returns boolean flags plus the actual dust order objects so callers can act
1814
- * on individual orders (e.g. DUST_CANCEL_DELAY_SEC auto-cancel).
1758
+ * on individual orders (dust is cancelled immediately on detection).
1815
1759
  *
1816
1760
  * @param {import('./types').OrderManager} manager
1817
1761
  * @returns {Promise<import('./types').DustCheckResult>}
1818
1762
  */
1819
- async function checkWindowDust(manager) {
1763
+ export async function checkWindowDust(manager) {
1820
1764
  if (!manager)
1821
1765
  return { buyDust: false, sellDust: false, buyDustOrders: [], sellDustOrders: [] };
1822
1766
  const allOrders = Array.from(manager.orders.values());
1823
1767
  const isLiveOrder = (order) => order &&
1824
1768
  order.orderId &&
1825
1769
  order.price != null &&
1826
- (order.state === constants_1.ORDER_STATES.ACTIVE || order.state === constants_1.ORDER_STATES.PARTIAL);
1770
+ (order.state === ORDER_STATES.ACTIVE || order.state === ORDER_STATES.PARTIAL);
1827
1771
  // Identify top-of-window orders (closest to market per side).
1828
1772
  const topBuyOrder = allOrders
1829
- .filter((o) => o.type === constants_1.ORDER_TYPES.BUY && isLiveOrder(o))
1773
+ .filter((o) => o.type === ORDER_TYPES.BUY && isLiveOrder(o))
1830
1774
  .sort((a, b) => b.price - a.price)[0];
1831
1775
  const topSellOrder = allOrders
1832
- .filter((o) => o.type === constants_1.ORDER_TYPES.SELL && isLiveOrder(o))
1776
+ .filter((o) => o.type === ORDER_TYPES.SELL && isLiveOrder(o))
1833
1777
  .sort((a, b) => a.price - b.price)[0];
1834
1778
  // Check if an order has a duplicate price level — an active sibling at the
1835
1779
  // same price within tolerance. If so, cancelling won't create a grid gap.
@@ -1837,17 +1781,17 @@ async function checkWindowDust(manager) {
1837
1781
  // sibling, neither qualifies and the gap is left to the rebalancer.
1838
1782
  // Uses the LARGER size of the two orders for tolerance calculation to prevent
1839
1783
  // a tiny dust order from inflating the tolerance window.
1840
- const hasDuplicatePriceLevel = (order, assets) => (0, math_1.findPriceCollision)(allOrders, order.id, order.price, order.size, order.type, assets, (o) => o.type === order.type && o.state === constants_1.ORDER_STATES.ACTIVE && !!o.orderId && o.price != null) != null;
1784
+ const hasDuplicatePriceLevel = (order, assets) => findPriceCollision(allOrders, order.id, order.price, order.size, order.type, assets, (o) => o.type === order.type && o.state === ORDER_STATES.ACTIVE && !!o.orderId && o.price != null) != null;
1841
1785
  const assets = manager.assets;
1842
- const allPartials = allOrders.filter((o) => isLiveOrder(o) && o.state === constants_1.ORDER_STATES.PARTIAL);
1786
+ const allPartials = allOrders.filter((o) => isLiveOrder(o) && o.state === ORDER_STATES.PARTIAL);
1843
1787
  const isTopBuy = (o) => topBuyOrder && o.id === topBuyOrder.id;
1844
1788
  const isTopSell = (o) => topSellOrder && o.id === topSellOrder.id;
1845
1789
  // Safety filter: top-of-window partials always qualify; interior partials
1846
1790
  // only qualify if they have a duplicate price level (no gap risk).
1847
- const eligibleBuyPartials = allPartials.filter((o) => o.type === constants_1.ORDER_TYPES.BUY && (isTopBuy(o) || hasDuplicatePriceLevel(o, assets)));
1848
- const eligibleSellPartials = allPartials.filter((o) => o.type === constants_1.ORDER_TYPES.SELL && (isTopSell(o) || hasDuplicatePriceLevel(o, assets)));
1849
- const buyDustOrders = await _getDustOrders(manager, eligibleBuyPartials, constants_1.ORDER_TYPES.BUY);
1850
- const sellDustOrders = await _getDustOrders(manager, eligibleSellPartials, constants_1.ORDER_TYPES.SELL);
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);
1851
1795
  return {
1852
1796
  buyDust: buyDustOrders.length > 0,
1853
1797
  sellDust: sellDustOrders.length > 0,
@@ -1868,7 +1812,7 @@ async function checkWindowDust(manager) {
1868
1812
  async function _getDustOrders(manager, partials, type) {
1869
1813
  if (!partials || partials.length === 0)
1870
1814
  return [];
1871
- const side = type === constants_1.ORDER_TYPES.BUY ? 'buy' : 'sell';
1815
+ const side = type === ORDER_TYPES.BUY ? 'buy' : 'sell';
1872
1816
  const ctx = await _getSizingContext(manager, side);
1873
1817
  const dustThresholdPercent = manager.config?.gridLimits?.PARTIAL_DUST_THRESHOLD_PERCENTAGE;
1874
1818
  const sideSlots = Array.from(manager.orders.values())
@@ -1877,7 +1821,7 @@ async function _getDustOrders(manager, partials, type) {
1877
1821
  if (sideSlots.length === 0)
1878
1822
  return [];
1879
1823
  const idealSizes = ctx && ctx.budget > 0
1880
- ? (0, math_1.allocateFundsByWeights)(ctx.budget, sideSlots.length, manager.config.weightDistribution[side], manager.config.incrementPercent / 100, type === constants_1.ORDER_TYPES.BUY, 0, ctx.precision)
1824
+ ? allocateFundsByWeights(ctx.budget, sideSlots.length, manager.config.weightDistribution[side], manager.config.incrementPercent / 100, type === ORDER_TYPES.BUY, 0, ctx.precision)
1881
1825
  : [];
1882
1826
  // When no budget is available, idealSizes becomes [] so every
1883
1827
  // partial's threshold collapses to 0 — no order qualifies as dust.
@@ -1888,7 +1832,7 @@ async function _getDustOrders(manager, partials, type) {
1888
1832
  if (idx === -1)
1889
1833
  return false;
1890
1834
  const threshold = idealSizes.length > idx && idealSizes[idx] > 0
1891
- ? (0, math_1.getSingleDustThreshold)(idealSizes[idx], dustThresholdPercent)
1835
+ ? getSingleDustThreshold(idealSizes[idx], dustThresholdPercent)
1892
1836
  : 0;
1893
1837
  return p.size < threshold;
1894
1838
  });
@@ -1911,8 +1855,8 @@ async function _hasAnyDust(manager, partials, type) {
1911
1855
  * @param {'buy'|'sell'} side
1912
1856
  * @returns {Promise<boolean>}
1913
1857
  */
1914
- async function hasAnyDust(manager, partials, side) {
1915
- const type = side === 'buy' ? constants_1.ORDER_TYPES.BUY : side === 'sell' ? constants_1.ORDER_TYPES.SELL : null;
1858
+ export async function hasAnyDust(manager, partials, side) {
1859
+ const type = side === 'buy' ? ORDER_TYPES.BUY : side === 'sell' ? ORDER_TYPES.SELL : null;
1916
1860
  if (!type)
1917
1861
  return false;
1918
1862
  return await _hasAnyDust(manager, partials, type);
@@ -1925,8 +1869,8 @@ async function hasAnyDust(manager, partials, side) {
1925
1869
  * @param {'buy'|'sell'} side
1926
1870
  * @returns {Promise<Array<import('./types').GridOrderSlot>>}
1927
1871
  */
1928
- async function getDustOrders(manager, partials, side) {
1929
- const type = side === 'buy' ? constants_1.ORDER_TYPES.BUY : side === 'sell' ? constants_1.ORDER_TYPES.SELL : null;
1872
+ export async function getDustOrders(manager, partials, side) {
1873
+ const type = side === 'buy' ? ORDER_TYPES.BUY : side === 'sell' ? ORDER_TYPES.SELL : null;
1930
1874
  if (!type)
1931
1875
  return [];
1932
1876
  return await _getDustOrders(manager, partials, type);
@@ -1938,7 +1882,7 @@ async function getDustOrders(manager, partials, side) {
1938
1882
  * normalize sell-side funds into buy-side units for a fair cross-asset comparison.
1939
1883
  * @returns {{ side: import('./types').OrderType|null, reason: string }} The side to correct on, or null if insufficient funds.
1940
1884
  */
1941
- function determineOrderSideByFunds(manager, currentMarketPrice) {
1885
+ export function determineOrderSideByFunds(manager, currentMarketPrice) {
1942
1886
  const buyAvailable = Math.min(Number(manager.funds?.available?.buy || 0), Number(manager.accountTotals?.buyFree || 0));
1943
1887
  const sellAvailable = Math.min(Number(manager.funds?.available?.sell || 0), Number(manager.accountTotals?.sellFree || 0));
1944
1888
  // Need at least some funds on a side to justify correction
@@ -1960,13 +1904,13 @@ function determineOrderSideByFunds(manager, currentMarketPrice) {
1960
1904
  const sellInBuyUnits = (Number.isFinite(marketPrice) && marketPrice > 0)
1961
1905
  ? sellAvailable * marketPrice
1962
1906
  : sellAvailable;
1963
- side = buyAvailable >= sellInBuyUnits ? constants_1.ORDER_TYPES.BUY : constants_1.ORDER_TYPES.SELL;
1907
+ side = buyAvailable >= sellInBuyUnits ? ORDER_TYPES.BUY : ORDER_TYPES.SELL;
1964
1908
  }
1965
1909
  else if (buyViable) {
1966
- side = constants_1.ORDER_TYPES.BUY;
1910
+ side = ORDER_TYPES.BUY;
1967
1911
  }
1968
1912
  else if (sellViable) {
1969
- side = constants_1.ORDER_TYPES.SELL;
1913
+ side = ORDER_TYPES.SELL;
1970
1914
  }
1971
1915
  if (!side) {
1972
1916
  const committedBuy = Math.max(0, Number(manager.funds?.committed?.chain?.buy || 0));
@@ -1977,17 +1921,17 @@ function determineOrderSideByFunds(manager, currentMarketPrice) {
1977
1921
  if (hasValidPrice) {
1978
1922
  const buyComparable = committedBuy;
1979
1923
  const sellComparable = committedSell * marketPrice;
1980
- side = buyComparable >= sellComparable ? constants_1.ORDER_TYPES.BUY : constants_1.ORDER_TYPES.SELL;
1924
+ side = buyComparable >= sellComparable ? ORDER_TYPES.BUY : ORDER_TYPES.SELL;
1981
1925
  }
1982
1926
  else if (committedBuy > buyMinUnit && committedSell <= sellMinUnit) {
1983
- side = constants_1.ORDER_TYPES.BUY;
1927
+ side = ORDER_TYPES.BUY;
1984
1928
  }
1985
1929
  else if (committedSell > sellMinUnit && committedBuy <= buyMinUnit) {
1986
- side = constants_1.ORDER_TYPES.SELL;
1930
+ side = ORDER_TYPES.SELL;
1987
1931
  }
1988
1932
  else {
1989
1933
  // Deterministic fallback when both sides hold inventory but market valuation is unavailable.
1990
- side = constants_1.ORDER_TYPES.BUY;
1934
+ side = ORDER_TYPES.BUY;
1991
1935
  }
1992
1936
  manager.logger?.log?.(`Spread correction using redistribution fallback on ${side} ` +
1993
1937
  `(free buy=${Format.formatAmount8(buyAvailable)}, free sell=${Format.formatAmount8(sellAvailable)}, ` +
@@ -2014,7 +1958,7 @@ function determineOrderSideByFunds(manager, currentMarketPrice) {
2014
1958
  // the band, so this cap only binds when the opposite rail is smaller than the
2015
1959
  // band — i.e. an empty opposite rail (cap 0) blocks promotion entirely.
2016
1960
  function _collectPromotableBoundarySlots(allSlotsByPrice, railType, buyEndIdx, sellStartIdx, quota) {
2017
- const isBuy = railType === constants_1.ORDER_TYPES.BUY;
1961
+ const isBuy = railType === ORDER_TYPES.BUY;
2018
1962
  const maxIdx = allSlotsByPrice.length - 1;
2019
1963
  const maxPromotable = isBuy
2020
1964
  ? Math.max(0, maxIdx + 1 - sellStartIdx)
@@ -2024,7 +1968,7 @@ function _collectPromotableBoundarySlots(allSlotsByPrice, railType, buyEndIdx, s
2024
1968
  const step = isBuy ? 1 : -1;
2025
1969
  for (let idx = isBuy ? buyEndIdx + 1 : sellStartIdx - 1; promoted.length < promotionQuota && (isBuy ? idx < sellStartIdx : idx > buyEndIdx); idx += step) {
2026
1970
  const slot = allSlotsByPrice[idx];
2027
- if (!slot || !(0, order_1.isSlotAvailable)(slot))
1971
+ if (!slot || !isSlotAvailable(slot))
2028
1972
  break;
2029
1973
  promoted.push(slot);
2030
1974
  }
@@ -2037,15 +1981,15 @@ function _collectPromotableBoundarySlots(allSlotsByPrice, railType, buyEndIdx, s
2037
1981
  * @returns {Promise<import('./types').SpreadCorrectionResult>}
2038
1982
  * @throws {Error} If preferredSide is invalid.
2039
1983
  */
2040
- async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread = 0) {
1984
+ export async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread = 0) {
2041
1985
  // FIX: Validate preferredSide parameter to prevent silent logic errors
2042
- if (preferredSide !== constants_1.ORDER_TYPES.BUY && preferredSide !== constants_1.ORDER_TYPES.SELL) {
2043
- throw new Error(`Invalid preferredSide: ${preferredSide}. Must be '${constants_1.ORDER_TYPES.BUY}' or '${constants_1.ORDER_TYPES.SELL}'.`);
1986
+ if (preferredSide !== ORDER_TYPES.BUY && preferredSide !== ORDER_TYPES.SELL) {
1987
+ throw new Error(`Invalid preferredSide: ${preferredSide}. Must be '${ORDER_TYPES.BUY}' or '${ORDER_TYPES.SELL}'.`);
2044
1988
  }
2045
1989
  const ordersToPlace = [];
2046
1990
  const ordersToUpdate = [];
2047
1991
  const railType = preferredSide;
2048
- const sideName = railType === constants_1.ORDER_TYPES.BUY ? 'buy' : 'sell';
1992
+ const sideName = railType === ORDER_TYPES.BUY ? 'buy' : 'sell';
2049
1993
  const configuredMissingSlots = Number(outOfSpread || 0);
2050
1994
  const missingSlots = configuredMissingSlots > 0
2051
1995
  ? Math.floor(configuredMissingSlots)
@@ -2074,7 +2018,7 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2074
2018
  // spread correction cycle will re-classify with the updated committed value.
2075
2019
  // This prevents TOCTOU-style inconsistency where slot types are chosen
2076
2020
  // against a boundary that was never atomically committed to manager.orders.
2077
- const resolved = (0, math_1.resolveGapBand)(manager);
2021
+ const resolved = resolveGapBand(manager);
2078
2022
  const gapSlots = resolved.gapSlots;
2079
2023
  const boundaryKnown = resolved.boundaryIdx !== null && resolved.sellStartIdx !== null;
2080
2024
  // NOTE: `?? 0` keeps the legacy classification fallback (boundary not
@@ -2083,22 +2027,22 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2083
2027
  // `boundaryKnown` below: deriving a new boundary from a fabricated 0 would
2084
2028
  // silently commit a boundary that was never real.
2085
2029
  const buyEndIdx = resolved.boundaryIdx ?? 0;
2086
- const sellStartIdx = resolved.sellStartIdx ?? (0, math_1.getSellStartIdx)(buyEndIdx, gapSlots);
2030
+ const sellStartIdx = resolved.sellStartIdx ?? getSellStartIdx(buyEndIdx, gapSlots);
2087
2031
  const getSlotCorrectType = (slot) => {
2088
2032
  const idx = slotIndexMap.get(slot.id);
2089
2033
  if (idx === undefined)
2090
2034
  return slot.type;
2091
2035
  if (idx <= buyEndIdx)
2092
- return constants_1.ORDER_TYPES.BUY;
2036
+ return ORDER_TYPES.BUY;
2093
2037
  if (idx >= sellStartIdx)
2094
- return constants_1.ORDER_TYPES.SELL;
2095
- return constants_1.ORDER_TYPES.SPREAD;
2038
+ return ORDER_TYPES.SELL;
2039
+ return ORDER_TYPES.SPREAD;
2096
2040
  };
2097
2041
  let edgePartial = null;
2098
2042
  const partials = allOrders
2099
2043
  .filter((o) => getSlotCorrectType(o) === railType
2100
- && o.state === constants_1.ORDER_STATES.PARTIAL)
2101
- .sort((a, b) => railType === constants_1.ORDER_TYPES.BUY ? b.price - a.price : a.price - b.price);
2044
+ && o.state === ORDER_STATES.PARTIAL)
2045
+ .sort((a, b) => railType === ORDER_TYPES.BUY ? b.price - a.price : a.price - b.price);
2102
2046
  if (partials.length > 0) {
2103
2047
  edgePartial = partials[0];
2104
2048
  manager.logger?.log?.(`[SPREAD-CORRECTION] Identified partial order at ${edgePartial.price} for update`, 'debug');
@@ -2108,10 +2052,10 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2108
2052
  // in the BUY or SELL zone is excluded — it would otherwise be placed on the
2109
2053
  // correction side at a price the grid already considers the opposite side.
2110
2054
  const typedSpreadCandidates = allOrders
2111
- .filter((o) => o.type === constants_1.ORDER_TYPES.SPREAD
2112
- && (0, order_1.isSlotAvailable)(o)
2055
+ .filter((o) => o.type === ORDER_TYPES.SPREAD
2056
+ && isSlotAvailable(o)
2113
2057
  && getSlotCorrectType(o) === railType)
2114
- .sort((a, b) => railType === constants_1.ORDER_TYPES.BUY ? a.price - b.price : b.price - a.price)
2058
+ .sort((a, b) => railType === ORDER_TYPES.BUY ? a.price - b.price : b.price - a.price)
2115
2059
  .slice(0, missingSlots);
2116
2060
  // Secondary candidates: orphaned virtual slots that have lost their
2117
2061
  // order (e.g. stale-cleaned after a race condition during a crash).
@@ -2126,12 +2070,12 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2126
2070
  // NOT re-activated on the stale side — doing so would compound inventory
2127
2071
  // at prices where the bot already traded.
2128
2072
  const orphanedVirtualCandidates = allOrders
2129
- .filter((o) => (o.type === railType || o.type === constants_1.ORDER_TYPES.SPREAD)
2130
- && o.state === constants_1.ORDER_STATES.VIRTUAL
2073
+ .filter((o) => (o.type === railType || o.type === ORDER_TYPES.SPREAD)
2074
+ && o.state === ORDER_STATES.VIRTUAL
2131
2075
  && !o.orderId
2132
2076
  && Number(o.size || 0) === 0
2133
2077
  && getSlotCorrectType(o) === railType)
2134
- .sort((a, b) => railType === constants_1.ORDER_TYPES.BUY ? b.price - a.price : a.price - b.price)
2078
+ .sort((a, b) => railType === ORDER_TYPES.BUY ? b.price - a.price : a.price - b.price)
2135
2079
  .slice(0, missingSlots);
2136
2080
  // If the funded rail is full, the spread itself may be stale: the
2137
2081
  // nearest empty slots are still in the gap band. Promote contiguous
@@ -2185,8 +2129,8 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2185
2129
  return false;
2186
2130
  // Resolve candidate size: if zero/missing, use minimum so tolerance
2187
2131
  // doesn't collapse to zero (calculatePriceTolerance returns null for size <= 0).
2188
- const cs = (c.size && c.size > 0) ? c.size : (0, math_1.getMinAbsoluteOrderSize)(railType, manager.assets);
2189
- return !(0, math_1.findPriceCollision)(allOrders, c.id, c.price, cs, railType, manager.assets, (o) => (0, order_1.isOrderPlaced)(o) && o.price != null);
2132
+ const cs = (c.size && c.size > 0) ? c.size : getMinAbsoluteOrderSize(railType, manager.assets);
2133
+ return !findPriceCollision(allOrders, c.id, c.price, cs, railType, manager.assets, (o) => isOrderPlaced(o) && o.price != null);
2190
2134
  });
2191
2135
  const filteredCount = preFilter - spreadCandidates.length;
2192
2136
  if (filteredCount > 0) {
@@ -2212,14 +2156,14 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2212
2156
  if (!ctx || ctx.budget <= 0 || syntheticSideSlots.length === 0) {
2213
2157
  return { ordersToPlace: [], ordersToUpdate: [] };
2214
2158
  }
2215
- const precisionEpsilon = (0, math_1.getPrecisionSlack)(ctx.precision, 1);
2216
- const idealSizes = (0, math_1.allocateFundsByWeights)(ctx.budget, syntheticSideSlots.length, manager.config.weightDistribution[sideName], manager.config.incrementPercent / 100, railType === constants_1.ORDER_TYPES.BUY, 0, ctx.precision);
2159
+ const precisionEpsilon = getPrecisionSlack(ctx.precision, 1);
2160
+ const idealSizes = allocateFundsByWeights(ctx.budget, syntheticSideSlots.length, manager.config.weightDistribution[sideName], manager.config.incrementPercent / 100, railType === ORDER_TYPES.BUY, 0, ctx.precision);
2217
2161
  const idealById = new Map();
2218
2162
  syntheticSideSlots.forEach((slot, idx) => {
2219
2163
  idealById.set(slot.id, Number(idealSizes[idx] || 0));
2220
2164
  });
2221
2165
  const availableFund = Math.max(0, Math.min(Number(manager.funds?.available?.[sideName] || 0), Number(sideName === 'buy' ? manager.accountTotals?.buyFree : manager.accountTotals?.sellFree) || 0));
2222
- const minAbsoluteSize = (0, math_1.getMinAbsoluteOrderSize)(railType, manager.assets);
2166
+ const minAbsoluteSize = getMinAbsoluteOrderSize(railType, manager.assets);
2223
2167
  const prioritizedTargets = [];
2224
2168
  if (edgePartial && edgePartial.id) {
2225
2169
  const ideal = Number(idealById.get(edgePartial.id) || 0);
@@ -2255,9 +2199,9 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2255
2199
  if (totalNeeded > availableFund + precisionEpsilon) {
2256
2200
  let shortfall = totalNeeded - availableFund;
2257
2201
  const donors = sideSlots
2258
- .filter((o) => (0, order_1.hasOnChainId)(o) && (o.state === constants_1.ORDER_STATES.ACTIVE || o.state === constants_1.ORDER_STATES.PARTIAL))
2202
+ .filter((o) => hasOnChainId(o) && (o.state === ORDER_STATES.ACTIVE || o.state === ORDER_STATES.PARTIAL))
2259
2203
  .filter((o) => !edgePartial || o.id !== edgePartial.id)
2260
- .sort((a, b) => railType === constants_1.ORDER_TYPES.BUY ? a.price - b.price : b.price - a.price);
2204
+ .sort((a, b) => railType === ORDER_TYPES.BUY ? a.price - b.price : b.price - a.price);
2261
2205
  for (const donor of donors) {
2262
2206
  if (shortfall <= precisionEpsilon)
2263
2207
  break;
@@ -2271,7 +2215,7 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2271
2215
  const donorNext = donorCurrent - reduction;
2272
2216
  if (donorNext <= precisionEpsilon)
2273
2217
  continue;
2274
- if (!(0, order_1.isOrderHealthy)(donorNext, railType, manager.assets, donorIdeal || donorNext))
2218
+ if (!isOrderHealthy(donorNext, railType, manager.assets, donorIdeal || donorNext))
2275
2219
  continue;
2276
2220
  redistributionUpdates.push({ partialOrder: { ...donor }, newSize: donorNext });
2277
2221
  recoveredBudget += reduction;
@@ -2288,7 +2232,7 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2288
2232
  if (target.kind === 'partial-topup') {
2289
2233
  const topUp = Math.min(target.needed, remainingBudget);
2290
2234
  const newSize = target.current + topUp;
2291
- if (newSize > target.current + precisionEpsilon && (0, order_1.isOrderHealthy)(newSize, railType, manager.assets, target.ideal)) {
2235
+ if (newSize > target.current + precisionEpsilon && isOrderHealthy(newSize, railType, manager.assets, target.ideal)) {
2292
2236
  ordersToUpdate.push({ partialOrder: { ...target.order }, newSize });
2293
2237
  remainingBudget -= topUp;
2294
2238
  }
@@ -2297,13 +2241,13 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2297
2241
  const createSize = Math.min(target.ideal, remainingBudget);
2298
2242
  if (createSize <= precisionEpsilon)
2299
2243
  continue;
2300
- if (!(0, order_1.isOrderHealthy)(createSize, railType, manager.assets, target.ideal))
2244
+ if (!isOrderHealthy(createSize, railType, manager.assets, target.ideal))
2301
2245
  continue;
2302
2246
  ordersToPlace.push({
2303
2247
  ...target.order,
2304
2248
  type: railType,
2305
2249
  size: createSize,
2306
- state: constants_1.ORDER_STATES.VIRTUAL
2250
+ state: ORDER_STATES.VIRTUAL
2307
2251
  });
2308
2252
  remainingBudget -= createSize;
2309
2253
  }
@@ -2320,14 +2264,14 @@ async function prepareSpreadCorrectionOrders(manager, preferredSide, outOfSpread
2320
2264
  const idx = slotIndexMap.get(id);
2321
2265
  if (idx === undefined)
2322
2266
  continue;
2323
- const dist = railType === constants_1.ORDER_TYPES.BUY
2267
+ const dist = railType === ORDER_TYPES.BUY
2324
2268
  ? idx - buyEndIdx
2325
2269
  : sellStartIdx - idx;
2326
2270
  if (dist > maxDist)
2327
2271
  maxDist = dist;
2328
2272
  }
2329
2273
  if (maxDist > 0) {
2330
- boundaryIdx = railType === constants_1.ORDER_TYPES.BUY
2274
+ boundaryIdx = railType === ORDER_TYPES.BUY
2331
2275
  ? buyEndIdx + maxDist
2332
2276
  : buyEndIdx - maxDist;
2333
2277
  const maxIdx = allSlotsByPrice.length - 1;