dexbot 1.1.10

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 (807) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/claw/README.md +513 -0
  4. package/claw/scripts/memu_runner.py +385 -0
  5. package/claw/skills/bitshares-guide/SKILL.md +14 -0
  6. package/claw/skills/bitshares-guide/references/example-skill-shells.md +18 -0
  7. package/claw/skills/bitshares-guide/references/presentation-patterns.md +19 -0
  8. package/claw/skills/bitshares-guide/references/scope-guardrails.md +9 -0
  9. package/claw/skills/launcher-ops/SKILL.md +18 -0
  10. package/claw/skills/launcher-ops/references/launcher-workflow.md +23 -0
  11. package/claw/skills/margin-trading/SKILL.md +23 -0
  12. package/claw/skills/margin-trading/references/honest-asset-list.md +74 -0
  13. package/claw/skills/margin-trading/references/honest-assets.md +44 -0
  14. package/claw/skills/margin-trading/references/position-management.md +203 -0
  15. package/claw/skills/margin-trading/references/trading-concepts.md +80 -0
  16. package/claw/skills/memu-memory/SKILL.md +218 -0
  17. package/claw/skills/shared/references/js-automation-overview.md +24 -0
  18. package/claw/skills/shared/references/safety-and-staleness.md +11 -0
  19. package/claw/skills/shared/references/skill-boundaries.md +17 -0
  20. package/claw/skills/trend-detection/SKILL.md +33 -0
  21. package/claw/skills/trend-detection/agents/openai.yaml +3 -0
  22. package/claw/skills/trend-detection/references/service.md +45 -0
  23. package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts +3 -0
  24. package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts.map +1 -0
  25. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +149 -0
  26. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -0
  27. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts +3 -0
  28. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts.map +1 -0
  29. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +387 -0
  30. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -0
  31. package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts +3 -0
  32. package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts.map +1 -0
  33. package/dist/analysis/ama_fitting/calibrate_convergence_er.js +200 -0
  34. package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -0
  35. package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts +3 -0
  36. package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts.map +1 -0
  37. package/dist/analysis/ama_fitting/fetch_lp_candles.js +212 -0
  38. package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -0
  39. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +31 -0
  40. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -0
  41. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +249 -0
  42. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -0
  43. package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts +2 -0
  44. package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -0
  45. package/dist/analysis/ama_fitting/optimizer_high_resolution.js +782 -0
  46. package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -0
  47. package/dist/analysis/analyze_derivatives.d.ts +95 -0
  48. package/dist/analysis/analyze_derivatives.d.ts.map +1 -0
  49. package/dist/analysis/analyze_derivatives.js +295 -0
  50. package/dist/analysis/analyze_derivatives.js.map +1 -0
  51. package/dist/analysis/analyze_dynamic_weight.d.ts +14 -0
  52. package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -0
  53. package/dist/analysis/analyze_dynamic_weight.js +208 -0
  54. package/dist/analysis/analyze_dynamic_weight.js.map +1 -0
  55. package/dist/analysis/analyze_kalman.d.ts +13 -0
  56. package/dist/analysis/analyze_kalman.d.ts.map +1 -0
  57. package/dist/analysis/analyze_kalman.js +123 -0
  58. package/dist/analysis/analyze_kalman.js.map +1 -0
  59. package/dist/analysis/analyze_regime.d.ts +20 -0
  60. package/dist/analysis/analyze_regime.d.ts.map +1 -0
  61. package/dist/analysis/analyze_regime.js +139 -0
  62. package/dist/analysis/analyze_regime.js.map +1 -0
  63. package/dist/analysis/analyze_regime_windows.d.ts +19 -0
  64. package/dist/analysis/analyze_regime_windows.d.ts.map +1 -0
  65. package/dist/analysis/analyze_regime_windows.js +413 -0
  66. package/dist/analysis/analyze_regime_windows.js.map +1 -0
  67. package/dist/analysis/analyze_risk_profile.d.ts +3 -0
  68. package/dist/analysis/analyze_risk_profile.d.ts.map +1 -0
  69. package/dist/analysis/analyze_risk_profile.js +159 -0
  70. package/dist/analysis/analyze_risk_profile.js.map +1 -0
  71. package/dist/analysis/analyze_trade_heatmap.d.ts +3 -0
  72. package/dist/analysis/analyze_trade_heatmap.d.ts.map +1 -0
  73. package/dist/analysis/analyze_trade_heatmap.js +367 -0
  74. package/dist/analysis/analyze_trade_heatmap.js.map +1 -0
  75. package/dist/analysis/analyze_volatility.d.ts +22 -0
  76. package/dist/analysis/analyze_volatility.d.ts.map +1 -0
  77. package/dist/analysis/analyze_volatility.js +172 -0
  78. package/dist/analysis/analyze_volatility.js.map +1 -0
  79. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +99 -0
  80. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -0
  81. package/dist/analysis/bot_fitting/backtest_ama_sweep.js +804 -0
  82. package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -0
  83. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +2 -0
  84. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -0
  85. package/dist/analysis/bot_fitting/backtest_bot_fitting.js +347 -0
  86. package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -0
  87. package/dist/analysis/bot_fitting/shared_utils.d.ts +15 -0
  88. package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -0
  89. package/dist/analysis/bot_fitting/shared_utils.js +48 -0
  90. package/dist/analysis/bot_fitting/shared_utils.js.map +1 -0
  91. package/dist/analysis/bot_key_utils.d.ts +16 -0
  92. package/dist/analysis/bot_key_utils.d.ts.map +1 -0
  93. package/dist/analysis/bot_key_utils.js +61 -0
  94. package/dist/analysis/bot_key_utils.js.map +1 -0
  95. package/dist/analysis/bot_usage/discover_bot_accounts.d.ts +3 -0
  96. package/dist/analysis/bot_usage/discover_bot_accounts.d.ts.map +1 -0
  97. package/dist/analysis/bot_usage/discover_bot_accounts.js +498 -0
  98. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -0
  99. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +546 -0
  100. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -0
  101. package/dist/analysis/bot_usage/kibana_bot_queries.js +427 -0
  102. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -0
  103. package/dist/analysis/chart_utils.d.ts +13 -0
  104. package/dist/analysis/chart_utils.d.ts.map +1 -0
  105. package/dist/analysis/chart_utils.js +142 -0
  106. package/dist/analysis/chart_utils.js.map +1 -0
  107. package/dist/analysis/derivative_chart_generator.d.ts +18 -0
  108. package/dist/analysis/derivative_chart_generator.d.ts.map +1 -0
  109. package/dist/analysis/derivative_chart_generator.js +896 -0
  110. package/dist/analysis/derivative_chart_generator.js.map +1 -0
  111. package/dist/analysis/math_utils.d.ts +35 -0
  112. package/dist/analysis/math_utils.d.ts.map +1 -0
  113. package/dist/analysis/math_utils.js +121 -0
  114. package/dist/analysis/math_utils.js.map +1 -0
  115. package/dist/analysis/price_sources.d.ts +34 -0
  116. package/dist/analysis/price_sources.d.ts.map +1 -0
  117. package/dist/analysis/price_sources.js +103 -0
  118. package/dist/analysis/price_sources.js.map +1 -0
  119. package/dist/analysis/trade_profitability.d.ts +115 -0
  120. package/dist/analysis/trade_profitability.d.ts.map +1 -0
  121. package/dist/analysis/trade_profitability.js +1247 -0
  122. package/dist/analysis/trade_profitability.js.map +1 -0
  123. package/dist/analysis/tradingview/analyze_tradingview.d.ts +38 -0
  124. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -0
  125. package/dist/analysis/tradingview/analyze_tradingview.js +212 -0
  126. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -0
  127. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +9 -0
  128. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -0
  129. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1717 -0
  130. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -0
  131. package/dist/analysis/trend_detection/derivative_analyzer.d.ts +250 -0
  132. package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -0
  133. package/dist/analysis/trend_detection/derivative_analyzer.js +903 -0
  134. package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -0
  135. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts +6 -0
  136. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -0
  137. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +1449 -0
  138. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -0
  139. package/dist/analysis/trend_detection/hurst_analyzer.d.ts +42 -0
  140. package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -0
  141. package/dist/analysis/trend_detection/hurst_analyzer.js +159 -0
  142. package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -0
  143. package/dist/analysis/trend_detection/kalman_chart_generator.d.ts +6 -0
  144. package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -0
  145. package/dist/analysis/trend_detection/kalman_chart_generator.js +408 -0
  146. package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -0
  147. package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts +103 -0
  148. package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +1 -0
  149. package/dist/analysis/trend_detection/kalman_trend_analyzer.js +229 -0
  150. package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -0
  151. package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts +34 -0
  152. package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +1 -0
  153. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +89 -0
  154. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -0
  155. package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts +39 -0
  156. package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +1 -0
  157. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +132 -0
  158. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -0
  159. package/dist/analysis/trend_detection/regime_chart_generator.d.ts +6 -0
  160. package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -0
  161. package/dist/analysis/trend_detection/regime_chart_generator.js +345 -0
  162. package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -0
  163. package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts +2 -0
  164. package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts.map +1 -0
  165. package/dist/analysis/trend_detection/tests/test_kalman_trend.js +130 -0
  166. package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -0
  167. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts +2 -0
  168. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts.map +1 -0
  169. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +38 -0
  170. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -0
  171. package/dist/analysis/trend_detection/volatility_chart_generator.d.ts +6 -0
  172. package/dist/analysis/trend_detection/volatility_chart_generator.d.ts.map +1 -0
  173. package/dist/analysis/trend_detection/volatility_chart_generator.js +732 -0
  174. package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -0
  175. package/dist/bot.d.ts +49 -0
  176. package/dist/bot.d.ts.map +1 -0
  177. package/dist/bot.js +221 -0
  178. package/dist/bot.js.map +1 -0
  179. package/dist/credential-daemon.d.ts +64 -0
  180. package/dist/credential-daemon.d.ts.map +1 -0
  181. package/dist/credential-daemon.js +987 -0
  182. package/dist/credential-daemon.js.map +1 -0
  183. package/dist/dexbot.d.ts +87 -0
  184. package/dist/dexbot.d.ts.map +1 -0
  185. package/dist/dexbot.js +1222 -0
  186. package/dist/dexbot.js.map +1 -0
  187. package/dist/market_adapter/ama_signal_runner.d.ts +3 -0
  188. package/dist/market_adapter/ama_signal_runner.d.ts.map +1 -0
  189. package/dist/market_adapter/ama_signal_runner.js +175 -0
  190. package/dist/market_adapter/ama_signal_runner.js.map +1 -0
  191. package/dist/market_adapter/candle_utils.d.ts +57 -0
  192. package/dist/market_adapter/candle_utils.d.ts.map +1 -0
  193. package/dist/market_adapter/candle_utils.js +252 -0
  194. package/dist/market_adapter/candle_utils.js.map +1 -0
  195. package/dist/market_adapter/core/asymmetric_bounds.d.ts +20 -0
  196. package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -0
  197. package/dist/market_adapter/core/asymmetric_bounds.js +88 -0
  198. package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -0
  199. package/dist/market_adapter/core/config_normalizers.d.ts +10 -0
  200. package/dist/market_adapter/core/config_normalizers.d.ts.map +1 -0
  201. package/dist/market_adapter/core/config_normalizers.js +24 -0
  202. package/dist/market_adapter/core/config_normalizers.js.map +1 -0
  203. package/dist/market_adapter/core/kibana_candles.d.ts +74 -0
  204. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -0
  205. package/dist/market_adapter/core/kibana_candles.js +249 -0
  206. package/dist/market_adapter/core/kibana_candles.js.map +1 -0
  207. package/dist/market_adapter/core/kibana_client.d.ts +27 -0
  208. package/dist/market_adapter/core/kibana_client.d.ts.map +1 -0
  209. package/dist/market_adapter/core/kibana_client.js +120 -0
  210. package/dist/market_adapter/core/kibana_client.js.map +1 -0
  211. package/dist/market_adapter/core/kibana_market_candles.d.ts +143 -0
  212. package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -0
  213. package/dist/market_adapter/core/kibana_market_candles.js +170 -0
  214. package/dist/market_adapter/core/kibana_market_candles.js.map +1 -0
  215. package/dist/market_adapter/core/market_adapter_service.d.ts +210 -0
  216. package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -0
  217. package/dist/market_adapter/core/market_adapter_service.js +2328 -0
  218. package/dist/market_adapter/core/market_adapter_service.js.map +1 -0
  219. package/dist/market_adapter/core/strategies/ama.d.ts +2 -0
  220. package/dist/market_adapter/core/strategies/ama.d.ts.map +1 -0
  221. package/dist/market_adapter/core/strategies/ama.js +138 -0
  222. package/dist/market_adapter/core/strategies/ama.js.map +1 -0
  223. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +50 -0
  224. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -0
  225. package/dist/market_adapter/core/strategies/ama_slope_model.js +143 -0
  226. package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -0
  227. package/dist/market_adapter/core/strategies/atr/calculator.d.ts +12 -0
  228. package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -0
  229. package/dist/market_adapter/core/strategies/atr/calculator.js +47 -0
  230. package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -0
  231. package/dist/market_adapter/core/strategies/collateral_manager.d.ts +32 -0
  232. package/dist/market_adapter/core/strategies/collateral_manager.d.ts.map +1 -0
  233. package/dist/market_adapter/core/strategies/collateral_manager.js +68 -0
  234. package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -0
  235. package/dist/market_adapter/core/strategies/regime_gate.d.ts +66 -0
  236. package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -0
  237. package/dist/market_adapter/core/strategies/regime_gate.js +189 -0
  238. package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -0
  239. package/dist/market_adapter/index.d.ts +10 -0
  240. package/dist/market_adapter/index.d.ts.map +1 -0
  241. package/dist/market_adapter/index.js +71 -0
  242. package/dist/market_adapter/index.js.map +1 -0
  243. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts +3 -0
  244. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts.map +1 -0
  245. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1165 -0
  246. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -0
  247. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +54 -0
  248. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -0
  249. package/dist/market_adapter/inputs/fetch_lp_data.js +743 -0
  250. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -0
  251. package/dist/market_adapter/inputs/kibana_source.d.ts +68 -0
  252. package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -0
  253. package/dist/market_adapter/inputs/kibana_source.js +143 -0
  254. package/dist/market_adapter/inputs/kibana_source.js.map +1 -0
  255. package/dist/market_adapter/interval_utils.d.ts +6 -0
  256. package/dist/market_adapter/interval_utils.d.ts.map +1 -0
  257. package/dist/market_adapter/interval_utils.js +14 -0
  258. package/dist/market_adapter/interval_utils.js.map +1 -0
  259. package/dist/market_adapter/log_format.d.ts +16 -0
  260. package/dist/market_adapter/log_format.d.ts.map +1 -0
  261. package/dist/market_adapter/log_format.js +72 -0
  262. package/dist/market_adapter/log_format.js.map +1 -0
  263. package/dist/market_adapter/lp_chart_core.d.ts +6 -0
  264. package/dist/market_adapter/lp_chart_core.d.ts.map +1 -0
  265. package/dist/market_adapter/lp_chart_core.js +874 -0
  266. package/dist/market_adapter/lp_chart_core.js.map +1 -0
  267. package/dist/market_adapter/lp_chart_runner.d.ts +135 -0
  268. package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -0
  269. package/dist/market_adapter/lp_chart_runner.js +337 -0
  270. package/dist/market_adapter/lp_chart_runner.js.map +1 -0
  271. package/dist/market_adapter/lp_chart_strategy_loader.d.ts +23 -0
  272. package/dist/market_adapter/lp_chart_strategy_loader.d.ts.map +1 -0
  273. package/dist/market_adapter/lp_chart_strategy_loader.js +169 -0
  274. package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -0
  275. package/dist/market_adapter/market_adapter.d.ts +133 -0
  276. package/dist/market_adapter/market_adapter.d.ts.map +1 -0
  277. package/dist/market_adapter/market_adapter.js +1331 -0
  278. package/dist/market_adapter/market_adapter.js.map +1 -0
  279. package/dist/market_adapter/merge_lp_data.d.ts +3 -0
  280. package/dist/market_adapter/merge_lp_data.d.ts.map +1 -0
  281. package/dist/market_adapter/merge_lp_data.js +125 -0
  282. package/dist/market_adapter/merge_lp_data.js.map +1 -0
  283. package/dist/market_adapter/test_helpers.d.ts +14 -0
  284. package/dist/market_adapter/test_helpers.d.ts.map +1 -0
  285. package/dist/market_adapter/test_helpers.js +22 -0
  286. package/dist/market_adapter/test_helpers.js.map +1 -0
  287. package/dist/market_adapter/utils/adapter_client.d.ts +20 -0
  288. package/dist/market_adapter/utils/adapter_client.d.ts.map +1 -0
  289. package/dist/market_adapter/utils/adapter_client.js +88 -0
  290. package/dist/market_adapter/utils/adapter_client.js.map +1 -0
  291. package/dist/market_adapter/utils/atomic_write.d.ts +9 -0
  292. package/dist/market_adapter/utils/atomic_write.d.ts.map +1 -0
  293. package/dist/market_adapter/utils/atomic_write.js +13 -0
  294. package/dist/market_adapter/utils/atomic_write.js.map +1 -0
  295. package/dist/market_adapter/utils/chain.d.ts +50 -0
  296. package/dist/market_adapter/utils/chain.d.ts.map +1 -0
  297. package/dist/market_adapter/utils/chain.js +196 -0
  298. package/dist/market_adapter/utils/chain.js.map +1 -0
  299. package/dist/market_adapter/utils/data_discovery.d.ts +6 -0
  300. package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -0
  301. package/dist/market_adapter/utils/data_discovery.js +35 -0
  302. package/dist/market_adapter/utils/data_discovery.js.map +1 -0
  303. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts +15 -0
  304. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -0
  305. package/dist/market_adapter/utils/dynamic_grid_snapshot.js +60 -0
  306. package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -0
  307. package/dist/market_adapter/utils/file_lock.d.ts +19 -0
  308. package/dist/market_adapter/utils/file_lock.d.ts.map +1 -0
  309. package/dist/market_adapter/utils/file_lock.js +191 -0
  310. package/dist/market_adapter/utils/file_lock.js.map +1 -0
  311. package/dist/market_adapter/utils/native_history.d.ts +19 -0
  312. package/dist/market_adapter/utils/native_history.d.ts.map +1 -0
  313. package/dist/market_adapter/utils/native_history.js +172 -0
  314. package/dist/market_adapter/utils/native_history.js.map +1 -0
  315. package/dist/market_adapter/utils/paths.d.ts +5 -0
  316. package/dist/market_adapter/utils/paths.d.ts.map +1 -0
  317. package/dist/market_adapter/utils/paths.js +7 -0
  318. package/dist/market_adapter/utils/paths.js.map +1 -0
  319. package/dist/modules/account_bots.d.ts +112 -0
  320. package/dist/modules/account_bots.d.ts.map +1 -0
  321. package/dist/modules/account_bots.js +1259 -0
  322. package/dist/modules/account_bots.js.map +1 -0
  323. package/dist/modules/account_orders.d.ts +273 -0
  324. package/dist/modules/account_orders.d.ts.map +1 -0
  325. package/dist/modules/account_orders.js +662 -0
  326. package/dist/modules/account_orders.js.map +1 -0
  327. package/dist/modules/authority_resolver.d.ts +2 -0
  328. package/dist/modules/authority_resolver.d.ts.map +1 -0
  329. package/dist/modules/authority_resolver.js +231 -0
  330. package/dist/modules/authority_resolver.js.map +1 -0
  331. package/dist/modules/bitshares-native/chain_client.d.ts +38 -0
  332. package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -0
  333. package/dist/modules/bitshares-native/chain_client.js +322 -0
  334. package/dist/modules/bitshares-native/chain_client.js.map +1 -0
  335. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts +59 -0
  336. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -0
  337. package/dist/modules/bitshares-native/crypto/ecc.browser.js +456 -0
  338. package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -0
  339. package/dist/modules/bitshares-native/crypto/ecc.d.ts +66 -0
  340. package/dist/modules/bitshares-native/crypto/ecc.d.ts.map +1 -0
  341. package/dist/modules/bitshares-native/crypto/ecc.js +557 -0
  342. package/dist/modules/bitshares-native/crypto/ecc.js.map +1 -0
  343. package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts +2 -0
  344. package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts.map +1 -0
  345. package/dist/modules/bitshares-native/crypto/ecc_selector.js +20 -0
  346. package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -0
  347. package/dist/modules/bitshares-native/index.d.ts +3 -0
  348. package/dist/modules/bitshares-native/index.d.ts.map +1 -0
  349. package/dist/modules/bitshares-native/index.js +32 -0
  350. package/dist/modules/bitshares-native/index.js.map +1 -0
  351. package/dist/modules/bitshares-native/resolvers.d.ts +40 -0
  352. package/dist/modules/bitshares-native/resolvers.d.ts.map +1 -0
  353. package/dist/modules/bitshares-native/resolvers.js +161 -0
  354. package/dist/modules/bitshares-native/resolvers.js.map +1 -0
  355. package/dist/modules/bitshares-native/serial/chain_constants.d.ts +56 -0
  356. package/dist/modules/bitshares-native/serial/chain_constants.d.ts.map +1 -0
  357. package/dist/modules/bitshares-native/serial/chain_constants.js +92 -0
  358. package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -0
  359. package/dist/modules/bitshares-native/serial/index.d.ts +10 -0
  360. package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -0
  361. package/dist/modules/bitshares-native/serial/index.js +14 -0
  362. package/dist/modules/bitshares-native/serial/index.js.map +1 -0
  363. package/dist/modules/bitshares-native/serial/operations.d.ts +102 -0
  364. package/dist/modules/bitshares-native/serial/operations.d.ts.map +1 -0
  365. package/dist/modules/bitshares-native/serial/operations.js +615 -0
  366. package/dist/modules/bitshares-native/serial/operations.js.map +1 -0
  367. package/dist/modules/bitshares-native/serial/serializer.d.ts +64 -0
  368. package/dist/modules/bitshares-native/serial/serializer.d.ts.map +1 -0
  369. package/dist/modules/bitshares-native/serial/serializer.js +252 -0
  370. package/dist/modules/bitshares-native/serial/serializer.js.map +1 -0
  371. package/dist/modules/bitshares-native/serial/types.d.ts +120 -0
  372. package/dist/modules/bitshares-native/serial/types.d.ts.map +1 -0
  373. package/dist/modules/bitshares-native/serial/types.js +837 -0
  374. package/dist/modules/bitshares-native/serial/types.js.map +1 -0
  375. package/dist/modules/bitshares-native/signing_client.d.ts +6 -0
  376. package/dist/modules/bitshares-native/signing_client.d.ts.map +1 -0
  377. package/dist/modules/bitshares-native/signing_client.js +141 -0
  378. package/dist/modules/bitshares-native/signing_client.js.map +1 -0
  379. package/dist/modules/bitshares-native/subscriptions.d.ts +6 -0
  380. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -0
  381. package/dist/modules/bitshares-native/subscriptions.js +865 -0
  382. package/dist/modules/bitshares-native/subscriptions.js.map +1 -0
  383. package/dist/modules/bitshares-native/transport.d.ts +51 -0
  384. package/dist/modules/bitshares-native/transport.d.ts.map +1 -0
  385. package/dist/modules/bitshares-native/transport.js +447 -0
  386. package/dist/modules/bitshares-native/transport.js.map +1 -0
  387. package/dist/modules/bitshares-native/tx/builder.d.ts +30 -0
  388. package/dist/modules/bitshares-native/tx/builder.d.ts.map +1 -0
  389. package/dist/modules/bitshares-native/tx/builder.js +262 -0
  390. package/dist/modules/bitshares-native/tx/builder.js.map +1 -0
  391. package/dist/modules/bitshares_client.d.ts +129 -0
  392. package/dist/modules/bitshares_client.d.ts.map +1 -0
  393. package/dist/modules/bitshares_client.js +627 -0
  394. package/dist/modules/bitshares_client.js.map +1 -0
  395. package/dist/modules/bot_settings.d.ts +33 -0
  396. package/dist/modules/bot_settings.d.ts.map +1 -0
  397. package/dist/modules/bot_settings.js +328 -0
  398. package/dist/modules/bot_settings.js.map +1 -0
  399. package/dist/modules/bots_file_lock.d.ts +88 -0
  400. package/dist/modules/bots_file_lock.d.ts.map +1 -0
  401. package/dist/modules/bots_file_lock.js +161 -0
  402. package/dist/modules/bots_file_lock.js.map +1 -0
  403. package/dist/modules/chain_keys.d.ts +302 -0
  404. package/dist/modules/chain_keys.d.ts.map +1 -0
  405. package/dist/modules/chain_keys.js +1095 -0
  406. package/dist/modules/chain_keys.js.map +1 -0
  407. package/dist/modules/chain_orders.d.ts +423 -0
  408. package/dist/modules/chain_orders.d.ts.map +1 -0
  409. package/dist/modules/chain_orders.js +1201 -0
  410. package/dist/modules/chain_orders.js.map +1 -0
  411. package/dist/modules/cli_whitelist_args.d.ts +6 -0
  412. package/dist/modules/cli_whitelist_args.d.ts.map +1 -0
  413. package/dist/modules/cli_whitelist_args.js +13 -0
  414. package/dist/modules/cli_whitelist_args.js.map +1 -0
  415. package/dist/modules/config.d.ts +57 -0
  416. package/dist/modules/config.d.ts.map +1 -0
  417. package/dist/modules/config.js +107 -0
  418. package/dist/modules/config.js.map +1 -0
  419. package/dist/modules/constants.d.ts +635 -0
  420. package/dist/modules/constants.d.ts.map +1 -0
  421. package/dist/modules/constants.js +1464 -0
  422. package/dist/modules/constants.js.map +1 -0
  423. package/dist/modules/cr_planner.d.ts +51 -0
  424. package/dist/modules/cr_planner.d.ts.map +1 -0
  425. package/dist/modules/cr_planner.js +299 -0
  426. package/dist/modules/cr_planner.js.map +1 -0
  427. package/dist/modules/credential_policy.d.ts +188 -0
  428. package/dist/modules/credential_policy.d.ts.map +1 -0
  429. package/dist/modules/credential_policy.js +1452 -0
  430. package/dist/modules/credential_policy.js.map +1 -0
  431. package/dist/modules/credential_runtime.d.ts +42 -0
  432. package/dist/modules/credential_runtime.d.ts.map +1 -0
  433. package/dist/modules/credential_runtime.js +148 -0
  434. package/dist/modules/credential_runtime.js.map +1 -0
  435. package/dist/modules/credential_session_cache.d.ts +36 -0
  436. package/dist/modules/credential_session_cache.d.ts.map +1 -0
  437. package/dist/modules/credential_session_cache.js +106 -0
  438. package/dist/modules/credential_session_cache.js.map +1 -0
  439. package/dist/modules/credit_runtime.d.ts +412 -0
  440. package/dist/modules/credit_runtime.d.ts.map +1 -0
  441. package/dist/modules/credit_runtime.js +2866 -0
  442. package/dist/modules/credit_runtime.js.map +1 -0
  443. package/dist/modules/crypto/browser_provider.d.ts +15 -0
  444. package/dist/modules/crypto/browser_provider.d.ts.map +1 -0
  445. package/dist/modules/crypto/browser_provider.js +113 -0
  446. package/dist/modules/crypto/browser_provider.js.map +1 -0
  447. package/dist/modules/crypto/index.d.ts +9 -0
  448. package/dist/modules/crypto/index.d.ts.map +1 -0
  449. package/dist/modules/crypto/index.js +44 -0
  450. package/dist/modules/crypto/index.js.map +1 -0
  451. package/dist/modules/crypto/node_provider.d.ts +15 -0
  452. package/dist/modules/crypto/node_provider.d.ts.map +1 -0
  453. package/dist/modules/crypto/node_provider.js +74 -0
  454. package/dist/modules/crypto/node_provider.js.map +1 -0
  455. package/dist/modules/crypto/provider.d.ts +34 -0
  456. package/dist/modules/crypto/provider.d.ts.map +1 -0
  457. package/dist/modules/crypto/provider.js +3 -0
  458. package/dist/modules/crypto/provider.js.map +1 -0
  459. package/dist/modules/crypto/pure_ripemd160.d.ts +8 -0
  460. package/dist/modules/crypto/pure_ripemd160.d.ts.map +1 -0
  461. package/dist/modules/crypto/pure_ripemd160.js +142 -0
  462. package/dist/modules/crypto/pure_ripemd160.js.map +1 -0
  463. package/dist/modules/crypto/pure_scrypt.d.ts +23 -0
  464. package/dist/modules/crypto/pure_scrypt.d.ts.map +1 -0
  465. package/dist/modules/crypto/pure_scrypt.js +161 -0
  466. package/dist/modules/crypto/pure_scrypt.js.map +1 -0
  467. package/dist/modules/crypto/pure_secp256k1.d.ts +29 -0
  468. package/dist/modules/crypto/pure_secp256k1.d.ts.map +1 -0
  469. package/dist/modules/crypto/pure_secp256k1.js +195 -0
  470. package/dist/modules/crypto/pure_secp256k1.js.map +1 -0
  471. package/dist/modules/crypto/sync.d.ts +13 -0
  472. package/dist/modules/crypto/sync.d.ts.map +1 -0
  473. package/dist/modules/crypto/sync.js +37 -0
  474. package/dist/modules/crypto/sync.js.map +1 -0
  475. package/dist/modules/dexbot_class.d.ts +1074 -0
  476. package/dist/modules/dexbot_class.d.ts.map +1 -0
  477. package/dist/modules/dexbot_class.js +4613 -0
  478. package/dist/modules/dexbot_class.js.map +1 -0
  479. package/dist/modules/dexbot_credential_client.d.ts +71 -0
  480. package/dist/modules/dexbot_credential_client.d.ts.map +1 -0
  481. package/dist/modules/dexbot_credential_client.js +224 -0
  482. package/dist/modules/dexbot_credential_client.js.map +1 -0
  483. package/dist/modules/dexbot_fill_runtime.d.ts +173 -0
  484. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -0
  485. package/dist/modules/dexbot_fill_runtime.js +217 -0
  486. package/dist/modules/dexbot_fill_runtime.js.map +1 -0
  487. package/dist/modules/dexbot_maintenance_runtime.d.ts +279 -0
  488. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -0
  489. package/dist/modules/dexbot_maintenance_runtime.js +1613 -0
  490. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -0
  491. package/dist/modules/env.d.ts +12 -0
  492. package/dist/modules/env.d.ts.map +1 -0
  493. package/dist/modules/env.js +57 -0
  494. package/dist/modules/env.js.map +1 -0
  495. package/dist/modules/fund_registry.d.ts +96 -0
  496. package/dist/modules/fund_registry.d.ts.map +1 -0
  497. package/dist/modules/fund_registry.js +261 -0
  498. package/dist/modules/fund_registry.js.map +1 -0
  499. package/dist/modules/general_settings.d.ts +36 -0
  500. package/dist/modules/general_settings.d.ts.map +1 -0
  501. package/dist/modules/general_settings.js +63 -0
  502. package/dist/modules/general_settings.js.map +1 -0
  503. package/dist/modules/graceful_shutdown.d.ts +86 -0
  504. package/dist/modules/graceful_shutdown.d.ts.map +1 -0
  505. package/dist/modules/graceful_shutdown.js +164 -0
  506. package/dist/modules/graceful_shutdown.js.map +1 -0
  507. package/dist/modules/key_store.d.ts +60 -0
  508. package/dist/modules/key_store.d.ts.map +1 -0
  509. package/dist/modules/key_store.js +215 -0
  510. package/dist/modules/key_store.js.map +1 -0
  511. package/dist/modules/launcher/bot_supervisor.d.ts +84 -0
  512. package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -0
  513. package/dist/modules/launcher/bot_supervisor.js +1067 -0
  514. package/dist/modules/launcher/bot_supervisor.js.map +1 -0
  515. package/dist/modules/launcher/child_env.d.ts +9 -0
  516. package/dist/modules/launcher/child_env.d.ts.map +1 -0
  517. package/dist/modules/launcher/child_env.js +78 -0
  518. package/dist/modules/launcher/child_env.js.map +1 -0
  519. package/dist/modules/launcher/credential_bootstrap.d.ts +22 -0
  520. package/dist/modules/launcher/credential_bootstrap.d.ts.map +1 -0
  521. package/dist/modules/launcher/credential_bootstrap.js +303 -0
  522. package/dist/modules/launcher/credential_bootstrap.js.map +1 -0
  523. package/dist/modules/launcher/credential_daemon.d.ts +32 -0
  524. package/dist/modules/launcher/credential_daemon.d.ts.map +1 -0
  525. package/dist/modules/launcher/credential_daemon.js +173 -0
  526. package/dist/modules/launcher/credential_daemon.js.map +1 -0
  527. package/dist/modules/launcher/credential_secret.d.ts +6 -0
  528. package/dist/modules/launcher/credential_secret.d.ts.map +1 -0
  529. package/dist/modules/launcher/credential_secret.js +15 -0
  530. package/dist/modules/launcher/credential_secret.js.map +1 -0
  531. package/dist/modules/launcher/foreign_cred_daemon.d.ts +2 -0
  532. package/dist/modules/launcher/foreign_cred_daemon.d.ts.map +1 -0
  533. package/dist/modules/launcher/foreign_cred_daemon.js +166 -0
  534. package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -0
  535. package/dist/modules/launcher/headless_password.d.ts +8 -0
  536. package/dist/modules/launcher/headless_password.d.ts.map +1 -0
  537. package/dist/modules/launcher/headless_password.js +33 -0
  538. package/dist/modules/launcher/headless_password.js.map +1 -0
  539. package/dist/modules/launcher/launch_modes.d.ts +36 -0
  540. package/dist/modules/launcher/launch_modes.d.ts.map +1 -0
  541. package/dist/modules/launcher/launch_modes.js +129 -0
  542. package/dist/modules/launcher/launch_modes.js.map +1 -0
  543. package/dist/modules/launcher/market_adapter_runtime.d.ts +43 -0
  544. package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -0
  545. package/dist/modules/launcher/market_adapter_runtime.js +217 -0
  546. package/dist/modules/launcher/market_adapter_runtime.js.map +1 -0
  547. package/dist/modules/launcher/market_adapter_watchdog.d.ts +26 -0
  548. package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -0
  549. package/dist/modules/launcher/market_adapter_watchdog.js +214 -0
  550. package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -0
  551. package/dist/modules/launcher/monolithic_runtime.d.ts +89 -0
  552. package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -0
  553. package/dist/modules/launcher/monolithic_runtime.js +425 -0
  554. package/dist/modules/launcher/monolithic_runtime.js.map +1 -0
  555. package/dist/modules/launcher/runtime_entry.d.ts +26 -0
  556. package/dist/modules/launcher/runtime_entry.d.ts.map +1 -0
  557. package/dist/modules/launcher/runtime_entry.js +49 -0
  558. package/dist/modules/launcher/runtime_entry.js.map +1 -0
  559. package/dist/modules/launcher/status_reporting.d.ts +48 -0
  560. package/dist/modules/launcher/status_reporting.d.ts.map +1 -0
  561. package/dist/modules/launcher/status_reporting.js +113 -0
  562. package/dist/modules/launcher/status_reporting.js.map +1 -0
  563. package/dist/modules/launcher/supervisor_control.d.ts +6 -0
  564. package/dist/modules/launcher/supervisor_control.d.ts.map +1 -0
  565. package/dist/modules/launcher/supervisor_control.js +59 -0
  566. package/dist/modules/launcher/supervisor_control.js.map +1 -0
  567. package/dist/modules/logger.d.ts +2 -0
  568. package/dist/modules/logger.d.ts.map +1 -0
  569. package/dist/modules/logger.js +71 -0
  570. package/dist/modules/logger.js.map +1 -0
  571. package/dist/modules/market_adapter_whitelist.d.ts +22 -0
  572. package/dist/modules/market_adapter_whitelist.d.ts.map +1 -0
  573. package/dist/modules/market_adapter_whitelist.js +82 -0
  574. package/dist/modules/market_adapter_whitelist.js.map +1 -0
  575. package/dist/modules/node_health_cache.d.ts +55 -0
  576. package/dist/modules/node_health_cache.d.ts.map +1 -0
  577. package/dist/modules/node_health_cache.js +134 -0
  578. package/dist/modules/node_health_cache.js.map +1 -0
  579. package/dist/modules/node_manager.d.ts +215 -0
  580. package/dist/modules/node_manager.d.ts.map +1 -0
  581. package/dist/modules/node_manager.js +628 -0
  582. package/dist/modules/node_manager.js.map +1 -0
  583. package/dist/modules/order/accounting.d.ts +349 -0
  584. package/dist/modules/order/accounting.d.ts.map +1 -0
  585. package/dist/modules/order/accounting.js +1191 -0
  586. package/dist/modules/order/accounting.js.map +1 -0
  587. package/dist/modules/order/async_lock.d.ts +126 -0
  588. package/dist/modules/order/async_lock.d.ts.map +1 -0
  589. package/dist/modules/order/async_lock.js +195 -0
  590. package/dist/modules/order/async_lock.js.map +1 -0
  591. package/dist/modules/order/export.d.ts +129 -0
  592. package/dist/modules/order/export.d.ts.map +1 -0
  593. package/dist/modules/order/export.js +316 -0
  594. package/dist/modules/order/export.js.map +1 -0
  595. package/dist/modules/order/format.d.ts +158 -0
  596. package/dist/modules/order/format.d.ts.map +1 -0
  597. package/dist/modules/order/format.js +232 -0
  598. package/dist/modules/order/format.js.map +1 -0
  599. package/dist/modules/order/grid.d.ts +549 -0
  600. package/dist/modules/order/grid.d.ts.map +1 -0
  601. package/dist/modules/order/grid.js +1746 -0
  602. package/dist/modules/order/grid.js.map +1 -0
  603. package/dist/modules/order/grid_reconcile.d.ts +154 -0
  604. package/dist/modules/order/grid_reconcile.d.ts.map +1 -0
  605. package/dist/modules/order/grid_reconcile.js +1192 -0
  606. package/dist/modules/order/grid_reconcile.js.map +1 -0
  607. package/dist/modules/order/index.d.ts +55 -0
  608. package/dist/modules/order/index.d.ts.map +1 -0
  609. package/dist/modules/order/index.js +79 -0
  610. package/dist/modules/order/index.js.map +1 -0
  611. package/dist/modules/order/logger.d.ts +136 -0
  612. package/dist/modules/order/logger.d.ts.map +1 -0
  613. package/dist/modules/order/logger.js +614 -0
  614. package/dist/modules/order/logger.js.map +1 -0
  615. package/dist/modules/order/logger_state.d.ts +133 -0
  616. package/dist/modules/order/logger_state.d.ts.map +1 -0
  617. package/dist/modules/order/logger_state.js +170 -0
  618. package/dist/modules/order/logger_state.js.map +1 -0
  619. package/dist/modules/order/manager.d.ts +413 -0
  620. package/dist/modules/order/manager.d.ts.map +1 -0
  621. package/dist/modules/order/manager.js +1605 -0
  622. package/dist/modules/order/manager.js.map +1 -0
  623. package/dist/modules/order/processed_fill_store.d.ts +135 -0
  624. package/dist/modules/order/processed_fill_store.d.ts.map +1 -0
  625. package/dist/modules/order/processed_fill_store.js +288 -0
  626. package/dist/modules/order/processed_fill_store.js.map +1 -0
  627. package/dist/modules/order/runner.d.ts +70 -0
  628. package/dist/modules/order/runner.d.ts.map +1 -0
  629. package/dist/modules/order/runner.js +140 -0
  630. package/dist/modules/order/runner.js.map +1 -0
  631. package/dist/modules/order/strategy.d.ts +196 -0
  632. package/dist/modules/order/strategy.d.ts.map +1 -0
  633. package/dist/modules/order/strategy.js +398 -0
  634. package/dist/modules/order/strategy.js.map +1 -0
  635. package/dist/modules/order/sync_engine.d.ts +386 -0
  636. package/dist/modules/order/sync_engine.d.ts.map +1 -0
  637. package/dist/modules/order/sync_engine.js +1459 -0
  638. package/dist/modules/order/sync_engine.js.map +1 -0
  639. package/dist/modules/order/utils/math.d.ts +677 -0
  640. package/dist/modules/order/utils/math.d.ts.map +1 -0
  641. package/dist/modules/order/utils/math.js +1172 -0
  642. package/dist/modules/order/utils/math.js.map +1 -0
  643. package/dist/modules/order/utils/order.d.ts +572 -0
  644. package/dist/modules/order/utils/order.d.ts.map +1 -0
  645. package/dist/modules/order/utils/order.js +1145 -0
  646. package/dist/modules/order/utils/order.js.map +1 -0
  647. package/dist/modules/order/utils/system.d.ts +268 -0
  648. package/dist/modules/order/utils/system.d.ts.map +1 -0
  649. package/dist/modules/order/utils/system.js +1261 -0
  650. package/dist/modules/order/utils/system.js.map +1 -0
  651. package/dist/modules/order/utils/validate.d.ts +280 -0
  652. package/dist/modules/order/utils/validate.d.ts.map +1 -0
  653. package/dist/modules/order/utils/validate.js +918 -0
  654. package/dist/modules/order/utils/validate.js.map +1 -0
  655. package/dist/modules/order/working_grid.d.ts +212 -0
  656. package/dist/modules/order/working_grid.d.ts.map +1 -0
  657. package/dist/modules/order/working_grid.js +279 -0
  658. package/dist/modules/order/working_grid.js.map +1 -0
  659. package/dist/modules/path_api.d.ts +32 -0
  660. package/dist/modules/path_api.d.ts.map +1 -0
  661. package/dist/modules/path_api.js +148 -0
  662. package/dist/modules/path_api.js.map +1 -0
  663. package/dist/modules/paths.d.ts +58 -0
  664. package/dist/modules/paths.d.ts.map +1 -0
  665. package/dist/modules/paths.js +82 -0
  666. package/dist/modules/paths.js.map +1 -0
  667. package/dist/modules/process_discovery.d.ts +58 -0
  668. package/dist/modules/process_discovery.d.ts.map +1 -0
  669. package/dist/modules/process_discovery.js +265 -0
  670. package/dist/modules/process_discovery.js.map +1 -0
  671. package/dist/modules/runtime.d.ts +34 -0
  672. package/dist/modules/runtime.d.ts.map +1 -0
  673. package/dist/modules/runtime.js +98 -0
  674. package/dist/modules/runtime.js.map +1 -0
  675. package/dist/modules/runtime_settings.d.ts +12 -0
  676. package/dist/modules/runtime_settings.d.ts.map +1 -0
  677. package/dist/modules/runtime_settings.js +122 -0
  678. package/dist/modules/runtime_settings.js.map +1 -0
  679. package/dist/modules/settings_merge.d.ts +38 -0
  680. package/dist/modules/settings_merge.d.ts.map +1 -0
  681. package/dist/modules/settings_merge.js +246 -0
  682. package/dist/modules/settings_merge.js.map +1 -0
  683. package/dist/modules/storage/browser_adapter.d.ts +56 -0
  684. package/dist/modules/storage/browser_adapter.d.ts.map +1 -0
  685. package/dist/modules/storage/browser_adapter.js +231 -0
  686. package/dist/modules/storage/browser_adapter.js.map +1 -0
  687. package/dist/modules/storage/index.d.ts +28 -0
  688. package/dist/modules/storage/index.d.ts.map +1 -0
  689. package/dist/modules/storage/index.js +52 -0
  690. package/dist/modules/storage/index.js.map +1 -0
  691. package/dist/modules/storage/node_adapter.d.ts +49 -0
  692. package/dist/modules/storage/node_adapter.d.ts.map +1 -0
  693. package/dist/modules/storage/node_adapter.js +167 -0
  694. package/dist/modules/storage/node_adapter.js.map +1 -0
  695. package/dist/modules/storage/types.d.ts +92 -0
  696. package/dist/modules/storage/types.d.ts.map +1 -0
  697. package/dist/modules/storage/types.js +3 -0
  698. package/dist/modules/storage/types.js.map +1 -0
  699. package/dist/modules/types.d.ts +1382 -0
  700. package/dist/modules/types.d.ts.map +1 -0
  701. package/dist/modules/types.js +11 -0
  702. package/dist/modules/types.js.map +1 -0
  703. package/dist/modules/utils/base58check.d.ts +12 -0
  704. package/dist/modules/utils/base58check.d.ts.map +1 -0
  705. package/dist/modules/utils/base58check.js +112 -0
  706. package/dist/modules/utils/base58check.js.map +1 -0
  707. package/dist/modules/utils/build_dir.d.ts +7 -0
  708. package/dist/modules/utils/build_dir.d.ts.map +1 -0
  709. package/dist/modules/utils/build_dir.js +8 -0
  710. package/dist/modules/utils/build_dir.js.map +1 -0
  711. package/dist/modules/utils/fs_utils.d.ts +25 -0
  712. package/dist/modules/utils/fs_utils.d.ts.map +1 -0
  713. package/dist/modules/utils/fs_utils.js +27 -0
  714. package/dist/modules/utils/fs_utils.js.map +1 -0
  715. package/dist/modules/utils/math_utils.d.ts +10 -0
  716. package/dist/modules/utils/math_utils.d.ts.map +1 -0
  717. package/dist/modules/utils/math_utils.js +17 -0
  718. package/dist/modules/utils/math_utils.js.map +1 -0
  719. package/dist/modules/validate_profiles.d.ts +37 -0
  720. package/dist/modules/validate_profiles.d.ts.map +1 -0
  721. package/dist/modules/validate_profiles.js +369 -0
  722. package/dist/modules/validate_profiles.js.map +1 -0
  723. package/dist/pm2.d.ts +167 -0
  724. package/dist/pm2.d.ts.map +1 -0
  725. package/dist/pm2.js +998 -0
  726. package/dist/pm2.js.map +1 -0
  727. package/dist/scripts/analyze-git.d.ts +11 -0
  728. package/dist/scripts/analyze-git.d.ts.map +1 -0
  729. package/dist/scripts/analyze-git.js +851 -0
  730. package/dist/scripts/analyze-git.js.map +1 -0
  731. package/dist/scripts/analyze-orders.d.ts +17 -0
  732. package/dist/scripts/analyze-orders.d.ts.map +1 -0
  733. package/dist/scripts/analyze-orders.js +1568 -0
  734. package/dist/scripts/analyze-orders.js.map +1 -0
  735. package/dist/scripts/diagnose-kibana-candles.d.ts +3 -0
  736. package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -0
  737. package/dist/scripts/diagnose-kibana-candles.js +82 -0
  738. package/dist/scripts/diagnose-kibana-candles.js.map +1 -0
  739. package/dist/scripts/diagnose-pool-history.d.ts +3 -0
  740. package/dist/scripts/diagnose-pool-history.d.ts.map +1 -0
  741. package/dist/scripts/diagnose-pool-history.js +296 -0
  742. package/dist/scripts/diagnose-pool-history.js.map +1 -0
  743. package/dist/scripts/divergence-calc.d.ts +26 -0
  744. package/dist/scripts/divergence-calc.d.ts.map +1 -0
  745. package/dist/scripts/divergence-calc.js +119 -0
  746. package/dist/scripts/divergence-calc.js.map +1 -0
  747. package/dist/scripts/generate_lp_chart.d.ts +31 -0
  748. package/dist/scripts/generate_lp_chart.d.ts.map +1 -0
  749. package/dist/scripts/generate_lp_chart.js +92 -0
  750. package/dist/scripts/generate_lp_chart.js.map +1 -0
  751. package/dist/scripts/generate_mainnet_corpus_report.d.ts +24 -0
  752. package/dist/scripts/generate_mainnet_corpus_report.d.ts.map +1 -0
  753. package/dist/scripts/generate_mainnet_corpus_report.js +237 -0
  754. package/dist/scripts/generate_mainnet_corpus_report.js.map +1 -0
  755. package/dist/scripts/generate_market_adapter_whitelist.d.ts +2 -0
  756. package/dist/scripts/generate_market_adapter_whitelist.d.ts.map +1 -0
  757. package/dist/scripts/generate_market_adapter_whitelist.js +111 -0
  758. package/dist/scripts/generate_market_adapter_whitelist.js.map +1 -0
  759. package/dist/scripts/migrate_bot_keys.d.ts +6 -0
  760. package/dist/scripts/migrate_bot_keys.d.ts.map +1 -0
  761. package/dist/scripts/migrate_bot_keys.js +301 -0
  762. package/dist/scripts/migrate_bot_keys.js.map +1 -0
  763. package/dist/scripts/native_release_gates.d.ts +3 -0
  764. package/dist/scripts/native_release_gates.d.ts.map +1 -0
  765. package/dist/scripts/native_release_gates.js +52 -0
  766. package/dist/scripts/native_release_gates.js.map +1 -0
  767. package/dist/scripts/print_grid.d.ts +16 -0
  768. package/dist/scripts/print_grid.d.ts.map +1 -0
  769. package/dist/scripts/print_grid.js +80 -0
  770. package/dist/scripts/print_grid.js.map +1 -0
  771. package/dist/scripts/run-tests.d.ts +2 -0
  772. package/dist/scripts/run-tests.d.ts.map +1 -0
  773. package/dist/scripts/run-tests.js +49 -0
  774. package/dist/scripts/run-tests.js.map +1 -0
  775. package/dist/scripts/sync-version.d.ts +14 -0
  776. package/dist/scripts/sync-version.d.ts.map +1 -0
  777. package/dist/scripts/sync-version.js +158 -0
  778. package/dist/scripts/sync-version.js.map +1 -0
  779. package/dist/scripts/test-credit-renewal.d.ts +2 -0
  780. package/dist/scripts/test-credit-renewal.d.ts.map +1 -0
  781. package/dist/scripts/test-credit-renewal.js +329 -0
  782. package/dist/scripts/test-credit-renewal.js.map +1 -0
  783. package/dist/scripts/update.d.ts +24 -0
  784. package/dist/scripts/update.d.ts.map +1 -0
  785. package/dist/scripts/update.js +650 -0
  786. package/dist/scripts/update.js.map +1 -0
  787. package/dist/scripts/validate_bots.d.ts +16 -0
  788. package/dist/scripts/validate_bots.d.ts.map +1 -0
  789. package/dist/scripts/validate_bots.js +106 -0
  790. package/dist/scripts/validate_bots.js.map +1 -0
  791. package/dist/scripts/verify-browser-bundle.d.ts +22 -0
  792. package/dist/scripts/verify-browser-bundle.d.ts.map +1 -0
  793. package/dist/scripts/verify-browser-bundle.js +339 -0
  794. package/dist/scripts/verify-browser-bundle.js.map +1 -0
  795. package/dist/unlock.d.ts +48 -0
  796. package/dist/unlock.d.ts.map +1 -0
  797. package/dist/unlock.js +925 -0
  798. package/dist/unlock.js.map +1 -0
  799. package/package.json +112 -0
  800. package/scripts/README.md +356 -0
  801. package/scripts/clear-all.sh +195 -0
  802. package/scripts/clear-logs.sh +95 -0
  803. package/scripts/clear-market-adapter.sh +196 -0
  804. package/scripts/clear-orders.sh +113 -0
  805. package/scripts/create-bot-symlinks.sh +51 -0
  806. package/scripts/postinstall.js +9 -0
  807. package/scripts/reset-settings.sh +118 -0
@@ -0,0 +1,1192 @@
1
+ "use strict";
2
+ /**
3
+ * modules/order/grid_reconcile.ts - Grid Reconciliation Module
4
+ *
5
+ * Reconciles the local grid against the on-chain state. Used both at startup
6
+ * (resume-from-persisted-grid) and from the maintenance runtime's targeted
7
+ * drift reconciliation path.
8
+ *
9
+ * Renamed from startup_reconcile.ts — the function is a general grid/chain
10
+ * reconciler, not a startup-only concern; maintenance depends on the same
11
+ * logic. See modules/dexbot_maintenance_runtime.ts for the runtime caller.
12
+ *
13
+ * Purpose:
14
+ * - Resume previously persisted grids from storage
15
+ * - Match persisted grids with current blockchain state
16
+ * - Reconcile VIRTUAL orders with actual open orders
17
+ * - Activate appropriate orders based on blockchain state
18
+ * - Detect and handle partial order dust
19
+ * - Trigger rebalancing when needed
20
+ *
21
+ * ===============================================================================
22
+ * EXPORTS (3 functions)
23
+ * ===============================================================================
24
+ *
25
+ * PUBLIC FUNCTIONS:
26
+ * 1. reconcileGridOrders(manager, logger) - Main reconciliation function (async)
27
+ * Reconciles blockchain orders with persisted grid, activates as needed
28
+ * Handles partial orders and triggers rebalancing if dust detected
29
+ * Returns null or rebalance result
30
+ *
31
+ * 2. attemptResumePersistedGridByPriceMatch(manager, persistedGrid) - Resume from storage (async)
32
+ * Matches persisted grid to current market state using price proximity
33
+ * Validates grid structure, locks/activates orders as appropriate
34
+ * Returns { success, reason, activatedIds } or { success: false, reason }
35
+ *
36
+ * 3. decideStartupGridAction(manager, chainOrders, persistedGrid) - Determine startup action
37
+ * Decides whether to resume persisted grid, create new grid, or abort
38
+ * Returns { action, reason } where action is 'resume', 'create_new', or 'abort'
39
+ *
40
+ * INTERNAL HELPERS:
41
+ * 4. _countActiveOnGrid(manager, type) - Count active/partial orders by type
42
+ * 5. _pickVirtualSlotsToActivate(manager, type, count) - Pick virtual slots for activation
43
+ * 6. _isGridEdgeFullyActive(manager, orderType, updateCount) - Check if grid edge is fully active on one side
44
+ * 7. _findLargestOrder(unmatchedOrders, updateCount) - Find the largest unmatched chain order
45
+ * 8. _cancelLargestOrder({...}) - Cancel the largest unmatched chain order (async)
46
+ * 9. _createOrderFromGrid({...}) - Create a new on-chain order from a grid slot (async)
47
+ * 10. _cancelChainOrder({...}) - Cancel a specific on-chain order (async)
48
+ * 11. _recoverStartupSyncFailure({...}) - Handle sync failure recovery at startup (async)
49
+ * 12. _executeStartupUpdateBatch({...}) - Execute startup updates in one batch (async)
50
+ * 13. _executeStartupSingleUpdate({...}) - Execute one startup update (async)
51
+ * 14. _executeStartupSequentialUpdateFallback({...}) - Sequential backup after batch retries (async)
52
+ * 15. _reconcileStartupSide({...}) - Reconcile one side (buy/sell) against chain at startup (async)
53
+ *
54
+ * ===============================================================================
55
+ *
56
+ * STARTUP FLOW:
57
+ * 1. Load persisted grid from storage (if exists)
58
+ * 2. Call decideStartupGridAction() to determine action
59
+ * 3. If resume: attemptResumePersistedGridByPriceMatch()
60
+ * 4. Call reconcileGridOrders() to sync with blockchain
61
+ * 5. Activate appropriate orders
62
+ * 6. Check for dust partials and trigger rebalancing if needed
63
+ *
64
+ * ===============================================================================
65
+ */
66
+ const { ORDER_TYPES, ORDER_STATES, TIMING, BTS_PRECISION } = require('../constants');
67
+ const { getMinAbsoluteOrderSize, getAssetFees, blockchainToFloat, calculatePriceTolerance } = require('./utils/math');
68
+ const { isOrderPlaced, parseChainOrder, buildCreateOrderArgs, isOrderOnChain, buildOutsideInPairGroups, extractBatchOperationResults } = require('./utils/order');
69
+ const { resolveAccountRef } = require('./utils/system');
70
+ const Format = require('./format');
71
+ const SUSPECTED_DUPLICATE_TOLERANCE_MULTIPLIER = 5;
72
+ /**
73
+ * Count active orders on the grid for a given type.
74
+ * @param {Object} manager - OrderManager instance.
75
+ * @param {string} type - ORDER_TYPES value.
76
+ * @returns {number} Count of active and partial orders with orderId.
77
+ * @private
78
+ */
79
+ function _countActiveOnGrid(manager, type) {
80
+ const active = manager.getOrdersByTypeAndState(type, ORDER_STATES.ACTIVE).filter((o) => o && o.orderId);
81
+ const partial = manager.getOrdersByTypeAndState(type, ORDER_STATES.PARTIAL).filter((o) => o && o.orderId);
82
+ return active.length + partial.length;
83
+ }
84
+ /**
85
+ * Pick virtual slots to activate based on type and count.
86
+ * @param {Object} manager - OrderManager instance.
87
+ * @param {string} type - ORDER_TYPES value.
88
+ * @param {number} count - Number of slots to pick.
89
+ * @returns {Array<Object>} Array of picked virtual slots.
90
+ * @private
91
+ */
92
+ function _pickVirtualSlotsToActivate(manager, type, count) {
93
+ if (count <= 0)
94
+ return [];
95
+ // CRITICAL FIX: Filter by type BEFORE sorting
96
+ // Only get slots of the requested type (SELL or BUY), not a mix
97
+ const slotsOfType = Array.from(manager.orders.values())
98
+ .filter((slot) => slot && slot.type === type)
99
+ .sort((a, b) => type === ORDER_TYPES.BUY ? b.price - a.price : a.price - b.price);
100
+ let effectiveMin = 0;
101
+ try {
102
+ effectiveMin = getMinAbsoluteOrderSize(type, manager.assets);
103
+ }
104
+ catch (e) {
105
+ effectiveMin = 0;
106
+ }
107
+ const valid = [];
108
+ for (const slot of slotsOfType) {
109
+ if (valid.length >= count)
110
+ break;
111
+ if (!slot.orderId && slot.state === ORDER_STATES.VIRTUAL) {
112
+ // Role invariant: Only pick slots that make sense for this type based on current market pivot
113
+ // (Strategy will enforce this strictly, but we filter here for cleaner activation)
114
+ if (slot.id && (Number(slot.size) || 0) >= effectiveMin) {
115
+ valid.push(slot);
116
+ }
117
+ }
118
+ }
119
+ return valid;
120
+ }
121
+ function _getStartupSideComparators(orderType, assets) {
122
+ const isSell = orderType === ORDER_TYPES.SELL;
123
+ const sortUpdateComparator = isSell
124
+ ? (a, b) => (parseChainOrder(a, assets)?.price || 0) - (parseChainOrder(b, assets)?.price || 0)
125
+ : (a, b) => (parseChainOrder(b, assets)?.price || 0) - (parseChainOrder(a, assets)?.price || 0);
126
+ const sortExcessCancelComparator = isSell
127
+ ? (a, b) => (b.parsed.price || 0) - (a.parsed.price || 0)
128
+ : (a, b) => (a.parsed.price || 0) - (b.parsed.price || 0);
129
+ const sortMatchedCancelComparator = isSell
130
+ ? (a, b) => (b.price || 0) - (a.price || 0)
131
+ : (a, b) => (a.price || 0) - (b.price || 0);
132
+ return {
133
+ sortUpdateComparator,
134
+ sortExcessCancelComparator,
135
+ sortMatchedCancelComparator,
136
+ };
137
+ }
138
+ /**
139
+ * Detect if grid edge is fully occupied with active orders.
140
+ * When all outermost (furthest from market) orders are ACTIVE with orderId,
141
+ * we're at grid edge and all balance is committed to those orders.
142
+ *
143
+ * @param {Object} manager - OrderManager instance
144
+ * @param {string} orderType - ORDER_TYPES.BUY or ORDER_TYPES.SELL
145
+ * @param {number} updateCount - Number of orders being updated
146
+ * @returns {boolean} true if edge orders are all active
147
+ * @private
148
+ */
149
+ function _isGridEdgeFullyActive(manager, orderType, updateCount) {
150
+ if (!manager || updateCount <= 0)
151
+ return false;
152
+ // Get all orders of this type
153
+ const allOrders = Array.from(manager.orders.values()).filter((o) => o.type === orderType);
154
+ if (allOrders.length === 0)
155
+ return false;
156
+ // Sort: for BUY (highest to lowest price), for SELL (lowest to highest)
157
+ // This puts market edge first, grid edge (furthest) last
158
+ const sorted = orderType === ORDER_TYPES.BUY
159
+ ? allOrders.sort((a, b) => (b.price || 0) - (a.price || 0)) // Buy: high to low price
160
+ : allOrders.sort((a, b) => (a.price || 0) - (b.price || 0)); // Sell: low to high price
161
+ // Get the outermost orders (last N in sorted = furthest from market)
162
+ const outerEdgeCount = Math.min(updateCount, sorted.length);
163
+ const edgeOrders = sorted.slice(-outerEdgeCount);
164
+ // Check if ALL edge orders are ACTIVE (placed on blockchain)
165
+ // Empty array check prevents vacuous truth: every([]) returns true
166
+ if (edgeOrders.length === 0)
167
+ return false;
168
+ const allEdgeActive = edgeOrders.every((o) => isOrderPlaced(o));
169
+ return allEdgeActive;
170
+ }
171
+ /**
172
+ * Find the largest order among those being updated.
173
+ * Returns both the order and its index in unmatchedOrders for pairing with gridOrders.
174
+ * @param {Array<Object>} unmatchedOrders - Array of unmatched on-chain orders
175
+ * @param {number} updateCount - Number of orders being updated (first N)
176
+ * @returns {{order: Object, index: number}|null} Largest order and its index, or null if none found
177
+ * @private
178
+ */
179
+ function _findLargestOrder(unmatchedOrders, updateCount) {
180
+ if (!Array.isArray(unmatchedOrders) || unmatchedOrders.length === 0)
181
+ return null;
182
+ const ordersToCheck = unmatchedOrders.slice(0, updateCount);
183
+ let largestOrder = null;
184
+ let largestIndex = -1;
185
+ let largestSize = 0;
186
+ for (let i = 0; i < ordersToCheck.length; i++) {
187
+ const order = ordersToCheck[i];
188
+ const size = Number(order.for_sale) || 0;
189
+ if (size > largestSize) {
190
+ largestSize = size;
191
+ largestOrder = order;
192
+ largestIndex = i;
193
+ }
194
+ }
195
+ return largestIndex >= 0 ? { order: largestOrder, index: largestIndex } : null;
196
+ }
197
+ /**
198
+ * Cancel the largest unmatched order to free up maximum funds.
199
+ * This is more efficient than reducing to size 1 and then updating twice.
200
+ * Returns the grid slot index and grid order that needs to be filled.
201
+ * @param {Object} params - Destructured parameters
202
+ * @param {Function} params.chainOrders - Chain order query function
203
+ * @param {string} params.account - Account ID or name
204
+ * @param {string} params.privateKey - Active/owner private key
205
+ * @param {Object} params.manager - OrderManager instance
206
+ * @param {Array<Object>} params.unmatchedOrders - Unmatched on-chain orders
207
+ * @param {number} params.updateCount - Number of orders being updated
208
+ * @param {string} params.orderType - ORDER_TYPES.BUY or ORDER_TYPES.SELL
209
+ * @param {boolean} params.dryRun - If true, skip actual cancellation
210
+ * @returns {Promise<{gridIndex: number, gridOrder: Object}|null>} Grid slot info or null
211
+ * @private
212
+ */
213
+ async function _cancelLargestOrder({ chainOrders, account, privateKey, manager, unmatchedOrders, updateCount, orderType, dryRun, fillLockAlreadyHeld = false }) {
214
+ if (dryRun)
215
+ return null;
216
+ if (!Array.isArray(unmatchedOrders) || unmatchedOrders.length === 0)
217
+ return null;
218
+ const logger = manager && manager.logger;
219
+ // Find the largest order among those being updated
220
+ const largestInfo = _findLargestOrder(unmatchedOrders, updateCount);
221
+ if (!largestInfo)
222
+ return null;
223
+ const { order: largestOrder, index: largestIndex } = largestInfo;
224
+ const originalSize = Number(largestOrder.for_sale) || 0;
225
+ const orderId = largestOrder.id;
226
+ logger?.log?.(`Grid edge detected: cancelling largest order ${orderId} (size ${originalSize}) to free up funds`, 'info');
227
+ try {
228
+ // Cancel the largest order on blockchain and release untracked funds.
229
+ await _cancelChainOrder({
230
+ chainOrders,
231
+ account,
232
+ privateKey,
233
+ manager,
234
+ chainOrderId: orderId,
235
+ chainOrderObj: largestOrder,
236
+ releaseUntrackedFunds: true,
237
+ dryRun,
238
+ fillLockAlreadyHeld,
239
+ });
240
+ logger?.log?.(`Cancelled largest order ${orderId}`, 'info');
241
+ // Mark for removal from unmatched list (handled by caller)
242
+ // Return info needed to create this order fresh later
243
+ return { index: largestIndex, orderType };
244
+ }
245
+ catch (err) {
246
+ logger?.log?.(`Warning: Could not cancel largest order ${orderId}: ${err.message}`, 'warn');
247
+ return null;
248
+ }
249
+ }
250
+ /**
251
+ * Create a new chain order from a grid slot.
252
+ * @param {Object} params - Creation parameters.
253
+ * @param {Object} params.chainOrders - Chain orders module.
254
+ * @param {string} params.account - Account name.
255
+ * @param {string} params.privateKey - Private key.
256
+ * @param {Object} params.manager - OrderManager instance.
257
+ * @param {Object} params.gridOrder - Grid order object.
258
+ * @param {boolean} params.dryRun - Whether to simulate.
259
+ * @returns {Promise<void>}
260
+ * @private
261
+ */
262
+ async function _createOrderFromGrid({ chainOrders, account, privateKey, manager, gridOrder, dryRun, fillLockAlreadyHeld = false }) {
263
+ if (dryRun)
264
+ return;
265
+ // ATOMIC RE-VERIFICATION: Ensure slot is still virtual and hasn't been filled by recovery sync
266
+ const currentSlot = manager.orders.get(gridOrder.id);
267
+ if (currentSlot && currentSlot.orderId) {
268
+ manager.logger?.log?.(`[_createOrderFromGrid] SKIP: Slot ${gridOrder.id} already has orderId ${currentSlot.orderId}`, 'warn');
269
+ return;
270
+ }
271
+ const { amountToSell, sellAssetId, minToReceive, receiveAssetId } = buildCreateOrderArgs(gridOrder, manager.assets.assetA, manager.assets.assetB);
272
+ const result = await chainOrders.createOrder(account, privateKey, amountToSell, sellAssetId, minToReceive, receiveAssetId, null, false);
273
+ if (result && result.skipped) {
274
+ const logger = manager && manager.logger;
275
+ logger?.log?.(`[_createOrderFromGrid] Skipped slot ${gridOrder.id}: order amounts too small to place on-chain`, 'warn');
276
+ return;
277
+ }
278
+ const operationResults = extractBatchOperationResults(result) || [];
279
+ const chainOrderId = operationResults[0] && operationResults[0][1];
280
+ if (chainOrderId) {
281
+ const btsFeeData = getAssetFees('BTS');
282
+ // Centralized Fund Tracking: Use manager's sync core to handle state transition and fund deduction
283
+ // CRITICAL: Use _applySync (lock-free) since caller holds _gridLock
284
+ await manager._applySync({
285
+ gridOrderId: gridOrder.id,
286
+ chainOrderId,
287
+ isPartialPlacement: false,
288
+ fee: btsFeeData.createFee
289
+ }, 'createOrder', { gridLockAlreadyHeld: true });
290
+ }
291
+ else {
292
+ // CRITICAL FIX: Recovery sync if order extraction fails
293
+ const logger = manager && manager.logger;
294
+ logger?.log?.(`[_createOrderFromGrid] CRITICAL: createOrder succeeded but chainOrderId extraction failed`, 'error');
295
+ try {
296
+ const freshChainOrders = await chainOrders.readOpenOrders(resolveAccountRef(manager, account), TIMING.CONNECTION_TIMEOUT_MS);
297
+ // CRITICAL FIX: Use skipAccounting: false - order discovery must update accounting
298
+ // Orphan order requires fund deduction to prevent phantom capital
299
+ await manager.syncFromOpenOrders(freshChainOrders, {
300
+ skipAccounting: false,
301
+ source: 'chainOrderIdExtractionFailure',
302
+ gridLockAlreadyHeld: true,
303
+ fillLockAlreadyHeld
304
+ });
305
+ }
306
+ catch (syncErr) {
307
+ logger?.log?.(`[_createOrderFromGrid] Recovery sync failed: ${syncErr.message}`, 'error');
308
+ }
309
+ }
310
+ }
311
+ /**
312
+ * Cancel a chain order and sync with manager.
313
+ * @param {Object} params - Cancellation parameters.
314
+ * @param {Object} params.chainOrders - Chain orders module.
315
+ * @param {string} params.account - Account name.
316
+ * @param {string} params.privateKey - Private key.
317
+ * @param {Object} params.manager - OrderManager instance.
318
+ * @param {string} params.chainOrderId - ID of the chain order to cancel.
319
+ * @param {boolean} params.dryRun - Whether to simulate.
320
+ * @param {Object} [params.chainOrderObj] - Raw chain order object (needed for fund release).
321
+ * @param {boolean} [params.releaseUntrackedFunds=false] - If true, release the cancelled order's
322
+ * committed funds via addToChainFree. Use only for unmatched chain orders that have no
323
+ * corresponding ACTIVE/PARTIAL grid slot (where synchronizeWithChain cannot release them).
324
+ * @returns {Promise<void>}
325
+ * @private
326
+ */
327
+ async function _cancelChainOrder({ chainOrders, account, privateKey, manager, chainOrderId, dryRun, chainOrderObj, releaseUntrackedFunds = false, fillLockAlreadyHeld = false }) {
328
+ if (dryRun)
329
+ return;
330
+ const cancelResult = await chainOrders.cancelOrder(account, privateKey, chainOrderId);
331
+ if (cancelResult?.verifiedAfterFailure) {
332
+ const freshChainOrders = await chainOrders.readOpenOrders(resolveAccountRef(manager, account), TIMING.CONNECTION_TIMEOUT_MS);
333
+ await manager.syncFromOpenOrders(freshChainOrders, {
334
+ skipAccounting: false,
335
+ source: 'cancelOrder',
336
+ gridLockAlreadyHeld: true,
337
+ fillLockAlreadyHeld
338
+ });
339
+ }
340
+ else {
341
+ // CRITICAL: Use _applySync (lock-free) since caller holds _gridLock
342
+ await manager._applySync(chainOrderId, 'cancelOrder', { gridLockAlreadyHeld: true });
343
+ }
344
+ // Unmatched chain orders are not represented as ACTIVE/PARTIAL grid slots, so
345
+ // synchronizeWithChain('cancelOrder') cannot release their commitment.
346
+ if (releaseUntrackedFunds && manager.accountant && chainOrderObj) {
347
+ const parsed = parseChainOrder(chainOrderObj, manager.assets);
348
+ if (parsed && parsed.size > 0) {
349
+ await manager.accountant.addToChainFree(parsed.type, parsed.size, 'startup-cancel-unmatched');
350
+ }
351
+ }
352
+ }
353
+ async function _recoverStartupSyncFailure({ chainOrders, manager, account, logger, triggerMessage, source, fillLockAlreadyHeld = false }) {
354
+ try {
355
+ logger?.log?.(triggerMessage, 'warn');
356
+ const freshChainOrders = await chainOrders.readOpenOrders(resolveAccountRef(manager, account), TIMING.CONNECTION_TIMEOUT_MS);
357
+ await manager.syncFromOpenOrders(freshChainOrders, {
358
+ skipAccounting: false,
359
+ source,
360
+ gridLockAlreadyHeld: true,
361
+ fillLockAlreadyHeld
362
+ });
363
+ return freshChainOrders;
364
+ }
365
+ catch (syncErr) {
366
+ logger?.log?.(`Startup: Recovery sync failed: ${syncErr.message}`, 'error');
367
+ return null;
368
+ }
369
+ }
370
+ function _refreshStartupUpdatePlans(updatePlans, chainOpenOrders) {
371
+ if (!Array.isArray(updatePlans) || updatePlans.length === 0)
372
+ return [];
373
+ const chainById = new Map((Array.isArray(chainOpenOrders) ? chainOpenOrders : [])
374
+ .filter(o => o && o.id)
375
+ .map(o => [o.id, o]));
376
+ const refreshed = [];
377
+ for (const plan of updatePlans) {
378
+ if (!plan?.chainOrderId || !plan?.gridOrder?.id)
379
+ continue;
380
+ const freshChainOrder = chainById.get(plan.chainOrderId);
381
+ if (!freshChainOrder)
382
+ continue;
383
+ refreshed.push({
384
+ ...plan,
385
+ chainOrderObj: freshChainOrder,
386
+ });
387
+ }
388
+ return refreshed;
389
+ }
390
+ function _prepareStartupUpdatePlan(plan, manager, logger) {
391
+ const chainOrderId = plan?.chainOrderId;
392
+ const gridOrder = plan?.gridOrder;
393
+ if (!chainOrderId || !gridOrder?.id)
394
+ return null;
395
+ const currentSlot = manager.orders.get(gridOrder.id);
396
+ if (!currentSlot || (currentSlot.orderId && currentSlot.orderId !== chainOrderId)) {
397
+ logger?.log?.(`Startup: Skip update ${chainOrderId} -> ${gridOrder.id}; slot already mapped (${currentSlot?.orderId || 'none'})`, 'warn');
398
+ return null;
399
+ }
400
+ if (currentSlot.orderId === chainOrderId) {
401
+ logger?.log?.(`Startup: Skip update ${chainOrderId} -> ${gridOrder.id}; slot already matched`, 'debug');
402
+ return null;
403
+ }
404
+ const { amountToSell, minToReceive } = buildCreateOrderArgs(gridOrder, manager.assets.assetA, manager.assets.assetB);
405
+ return {
406
+ plan,
407
+ chainOrderId,
408
+ gridOrder,
409
+ parsedChain: parseChainOrder(plan.chainOrderObj, manager.assets),
410
+ updateParams: {
411
+ newPrice: gridOrder.price,
412
+ amountToSell,
413
+ minToReceive,
414
+ orderType: gridOrder.type,
415
+ }
416
+ };
417
+ }
418
+ async function _finalizeStartupUpdate({ manager, preparedUpdate }) {
419
+ const { plan, parsedChain } = preparedUpdate;
420
+ if (parsedChain && parsedChain.size > 0 && manager.accountant) {
421
+ await manager.accountant.addToChainFree(plan.gridOrder.type, parsedChain.size, 'startup-align');
422
+ }
423
+ // Extract deferred_fee from the raw chain order object so the fee
424
+ // lifecycle (cancel refunds, fill maker discounts) reconstructs
425
+ // the correct btsFeeState after a grid reset.
426
+ // deferred_fee from chain is in raw satoshis (BTS precision 5).
427
+ // The fee lifecycle operates in float BTS units, so convert here.
428
+ const rawDeferredFee = Format.toFiniteNumber(plan.chainOrderObj?.deferred_fee, null);
429
+ const deferredFeeFloat = rawDeferredFee !== null ? blockchainToFloat(rawDeferredFee, BTS_PRECISION) : null;
430
+ const btsFeeData = getAssetFees('BTS');
431
+ await manager._applySync({
432
+ gridOrderId: plan.gridOrder.id,
433
+ chainOrderId: plan.chainOrderId,
434
+ isPartialPlacement: false,
435
+ fee: btsFeeData.updateFee,
436
+ skipAccounting: false,
437
+ deferredFee: deferredFeeFloat,
438
+ }, 'createOrder', { gridLockAlreadyHeld: true });
439
+ }
440
+ async function _executeStartupUpdateBatch({ updatePlans, chainOrders, account, privateKey, manager, dryRun, }) {
441
+ if (!Array.isArray(updatePlans) || updatePlans.length === 0 || dryRun) {
442
+ return { executed: false, prepared: 0, skipped: true };
443
+ }
444
+ if (typeof chainOrders?.buildUpdateOrderOp !== 'function' || typeof chainOrders?.executeBatch !== 'function') {
445
+ throw new Error('chainOrders does not support batch update operations');
446
+ }
447
+ const logger = manager?.logger;
448
+ const prepared = [];
449
+ for (const plan of updatePlans) {
450
+ const preparedPlan = _prepareStartupUpdatePlan(plan, manager, logger);
451
+ if (!preparedPlan)
452
+ continue;
453
+ const buildResult = await chainOrders.buildUpdateOrderOp(account, preparedPlan.chainOrderId, preparedPlan.updateParams, plan.chainOrderObj || null);
454
+ if (!buildResult) {
455
+ logger?.log?.(`Startup: Skip update ${preparedPlan.chainOrderId} -> ${preparedPlan.gridOrder.id}; no blockchain delta`, 'debug');
456
+ continue;
457
+ }
458
+ prepared.push({
459
+ ...preparedPlan,
460
+ op: buildResult.op,
461
+ });
462
+ }
463
+ if (prepared.length === 0) {
464
+ return { executed: false, prepared: 0, skipped: true };
465
+ }
466
+ logger?.log?.(`Startup: Broadcasting update batch (${prepared.length} op${prepared.length > 1 ? 's' : ''})`, 'info');
467
+ await chainOrders.executeBatch(account, privateKey, prepared.map(p => p.op));
468
+ for (const entry of prepared) {
469
+ await _finalizeStartupUpdate({ manager, preparedUpdate: entry });
470
+ }
471
+ return { executed: true, prepared: prepared.length, skipped: false };
472
+ }
473
+ async function _executeStartupSingleUpdate({ plan, chainOrders, account, privateKey, manager, dryRun, }) {
474
+ if (dryRun)
475
+ return { executed: false, skipped: true };
476
+ if (typeof chainOrders?.updateOrder !== 'function') {
477
+ throw new Error('chainOrders.updateOrder is required for sequential update fallback');
478
+ }
479
+ const logger = manager?.logger;
480
+ const prepared = _prepareStartupUpdatePlan(plan, manager, logger);
481
+ if (!prepared)
482
+ return { executed: false, skipped: true };
483
+ const result = await chainOrders.updateOrder(account, privateKey, prepared.chainOrderId, prepared.updateParams);
484
+ if (!result) {
485
+ logger?.log?.(`Startup: Skip update ${prepared.chainOrderId} -> ${prepared.gridOrder.id}; no blockchain delta`, 'debug');
486
+ return { executed: false, skipped: true };
487
+ }
488
+ await _finalizeStartupUpdate({ manager, preparedUpdate: prepared });
489
+ return { executed: true, skipped: false };
490
+ }
491
+ async function _executeStartupSequentialUpdateFallback({ updatePlans, chainOrders, account, privateKey, manager, dryRun, fillLockAlreadyHeld = false, }) {
492
+ if (!Array.isArray(updatePlans) || updatePlans.length === 0 || dryRun) {
493
+ return { executed: 0, skipped: 0, failed: 0 };
494
+ }
495
+ const logger = manager?.logger;
496
+ let queue = updatePlans.slice(0);
497
+ let executed = 0;
498
+ let skipped = 0;
499
+ let failed = 0;
500
+ logger?.log?.(`Startup: Falling back to sequential updates for ${queue.length} pending order(s)`, 'warn');
501
+ while (queue.length > 0) {
502
+ const plan = queue.shift();
503
+ if (!plan)
504
+ continue;
505
+ try {
506
+ const result = await _executeStartupSingleUpdate({
507
+ plan,
508
+ chainOrders,
509
+ account,
510
+ privateKey,
511
+ manager,
512
+ dryRun,
513
+ });
514
+ if (result.executed)
515
+ executed++;
516
+ else
517
+ skipped++;
518
+ }
519
+ catch (err) {
520
+ failed++;
521
+ logger?.log?.(`Startup: Sequential update failed for ${plan.chainOrderId} -> ${plan.gridOrderId || plan.gridOrder?.id}: ${err.message}`, 'error');
522
+ const refreshedChainOrders = await _recoverStartupSyncFailure({
523
+ chainOrders,
524
+ manager,
525
+ account,
526
+ logger,
527
+ triggerMessage: `Startup: Triggering recovery sync after sequential update failure for ${plan.chainOrderId}`,
528
+ source: 'startupReconcileSequentialUpdateFailure',
529
+ fillLockAlreadyHeld,
530
+ });
531
+ queue = _refreshStartupUpdatePlans(queue, refreshedChainOrders);
532
+ }
533
+ }
534
+ return { executed, skipped, failed };
535
+ }
536
+ async function _createStartupOrderWithHandling({ chainOrders, account, privateKey, manager, gridOrder, orderLabel, dryRun, recovery, fillLockAlreadyHeld = false }) {
537
+ try {
538
+ await _createOrderFromGrid({ chainOrders, account, privateKey, manager, gridOrder, dryRun, fillLockAlreadyHeld });
539
+ }
540
+ catch (err) {
541
+ manager?.logger?.log?.(`Startup: Failed to create ${orderLabel}: ${err.message}`, 'error');
542
+ if (recovery && recovery.triggerMessage && recovery.source) {
543
+ await _recoverStartupSyncFailure({
544
+ chainOrders,
545
+ manager,
546
+ account,
547
+ logger: manager?.logger,
548
+ triggerMessage: recovery.triggerMessage,
549
+ source: recovery.source,
550
+ fillLockAlreadyHeld,
551
+ });
552
+ }
553
+ }
554
+ }
555
+ // _extractBatchOperationResults — thin wrapper over shared utility,
556
+ // returns empty array (not null) for callers that iterate directly.
557
+ function _extractBatchOperationResults(result) {
558
+ return extractBatchOperationResults(result) || [];
559
+ }
560
+ function _resolveGroupRecovery(group, fallbackMessage, fallbackSource) {
561
+ for (const plan of group || []) {
562
+ if (plan?.recovery?.triggerMessage && plan?.recovery?.source) {
563
+ return { triggerMessage: plan.recovery.triggerMessage, source: plan.recovery.source };
564
+ }
565
+ }
566
+ return { triggerMessage: fallbackMessage, source: fallbackSource };
567
+ }
568
+ async function _executeStartupCreateGroupBatch({ group, chainOrders, account, privateKey, manager, dryRun, groupIndex, totalGroups, fillLockAlreadyHeld = false, }) {
569
+ if (!Array.isArray(group) || group.length === 0 || dryRun)
570
+ return;
571
+ if (typeof chainOrders?.buildCreateOrderOp !== 'function' || typeof chainOrders?.executeBatch !== 'function') {
572
+ throw new Error('chainOrders does not support batch create operations');
573
+ }
574
+ const logger = manager?.logger;
575
+ const prepared = [];
576
+ for (const plan of group) {
577
+ const gridOrder = plan?.gridOrder;
578
+ if (!gridOrder || !gridOrder.id)
579
+ continue;
580
+ const currentSlot = manager.orders.get(gridOrder.id);
581
+ if (currentSlot?.orderId) {
582
+ logger?.log?.(`Startup: Skip create ${plan.orderLabel} - slot ${gridOrder.id} already has orderId ${currentSlot.orderId}`, 'warn');
583
+ continue;
584
+ }
585
+ const { amountToSell, sellAssetId, minToReceive, receiveAssetId } = buildCreateOrderArgs(gridOrder, manager.assets.assetA, manager.assets.assetB);
586
+ const buildResult = await chainOrders.buildCreateOrderOp(account, amountToSell, sellAssetId, minToReceive, receiveAssetId, null);
587
+ if (!buildResult) {
588
+ logger?.log?.(`Startup: Skip create ${plan.orderLabel} - order amounts too small to place on-chain`, 'warn');
589
+ continue;
590
+ }
591
+ prepared.push({ plan, op: buildResult.op });
592
+ }
593
+ if (prepared.length === 0)
594
+ return;
595
+ const recovery = _resolveGroupRecovery(group, `Startup: Triggering recovery sync after create group ${groupIndex + 1}/${totalGroups} failure`, 'startupCreateGroupFailure');
596
+ try {
597
+ logger?.log?.(`Startup: Broadcasting create group ${groupIndex + 1}/${totalGroups} in single batch (${prepared.length} op${prepared.length > 1 ? 's' : ''})`, 'info');
598
+ const batchResult = await chainOrders.executeBatch(account, privateKey, prepared.map(p => p.op));
599
+ const opResults = _extractBatchOperationResults(batchResult);
600
+ const btsFeeData = getAssetFees('BTS');
601
+ let missingChainOrderId = false;
602
+ for (let i = 0; i < prepared.length; i++) {
603
+ const chainOrderId = opResults[i] && opResults[i][1];
604
+ const plan = prepared[i].plan;
605
+ if (!chainOrderId) {
606
+ logger?.log?.(`Startup: create result missing chainOrderId for ${plan.orderLabel}`, 'error');
607
+ missingChainOrderId = true;
608
+ continue;
609
+ }
610
+ await manager._applySync({
611
+ gridOrderId: plan.gridOrder.id,
612
+ chainOrderId,
613
+ isPartialPlacement: false,
614
+ fee: btsFeeData.createFee
615
+ }, 'createOrder', { gridLockAlreadyHeld: true });
616
+ }
617
+ if (missingChainOrderId) {
618
+ await _recoverStartupSyncFailure({
619
+ chainOrders,
620
+ manager,
621
+ account,
622
+ logger,
623
+ triggerMessage: recovery.triggerMessage,
624
+ source: recovery.source,
625
+ fillLockAlreadyHeld,
626
+ });
627
+ }
628
+ }
629
+ catch (err) {
630
+ logger?.log?.(`Startup: Failed to create group ${groupIndex + 1}/${totalGroups}: ${err.message}`, 'error');
631
+ await _recoverStartupSyncFailure({
632
+ chainOrders,
633
+ manager,
634
+ account,
635
+ logger,
636
+ triggerMessage: recovery.triggerMessage,
637
+ source: recovery.source,
638
+ fillLockAlreadyHeld,
639
+ });
640
+ }
641
+ }
642
+ function _buildOutsideInCreateGroups(createPlans) {
643
+ return buildOutsideInPairGroups(createPlans, {
644
+ isValid: p => Boolean(p?.gridOrder),
645
+ getType: p => p.orderType,
646
+ getPrice: p => p.gridOrder?.price,
647
+ });
648
+ }
649
+ async function _executePlannedStartupCreates({ createPlans, chainOrders, account, privateKey, manager, dryRun, fillLockAlreadyHeld = false, }) {
650
+ const logger = manager?.logger;
651
+ const groups = _buildOutsideInCreateGroups(createPlans);
652
+ if (groups.length === 0)
653
+ return;
654
+ logger?.log?.(`Startup: Executing ${createPlans.length} planned create(s) in ${groups.length} outside->center group(s)`, 'info');
655
+ for (let i = 0; i < groups.length; i++) {
656
+ const group = groups[i];
657
+ const labels = group.map(p => `${p.orderType.toUpperCase()}:${p.gridOrder?.id}`).join(', ');
658
+ logger?.log?.(`Startup: Create group ${i + 1}/${groups.length} (${labels})`, 'info');
659
+ const canBatchCreate = typeof chainOrders?.buildCreateOrderOp === 'function' && typeof chainOrders?.executeBatch === 'function';
660
+ if (group.length > 1 && canBatchCreate) {
661
+ await _executeStartupCreateGroupBatch({
662
+ group,
663
+ chainOrders,
664
+ account,
665
+ privateKey,
666
+ manager,
667
+ dryRun,
668
+ groupIndex: i,
669
+ totalGroups: groups.length,
670
+ fillLockAlreadyHeld,
671
+ });
672
+ continue;
673
+ }
674
+ if (group.length > 1 && !canBatchCreate) {
675
+ logger?.log?.('Startup: Batch create helpers unavailable; falling back to sequential creates for this group', 'warn');
676
+ }
677
+ for (const plan of group) {
678
+ await _createStartupOrderWithHandling({
679
+ chainOrders,
680
+ account,
681
+ privateKey,
682
+ manager,
683
+ gridOrder: plan.gridOrder,
684
+ orderLabel: plan.orderLabel,
685
+ dryRun,
686
+ recovery: plan.recovery,
687
+ fillLockAlreadyHeld,
688
+ });
689
+ }
690
+ }
691
+ }
692
+ async function _reconcileStartupSide({ orderType, targetCount, chainSideOrders, unmatchedSideOrders, manager, chainOrders, account, privateKey, dryRun, plannedCreates, plannedUpdates, fillLockAlreadyHeld = false, }) {
693
+ const logger = manager?.logger;
694
+ const sideUpper = orderType === ORDER_TYPES.SELL ? 'SELL' : 'BUY';
695
+ const balanceKey = orderType === ORDER_TYPES.SELL ? 'sellFree' : 'buyFree';
696
+ const balanceSymbol = orderType === ORDER_TYPES.SELL ? manager.assets.assetA.symbol : manager.assets.assetB.symbol;
697
+ const { sortUpdateComparator, sortExcessCancelComparator, sortMatchedCancelComparator, } = _getStartupSideComparators(orderType, manager.assets);
698
+ const matchedOnGrid = _countActiveOnGrid(manager, orderType);
699
+ const neededSlots = Math.max(0, targetCount - matchedOnGrid);
700
+ const desiredSlots = _pickVirtualSlotsToActivate(manager, orderType, neededSlots);
701
+ const sortedUnmatched = unmatchedSideOrders.slice(0).sort(sortUpdateComparator);
702
+ const updateCount = Math.min(sortedUnmatched.length, desiredSlots.length);
703
+ let cancelledIndex = null;
704
+ let projectedSideBalance = Number(manager.accountTotals?.[balanceKey] || 0);
705
+ logger?.log?.(`Startup ${sideUpper}: matchedOnGrid=${matchedOnGrid}, needSlots=${neededSlots}, unmatched=${sortedUnmatched.length}, updates=${updateCount}`, 'info');
706
+ if (updateCount > 0 && _isGridEdgeFullyActive(manager, orderType, updateCount)) {
707
+ logger?.log?.(`Startup: ${sideUpper} grid edge is fully active, cancelling largest order to free funds`, 'info');
708
+ const cancelInfo = await _cancelLargestOrder({
709
+ chainOrders,
710
+ account,
711
+ privateKey,
712
+ manager,
713
+ unmatchedOrders: sortedUnmatched,
714
+ updateCount,
715
+ orderType,
716
+ dryRun,
717
+ fillLockAlreadyHeld,
718
+ });
719
+ if (cancelInfo)
720
+ cancelledIndex = cancelInfo.index;
721
+ }
722
+ for (let i = 0; i < updateCount; i++) {
723
+ if (cancelledIndex !== null && i === cancelledIndex)
724
+ continue;
725
+ const chainOrder = sortedUnmatched[i];
726
+ const gridOrder = desiredSlots[i];
727
+ const gridSize = Number(gridOrder.size) || 0;
728
+ const parsedChain = parseChainOrder(chainOrder, manager.assets);
729
+ const currentSize = parsedChain ? parsedChain.size : 0;
730
+ const sizeIncrease = Math.max(0, gridSize - currentSize);
731
+ const currentAssetBalance = projectedSideBalance;
732
+ if (sizeIncrease > currentAssetBalance) {
733
+ logger?.log?.(`Startup: Skipping ${sideUpper} update ${chainOrder.id} - insufficient balance for increase (need +${Format.formatSizeByOrderType(sizeIncrease, orderType, manager.assets)} ${balanceSymbol}, have ${Format.formatSizeByOrderType(currentAssetBalance, orderType, manager.assets)} ${balanceSymbol})`, 'warn');
734
+ continue;
735
+ }
736
+ logger?.log?.(`Startup: Updating chain ${sideUpper} ${chainOrder.id} -> grid ${gridOrder.id} (price=${Format.formatPrice6(gridOrder.price)}, size=${Format.formatSizeByOrderType(gridOrder.size, orderType, manager.assets)})`, 'info');
737
+ plannedUpdates.push({
738
+ orderType,
739
+ chainOrderId: chainOrder.id,
740
+ chainOrderObj: chainOrder,
741
+ gridOrderId: gridOrder.id,
742
+ gridOrder: { ...gridOrder },
743
+ });
744
+ projectedSideBalance += (currentSize - gridSize);
745
+ }
746
+ if (cancelledIndex !== null && !dryRun) {
747
+ const targetGridOrder = desiredSlots[cancelledIndex];
748
+ if (targetGridOrder) {
749
+ logger?.log?.(`Startup: Creating new ${sideUpper} for cancelled slot at grid ${targetGridOrder.id} (price=${Format.formatPrice6(targetGridOrder.price)}, size=${Format.formatSizeByOrderType(targetGridOrder.size, orderType, manager.assets)})`, 'info');
750
+ plannedCreates.push({
751
+ orderType,
752
+ gridOrder: targetGridOrder,
753
+ orderLabel: `${sideUpper} for cancelled slot`,
754
+ recovery: {
755
+ triggerMessage: `Startup: Triggering recovery sync after ${sideUpper} creation failure`,
756
+ source: 'phase3CreationFailure',
757
+ },
758
+ });
759
+ }
760
+ }
761
+ const processedUnmatched = sortedUnmatched.slice(updateCount);
762
+ const chainCount = chainSideOrders.length;
763
+ const createCount = Math.max(0, targetCount - chainCount);
764
+ const remainingSlots = desiredSlots.slice(updateCount);
765
+ for (let i = 0; i < Math.min(createCount, remainingSlots.length); i++) {
766
+ const gridOrder = remainingSlots[i];
767
+ logger?.log?.(`Startup: Creating ${sideUpper} for grid ${gridOrder.id} (price=${Format.formatPrice6(gridOrder.price)}, size=${Format.formatSizeByOrderType(gridOrder.size, orderType, manager.assets)})`, 'info');
768
+ plannedCreates.push({
769
+ orderType,
770
+ gridOrder,
771
+ orderLabel: sideUpper,
772
+ // Intentionally no recovery metadata here.
773
+ // This preserves legacy behavior: regular virtual-slot creates only log failures,
774
+ // while cancelled-slot replacement creates trigger a startup recovery sync.
775
+ });
776
+ }
777
+ let cancelCount = Math.max(0, chainCount - targetCount);
778
+ if (cancelCount > 0) {
779
+ const parsedUnmatched = processedUnmatched
780
+ .map(co => ({ chain: co, parsed: parseChainOrder(co, manager.assets) }))
781
+ .filter(x => x.parsed)
782
+ .sort(sortExcessCancelComparator);
783
+ for (const x of parsedUnmatched) {
784
+ if (cancelCount <= 0)
785
+ break;
786
+ logger?.log?.(`Startup: Cancelling excess ${sideUpper} chain order ${x.chain.id}`, 'info');
787
+ try {
788
+ await _cancelChainOrder({
789
+ chainOrders,
790
+ account,
791
+ privateKey,
792
+ manager,
793
+ chainOrderId: x.chain.id,
794
+ chainOrderObj: x.chain,
795
+ releaseUntrackedFunds: true,
796
+ dryRun,
797
+ fillLockAlreadyHeld,
798
+ });
799
+ logger?.log?.(`Startup: Successfully cancelled excess ${sideUpper} order ${x.chain.id}`, 'info');
800
+ cancelCount--;
801
+ }
802
+ catch (err) {
803
+ logger?.log?.(`Startup: Failed to cancel ${sideUpper} ${x.chain.id}: ${err.message}`, 'error');
804
+ }
805
+ }
806
+ if (cancelCount > 0) {
807
+ const activeOrders = manager.getOrdersByTypeAndState(orderType, ORDER_STATES.ACTIVE)
808
+ .filter(o => o && o.orderId)
809
+ .sort(sortMatchedCancelComparator);
810
+ for (const o of activeOrders) {
811
+ if (cancelCount <= 0)
812
+ break;
813
+ logger?.log?.(`Startup: Cancelling excess matched ${sideUpper} ${o.orderId} (grid ${o.id})`, 'warn');
814
+ try {
815
+ await _cancelChainOrder({ chainOrders, account, privateKey, manager, chainOrderId: o.orderId, dryRun, chainOrderObj: o, fillLockAlreadyHeld });
816
+ logger?.log?.(`Startup: Successfully cancelled excess matched ${sideUpper} order ${o.orderId} (grid ${o.id})`, 'info');
817
+ cancelCount--;
818
+ }
819
+ catch (err) {
820
+ logger?.log?.(`Startup: Failed to cancel matched ${sideUpper} ${o.orderId}: ${err.message}`, 'error');
821
+ }
822
+ }
823
+ }
824
+ }
825
+ return {
826
+ chainCount,
827
+ };
828
+ }
829
+ /**
830
+ * Attempt to resume a persisted grid when orderIds don't match (e.g. orders.json out of sync),
831
+ * by matching existing on-chain open orders to grid orders using price+size matching.
832
+ *
833
+ * Returns { resumed: boolean, matchedCount: number }.
834
+ * @param {Object} params - Destructured parameters
835
+ * @param {Object} params.manager - OrderManager instance
836
+ * @param {Array<Object>} params.persistedGrid - Persisted grid orders
837
+ * @param {Array<Object>} params.chainOpenOrders - On-chain open orders
838
+ * @param {Object} params.logger - Logger instance
839
+ * @param {Function} params.storeGrid - Grid persistence callback
840
+ * @returns {Promise<{resumed: boolean, matchedCount: number}>}
841
+ */
842
+ async function attemptResumePersistedGridByPriceMatch({ manager, persistedGrid, chainOpenOrders, logger, storeGrid, fillLockAlreadyHeld = false, }) {
843
+ if (!Array.isArray(persistedGrid) || persistedGrid.length === 0)
844
+ return { resumed: false, matchedCount: 0 };
845
+ if (!Array.isArray(chainOpenOrders) || chainOpenOrders.length === 0)
846
+ return { resumed: false, matchedCount: 0 };
847
+ if (!manager || typeof manager.synchronizeWithChain !== 'function')
848
+ return { resumed: false, matchedCount: 0 };
849
+ try {
850
+ logger && logger.log && logger.log('No matching active order IDs found. Attempting to match by price...', 'info');
851
+ const Grid = require('./grid');
852
+ await Grid.loadGrid(manager, persistedGrid);
853
+ await manager.synchronizeWithChain(chainOpenOrders, 'readOpenOrders', { fillLockAlreadyHeld });
854
+ const matchedOrderIds = new Set(Array.from(manager.orders.values())
855
+ .filter((o) => o && isOrderOnChain(o))
856
+ .map((o) => o.orderId)
857
+ .filter(Boolean));
858
+ if (matchedOrderIds.size === 0) {
859
+ logger && logger.log && logger.log('Price-based matching found no matches. Generating new grid.', 'info');
860
+ return { resumed: false, matchedCount: 0 };
861
+ }
862
+ logger && logger.log && logger.log(`Successfully matched ${matchedOrderIds.size} orders by price. Resuming with existing grid.`, 'info');
863
+ if (typeof storeGrid === 'function') {
864
+ await storeGrid(Array.from(manager.orders.values()));
865
+ }
866
+ return { resumed: true, matchedCount: matchedOrderIds.size };
867
+ }
868
+ catch (err) {
869
+ logger && logger.log && logger.log(`Price-based resume attempt failed: ${err && err.message ? err.message : err}`, 'warn');
870
+ return { resumed: false, matchedCount: 0 };
871
+ }
872
+ }
873
+ /**
874
+ * Decide whether a startup should regenerate the grid or resume a persisted grid.
875
+ *
876
+ * Resulting behavior matches the existing startup policy:
877
+ * - If no persisted grid -> regenerate
878
+ * - If any persisted ACTIVE orderId exists on-chain -> resume
879
+ * - Else if there are on-chain orders -> attempt price-based matching; resume if it matches any
880
+ * - Else -> regenerate
881
+ * @param {Object} params - Destructured parameters
882
+ * @param {Array<Object>} params.persistedGrid - Persisted grid orders
883
+ * @param {Array<Object>} params.chainOpenOrders - On-chain open orders
884
+ * @param {Object} params.manager - OrderManager instance
885
+ * @param {Object} params.logger - Logger instance
886
+ * @param {Function} params.storeGrid - Grid persistence callback
887
+ * @param {Function} [params.attemptResumeFn=attemptResumePersistedGridByPriceMatch] - Resume function
888
+ * @returns {Promise<Object>} { shouldRegenerate, hasActiveMatch, resumedByPrice, matchedCount }
889
+ */
890
+ async function decideStartupGridAction({ persistedGrid, chainOpenOrders, manager, logger, storeGrid, attemptResumeFn = attemptResumePersistedGridByPriceMatch, fillLockAlreadyHeld = false, }) {
891
+ const persisted = Array.isArray(persistedGrid) ? persistedGrid : [];
892
+ const chain = Array.isArray(chainOpenOrders) ? chainOpenOrders : [];
893
+ if (persisted.length === 0) {
894
+ return { shouldRegenerate: true, hasActiveMatch: false, resumedByPrice: false, matchedCount: 0 };
895
+ }
896
+ const chainOrderIds = new Set(chain.map(o => o && o.id).filter(Boolean));
897
+ const hasActiveMatch = persisted.some(order => order && order.state === ORDER_STATES.ACTIVE && order.orderId && chainOrderIds.has(order.orderId));
898
+ if (hasActiveMatch) {
899
+ return { shouldRegenerate: false, hasActiveMatch: true, resumedByPrice: false, matchedCount: 0 };
900
+ }
901
+ if (chain.length > 0) {
902
+ const resume = await attemptResumeFn({ manager, persistedGrid: persisted, chainOpenOrders: chain, logger, storeGrid, fillLockAlreadyHeld });
903
+ return { shouldRegenerate: !resume.resumed, hasActiveMatch: false, resumedByPrice: !!resume.resumed, matchedCount: resume.matchedCount || 0 };
904
+ }
905
+ return { shouldRegenerate: true, hasActiveMatch: false, resumedByPrice: false, matchedCount: 0 };
906
+ }
907
+ /**
908
+ * Reconcile existing on-chain orders to a newly generated grid.
909
+ *
910
+ * Policy (per side):
911
+ * - Prefer updating existing unmatched chain orders to match the target grid slots.
912
+ * - Then create missing orders if chain has fewer than target.
913
+ * - Then cancel excess orders if chain has more than target.
914
+ *
915
+ * Targets are derived from config.activeOrders.{buy,sell} and chain counts are computed
916
+ * from current on-chain open orders.
917
+ * @param {Object} params - Destructured parameters
918
+ * @param {Object} params.manager - OrderManager instance
919
+ * @param {Object} params.config - Bot configuration
920
+ * @param {string} params.account - Account ID or name
921
+ * @param {string} params.privateKey - Active/owner private key
922
+ * @param {Function} params.chainOrders - Chain order query function
923
+ * @param {Array<Object>} params.chainOpenOrders - On-chain open orders
924
+ * @returns {Promise<Object>} Reconciliation result
925
+ */
926
+ async function reconcileGridOrders({ manager, config, account, privateKey, chainOrders, chainOpenOrders, fillLockAlreadyHeld = false, }) {
927
+ // Parameter validation
928
+ if (!manager || typeof manager.synchronizeWithChain !== 'function') {
929
+ throw new Error('reconcileGridOrders: manager must be provided with synchronizeWithChain method');
930
+ }
931
+ if (typeof manager.getOrdersByTypeAndState !== 'function') {
932
+ throw new Error('reconcileGridOrders: manager.getOrdersByTypeAndState method not found');
933
+ }
934
+ if (!account || !privateKey) {
935
+ throw new Error('reconcileGridOrders: account and privateKey are required');
936
+ }
937
+ if (!chainOrders || typeof chainOrders.cancelOrder !== 'function' || typeof chainOrders.createOrder !== 'function') {
938
+ throw new Error('reconcileGridOrders: chainOrders must provide cancelOrder and createOrder methods');
939
+ }
940
+ if (typeof chainOrders.readOpenOrders !== 'function') {
941
+ throw new Error('reconcileGridOrders: chainOrders.readOpenOrders is required for recovery sync');
942
+ }
943
+ const supportsBatchUpdate = typeof chainOrders.buildUpdateOrderOp === 'function' && typeof chainOrders.executeBatch === 'function';
944
+ const supportsSequentialUpdate = typeof chainOrders.updateOrder === 'function';
945
+ if (!supportsBatchUpdate && !supportsSequentialUpdate) {
946
+ throw new Error('reconcileGridOrders: chainOrders must provide updateOrder or (buildUpdateOrderOp + executeBatch) for startup updates');
947
+ }
948
+ const logger = manager && manager.logger;
949
+ const dryRun = !!(config && config.dryRun);
950
+ const parsedChain = (chainOpenOrders || [])
951
+ .map(co => ({ chain: co, parsed: parseChainOrder(co, manager.assets) }))
952
+ .filter(x => x.parsed);
953
+ const activeCfg = (config && config.activeOrders) ? config.activeOrders : {};
954
+ let targetBuy = Math.max(0, Number.isFinite(Number(activeCfg.buy)) ? Number(activeCfg.buy) : 1);
955
+ let targetSell = Math.max(0, Number.isFinite(Number(activeCfg.sell)) ? Number(activeCfg.sell) : 1);
956
+ const chainBuys = parsedChain.filter(x => x.parsed.type === ORDER_TYPES.BUY).map(x => x.chain);
957
+ const chainSells = parsedChain.filter(x => x.parsed.type === ORDER_TYPES.SELL).map(x => x.chain);
958
+ // PHASE 1: In-memory reconciliation under lock (compute + individual quick cancels)
959
+ // Blockchain-heavy batch operations (updates, creates, readOpenOrders) are deferred
960
+ // to Phase 2 to minimize lock contention.
961
+ const phase1Result = await manager._gridLock.acquire(async () => {
962
+ if (typeof manager._applyOrderUpdate !== 'function') {
963
+ throw new Error('manager._applyOrderUpdate is required for startup reconciliation');
964
+ }
965
+ const applyUpdate = manager._applyOrderUpdate.bind(manager);
966
+ const chainIds = new Set((Array.isArray(chainOpenOrders) ? chainOpenOrders : []).map(o => o && o.id).filter(Boolean));
967
+ for (const order of manager.orders.values()) {
968
+ if (isOrderPlaced(order)) {
969
+ if (!chainIds.has(order.orderId)) {
970
+ logger?.log?.(`Startup: Found phantom order ${order.id} (ID ${order.orderId}) not on chain. Resetting to VIRTUAL.`, 'warn');
971
+ await applyUpdate({
972
+ ...order,
973
+ state: ORDER_STATES.VIRTUAL,
974
+ orderId: "",
975
+ rawOnChain: null
976
+ }, 'startup-phantom', false, 0);
977
+ }
978
+ }
979
+ }
980
+ const matchedChainOrderIds = new Set();
981
+ for (const gridOrder of manager.orders.values()) {
982
+ if (gridOrder && gridOrder.orderId) {
983
+ matchedChainOrderIds.add(gridOrder.orderId);
984
+ }
985
+ }
986
+ const unmatchedChain = (Array.isArray(chainOpenOrders) ? chainOpenOrders : []).filter(co => co && !matchedChainOrderIds.has(co.id));
987
+ let unmatchedParsed = unmatchedChain
988
+ .map(co => ({ chain: co, parsed: parseChainOrder(co, manager.assets) }))
989
+ .filter(x => x.parsed);
990
+ const cancelledDuplicateIds = new Set();
991
+ const activeGridOrders = Array.from(manager.orders.values()).filter((o) => o && o.orderId && isOrderPlaced(o));
992
+ for (const u of unmatchedParsed) {
993
+ const p = u.parsed;
994
+ const desc = `Unmatched chain order: ${p.orderId} (${p.type === ORDER_TYPES.BUY ? 'BUY' : 'SELL'}), price=${Format.formatPrice6(p.price)}, size=${Format.formatSizeByOrderType(p.size, p.type, manager.assets)}`;
995
+ let nearest = null;
996
+ for (const gridOrder of activeGridOrders) {
997
+ if (gridOrder.type !== p.type)
998
+ continue;
999
+ const priceDiff = Math.abs(p.price - gridOrder.price);
1000
+ const tolerance = calculatePriceTolerance(gridOrder.price, gridOrder.size, gridOrder.type, manager.assets);
1001
+ const candidate = {
1002
+ gridOrder,
1003
+ priceDiff,
1004
+ tolerance,
1005
+ looseTolerance: tolerance * SUSPECTED_DUPLICATE_TOLERANCE_MULTIPLIER,
1006
+ };
1007
+ if (!nearest || priceDiff < nearest.priceDiff)
1008
+ nearest = candidate;
1009
+ }
1010
+ if (nearest && nearest.priceDiff <= nearest.looseTolerance) {
1011
+ logger?.log?.(`SUSPECTED DUPLICATE: ${desc} - nearest active grid ${nearest.gridOrder.id} ` +
1012
+ `(orderId=${nearest.gridOrder.orderId}, price=${Format.formatPrice6(nearest.gridOrder.price)}, ` +
1013
+ `diff=${Format.formatPrice6(nearest.priceDiff)}, tolerance=${Format.formatPrice6(nearest.tolerance)}, ` +
1014
+ `looseTolerance=${Format.formatPrice6(nearest.looseTolerance)})`, 'error');
1015
+ if (!dryRun) {
1016
+ try {
1017
+ await _cancelChainOrder({
1018
+ chainOrders,
1019
+ account,
1020
+ privateKey,
1021
+ manager,
1022
+ chainOrderId: p.orderId,
1023
+ dryRun,
1024
+ chainOrderObj: u.chain,
1025
+ releaseUntrackedFunds: true,
1026
+ fillLockAlreadyHeld,
1027
+ });
1028
+ cancelledDuplicateIds.add(p.orderId);
1029
+ logger?.log?.(`Cancelled unmatched duplicate chain order ${p.orderId} at price ${Format.formatPrice6(p.price)} — ` +
1030
+ `stale dust remnant duplicate of grid ${nearest.gridOrder.id} (${nearest.gridOrder.orderId})`, 'warn');
1031
+ }
1032
+ catch (cancelErr) {
1033
+ logger?.log?.(`Failed to cancel duplicate chain order ${p.orderId}: ${cancelErr.message}`, 'error');
1034
+ }
1035
+ }
1036
+ }
1037
+ else if (nearest) {
1038
+ logger?.log?.(`${desc}; nearest active same-side grid ${nearest.gridOrder.id} ` +
1039
+ `(orderId=${nearest.gridOrder.orderId}, price=${Format.formatPrice6(nearest.gridOrder.price)}, ` +
1040
+ `diff=${Format.formatPrice6(nearest.priceDiff)}, tolerance=${Format.formatPrice6(nearest.tolerance)}, ` +
1041
+ `looseTolerance=${Format.formatPrice6(nearest.looseTolerance)})`, 'warn');
1042
+ }
1043
+ else {
1044
+ logger?.log?.(`${desc}; no active same-side grid order exists`, 'warn');
1045
+ }
1046
+ }
1047
+ if (cancelledDuplicateIds.size > 0) {
1048
+ unmatchedParsed = unmatchedParsed.filter(u => !cancelledDuplicateIds.has(u.parsed.orderId));
1049
+ }
1050
+ let unmatchedBuys = unmatchedParsed.filter(x => x.parsed.type === ORDER_TYPES.BUY).map(x => x.chain);
1051
+ let unmatchedSells = unmatchedParsed.filter(x => x.parsed.type === ORDER_TYPES.SELL).map(x => x.chain);
1052
+ const plannedCreates = [];
1053
+ const plannedUpdates = [];
1054
+ logger && logger.log && logger.log(`Startup reconcile starting: unmatched(sell=${unmatchedSells.length}, buy=${unmatchedBuys.length}), target(sell=${targetSell}, buy=${targetBuy})`, 'info');
1055
+ const sellResult = await _reconcileStartupSide({
1056
+ orderType: ORDER_TYPES.SELL,
1057
+ targetCount: targetSell,
1058
+ chainSideOrders: chainSells,
1059
+ unmatchedSideOrders: unmatchedSells,
1060
+ manager,
1061
+ chainOrders,
1062
+ account,
1063
+ privateKey,
1064
+ dryRun,
1065
+ plannedCreates,
1066
+ plannedUpdates,
1067
+ fillLockAlreadyHeld,
1068
+ });
1069
+ const buyResult = await _reconcileStartupSide({
1070
+ orderType: ORDER_TYPES.BUY,
1071
+ targetCount: targetBuy,
1072
+ chainSideOrders: chainBuys,
1073
+ unmatchedSideOrders: unmatchedBuys,
1074
+ manager,
1075
+ chainOrders,
1076
+ account,
1077
+ privateKey,
1078
+ dryRun,
1079
+ plannedCreates,
1080
+ plannedUpdates,
1081
+ fillLockAlreadyHeld,
1082
+ });
1083
+ return { plannedCreates, plannedUpdates, chainSellCount: sellResult.chainCount, chainBuyCount: buyResult.chainCount };
1084
+ });
1085
+ // PHASE 2: Blockchain operations outside lock (batch updates, creates, read)
1086
+ // These are the heavy operations that would block all other grid operations
1087
+ // if held under _gridLock.
1088
+ const { plannedCreates, plannedUpdates, chainSellCount, chainBuyCount } = phase1Result;
1089
+ if (!dryRun && plannedUpdates.length > 0) {
1090
+ let updatePlans = plannedUpdates;
1091
+ const maxBatchAttempts = 3;
1092
+ let batchCompleted = false;
1093
+ if (supportsBatchUpdate) {
1094
+ for (let attempt = 1; attempt <= maxBatchAttempts; attempt++) {
1095
+ try {
1096
+ const batchResult = await _executeStartupUpdateBatch({
1097
+ updatePlans,
1098
+ chainOrders,
1099
+ account,
1100
+ privateKey,
1101
+ manager,
1102
+ dryRun,
1103
+ });
1104
+ if (batchResult.executed) {
1105
+ logger?.log?.(`Startup: Update batch complete (${batchResult.prepared} updated)`, 'info');
1106
+ }
1107
+ batchCompleted = true;
1108
+ break;
1109
+ }
1110
+ catch (err) {
1111
+ logger?.log?.(`Startup: Update batch attempt ${attempt}/${maxBatchAttempts} failed: ${err.message}`, 'error');
1112
+ const refreshedChainOrders = await _recoverStartupSyncFailure({
1113
+ chainOrders,
1114
+ manager,
1115
+ account,
1116
+ logger,
1117
+ triggerMessage: `Startup: Triggering recovery sync after update batch failure (attempt ${attempt}/${maxBatchAttempts})`,
1118
+ source: 'startupReconcileUpdateBatchFailure',
1119
+ fillLockAlreadyHeld,
1120
+ });
1121
+ updatePlans = _refreshStartupUpdatePlans(updatePlans, refreshedChainOrders);
1122
+ if (updatePlans.length === 0) {
1123
+ logger?.log?.('Startup: No update plans remain after recovery sync; skipping further update attempts', 'warn');
1124
+ batchCompleted = true;
1125
+ break;
1126
+ }
1127
+ if (attempt >= maxBatchAttempts) {
1128
+ logger?.log?.('Startup: Update batch retries exhausted; switching to sequential fallback', 'warn');
1129
+ break;
1130
+ }
1131
+ }
1132
+ }
1133
+ }
1134
+ else {
1135
+ logger?.log?.('Startup: Batch update helpers unavailable; using sequential fallback updates', 'warn');
1136
+ }
1137
+ if (!batchCompleted && updatePlans.length > 0) {
1138
+ try {
1139
+ const fallbackResult = await _executeStartupSequentialUpdateFallback({
1140
+ updatePlans,
1141
+ chainOrders,
1142
+ account,
1143
+ privateKey,
1144
+ manager,
1145
+ dryRun,
1146
+ fillLockAlreadyHeld,
1147
+ });
1148
+ if (fallbackResult.executed > 0 || fallbackResult.skipped > 0 || fallbackResult.failed > 0) {
1149
+ logger?.log?.(`Startup: Sequential fallback complete (updated=${fallbackResult.executed}, skipped=${fallbackResult.skipped}, failed=${fallbackResult.failed})`, fallbackResult.failed > 0 ? 'warn' : 'info');
1150
+ }
1151
+ }
1152
+ catch (err) {
1153
+ logger?.log?.(`Startup: Sequential fallback failed unexpectedly: ${err.message}`, 'error');
1154
+ }
1155
+ }
1156
+ }
1157
+ if (!dryRun && plannedCreates.length > 0) {
1158
+ await _executePlannedStartupCreates({
1159
+ createPlans: plannedCreates,
1160
+ chainOrders,
1161
+ account,
1162
+ privateKey,
1163
+ manager,
1164
+ dryRun,
1165
+ fillLockAlreadyHeld,
1166
+ });
1167
+ }
1168
+ let finalChainSellCount = chainSellCount;
1169
+ let finalChainBuyCount = chainBuyCount;
1170
+ if (!dryRun) {
1171
+ try {
1172
+ const freshOpenOrders = await chainOrders.readOpenOrders(account);
1173
+ const freshParsed = (Array.isArray(freshOpenOrders) ? freshOpenOrders : [])
1174
+ .map(co => ({ parsed: parseChainOrder(co, manager.assets) }))
1175
+ .filter(x => x.parsed);
1176
+ finalChainSellCount = freshParsed.filter(x => x.parsed.type === ORDER_TYPES.SELL).length;
1177
+ finalChainBuyCount = freshParsed.filter(x => x.parsed.type === ORDER_TYPES.BUY).length;
1178
+ }
1179
+ catch (err) {
1180
+ logger?.log?.(`Startup: Failed to refresh final chain counts: ${err.message}`, 'warn');
1181
+ }
1182
+ }
1183
+ logger && logger.log && logger.log(`Startup reconcile complete: target(sell=${targetSell}, buy=${targetBuy}), chain(sell=${finalChainSellCount}, buy=${finalChainBuyCount}), ` +
1184
+ `gridActive(sell=${_countActiveOnGrid(manager, ORDER_TYPES.SELL)}, buy=${_countActiveOnGrid(manager, ORDER_TYPES.BUY)})`, 'info');
1185
+ return null;
1186
+ }
1187
+ module.exports = {
1188
+ reconcileGridOrders,
1189
+ attemptResumePersistedGridByPriceMatch,
1190
+ decideStartupGridAction,
1191
+ };
1192
+ //# sourceMappingURL=grid_reconcile.js.map