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.
- package/LICENSE +21 -0
- package/README.md +287 -0
- package/claw/README.md +513 -0
- package/claw/scripts/memu_runner.py +385 -0
- package/claw/skills/bitshares-guide/SKILL.md +14 -0
- package/claw/skills/bitshares-guide/references/example-skill-shells.md +18 -0
- package/claw/skills/bitshares-guide/references/presentation-patterns.md +19 -0
- package/claw/skills/bitshares-guide/references/scope-guardrails.md +9 -0
- package/claw/skills/launcher-ops/SKILL.md +18 -0
- package/claw/skills/launcher-ops/references/launcher-workflow.md +23 -0
- package/claw/skills/margin-trading/SKILL.md +23 -0
- package/claw/skills/margin-trading/references/honest-asset-list.md +74 -0
- package/claw/skills/margin-trading/references/honest-assets.md +44 -0
- package/claw/skills/margin-trading/references/position-management.md +203 -0
- package/claw/skills/margin-trading/references/trading-concepts.md +80 -0
- package/claw/skills/memu-memory/SKILL.md +218 -0
- package/claw/skills/shared/references/js-automation-overview.md +24 -0
- package/claw/skills/shared/references/safety-and-staleness.md +11 -0
- package/claw/skills/shared/references/skill-boundaries.md +17 -0
- package/claw/skills/trend-detection/SKILL.md +33 -0
- package/claw/skills/trend-detection/agents/openai.yaml +3 -0
- package/claw/skills/trend-detection/references/service.md +45 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts +3 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +149 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts +3 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +387 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts +3 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js +200 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts +3 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js +212 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +31 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +249 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts +2 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js +782 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -0
- package/dist/analysis/analyze_derivatives.d.ts +95 -0
- package/dist/analysis/analyze_derivatives.d.ts.map +1 -0
- package/dist/analysis/analyze_derivatives.js +295 -0
- package/dist/analysis/analyze_derivatives.js.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts +14 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.js +208 -0
- package/dist/analysis/analyze_dynamic_weight.js.map +1 -0
- package/dist/analysis/analyze_kalman.d.ts +13 -0
- package/dist/analysis/analyze_kalman.d.ts.map +1 -0
- package/dist/analysis/analyze_kalman.js +123 -0
- package/dist/analysis/analyze_kalman.js.map +1 -0
- package/dist/analysis/analyze_regime.d.ts +20 -0
- package/dist/analysis/analyze_regime.d.ts.map +1 -0
- package/dist/analysis/analyze_regime.js +139 -0
- package/dist/analysis/analyze_regime.js.map +1 -0
- package/dist/analysis/analyze_regime_windows.d.ts +19 -0
- package/dist/analysis/analyze_regime_windows.d.ts.map +1 -0
- package/dist/analysis/analyze_regime_windows.js +413 -0
- package/dist/analysis/analyze_regime_windows.js.map +1 -0
- package/dist/analysis/analyze_risk_profile.d.ts +3 -0
- package/dist/analysis/analyze_risk_profile.d.ts.map +1 -0
- package/dist/analysis/analyze_risk_profile.js +159 -0
- package/dist/analysis/analyze_risk_profile.js.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts +3 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.js +367 -0
- package/dist/analysis/analyze_trade_heatmap.js.map +1 -0
- package/dist/analysis/analyze_volatility.d.ts +22 -0
- package/dist/analysis/analyze_volatility.d.ts.map +1 -0
- package/dist/analysis/analyze_volatility.js +172 -0
- package/dist/analysis/analyze_volatility.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +99 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js +804 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +2 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js +347 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts +15 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.js +48 -0
- package/dist/analysis/bot_fitting/shared_utils.js.map +1 -0
- package/dist/analysis/bot_key_utils.d.ts +16 -0
- package/dist/analysis/bot_key_utils.d.ts.map +1 -0
- package/dist/analysis/bot_key_utils.js +61 -0
- package/dist/analysis/bot_key_utils.js.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts +3 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js +498 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +546 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js +427 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -0
- package/dist/analysis/chart_utils.d.ts +13 -0
- package/dist/analysis/chart_utils.d.ts.map +1 -0
- package/dist/analysis/chart_utils.js +142 -0
- package/dist/analysis/chart_utils.js.map +1 -0
- package/dist/analysis/derivative_chart_generator.d.ts +18 -0
- package/dist/analysis/derivative_chart_generator.d.ts.map +1 -0
- package/dist/analysis/derivative_chart_generator.js +896 -0
- package/dist/analysis/derivative_chart_generator.js.map +1 -0
- package/dist/analysis/math_utils.d.ts +35 -0
- package/dist/analysis/math_utils.d.ts.map +1 -0
- package/dist/analysis/math_utils.js +121 -0
- package/dist/analysis/math_utils.js.map +1 -0
- package/dist/analysis/price_sources.d.ts +34 -0
- package/dist/analysis/price_sources.d.ts.map +1 -0
- package/dist/analysis/price_sources.js +103 -0
- package/dist/analysis/price_sources.js.map +1 -0
- package/dist/analysis/trade_profitability.d.ts +115 -0
- package/dist/analysis/trade_profitability.d.ts.map +1 -0
- package/dist/analysis/trade_profitability.js +1247 -0
- package/dist/analysis/trade_profitability.js.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts +38 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.js +212 -0
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +9 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1717 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts +250 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js +903 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +1449 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts +42 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js +159 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js +408 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts +103 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js +229 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts +34 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +89 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts +39 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +132 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js +345 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js +130 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +38 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js +732 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -0
- package/dist/bot.d.ts +49 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +221 -0
- package/dist/bot.js.map +1 -0
- package/dist/credential-daemon.d.ts +64 -0
- package/dist/credential-daemon.d.ts.map +1 -0
- package/dist/credential-daemon.js +987 -0
- package/dist/credential-daemon.js.map +1 -0
- package/dist/dexbot.d.ts +87 -0
- package/dist/dexbot.d.ts.map +1 -0
- package/dist/dexbot.js +1222 -0
- package/dist/dexbot.js.map +1 -0
- package/dist/market_adapter/ama_signal_runner.d.ts +3 -0
- package/dist/market_adapter/ama_signal_runner.d.ts.map +1 -0
- package/dist/market_adapter/ama_signal_runner.js +175 -0
- package/dist/market_adapter/ama_signal_runner.js.map +1 -0
- package/dist/market_adapter/candle_utils.d.ts +57 -0
- package/dist/market_adapter/candle_utils.d.ts.map +1 -0
- package/dist/market_adapter/candle_utils.js +252 -0
- package/dist/market_adapter/candle_utils.js.map +1 -0
- package/dist/market_adapter/core/asymmetric_bounds.d.ts +20 -0
- package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -0
- package/dist/market_adapter/core/asymmetric_bounds.js +88 -0
- package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -0
- package/dist/market_adapter/core/config_normalizers.d.ts +10 -0
- package/dist/market_adapter/core/config_normalizers.d.ts.map +1 -0
- package/dist/market_adapter/core/config_normalizers.js +24 -0
- package/dist/market_adapter/core/config_normalizers.js.map +1 -0
- package/dist/market_adapter/core/kibana_candles.d.ts +74 -0
- package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_candles.js +249 -0
- package/dist/market_adapter/core/kibana_candles.js.map +1 -0
- package/dist/market_adapter/core/kibana_client.d.ts +27 -0
- package/dist/market_adapter/core/kibana_client.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_client.js +120 -0
- package/dist/market_adapter/core/kibana_client.js.map +1 -0
- package/dist/market_adapter/core/kibana_market_candles.d.ts +143 -0
- package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_market_candles.js +170 -0
- package/dist/market_adapter/core/kibana_market_candles.js.map +1 -0
- package/dist/market_adapter/core/market_adapter_service.d.ts +210 -0
- package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -0
- package/dist/market_adapter/core/market_adapter_service.js +2328 -0
- package/dist/market_adapter/core/market_adapter_service.js.map +1 -0
- package/dist/market_adapter/core/strategies/ama.d.ts +2 -0
- package/dist/market_adapter/core/strategies/ama.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/ama.js +138 -0
- package/dist/market_adapter/core/strategies/ama.js.map +1 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +50 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.js +143 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -0
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts +12 -0
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/atr/calculator.js +47 -0
- package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -0
- package/dist/market_adapter/core/strategies/collateral_manager.d.ts +32 -0
- package/dist/market_adapter/core/strategies/collateral_manager.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/collateral_manager.js +68 -0
- package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -0
- package/dist/market_adapter/core/strategies/regime_gate.d.ts +66 -0
- package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/regime_gate.js +189 -0
- package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -0
- package/dist/market_adapter/index.d.ts +10 -0
- package/dist/market_adapter/index.d.ts.map +1 -0
- package/dist/market_adapter/index.js +71 -0
- package/dist/market_adapter/index.js.map +1 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts +3 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts.map +1 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1165 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -0
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +54 -0
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -0
- package/dist/market_adapter/inputs/fetch_lp_data.js +743 -0
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -0
- package/dist/market_adapter/inputs/kibana_source.d.ts +68 -0
- package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -0
- package/dist/market_adapter/inputs/kibana_source.js +143 -0
- package/dist/market_adapter/inputs/kibana_source.js.map +1 -0
- package/dist/market_adapter/interval_utils.d.ts +6 -0
- package/dist/market_adapter/interval_utils.d.ts.map +1 -0
- package/dist/market_adapter/interval_utils.js +14 -0
- package/dist/market_adapter/interval_utils.js.map +1 -0
- package/dist/market_adapter/log_format.d.ts +16 -0
- package/dist/market_adapter/log_format.d.ts.map +1 -0
- package/dist/market_adapter/log_format.js +72 -0
- package/dist/market_adapter/log_format.js.map +1 -0
- package/dist/market_adapter/lp_chart_core.d.ts +6 -0
- package/dist/market_adapter/lp_chart_core.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_core.js +874 -0
- package/dist/market_adapter/lp_chart_core.js.map +1 -0
- package/dist/market_adapter/lp_chart_runner.d.ts +135 -0
- package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_runner.js +337 -0
- package/dist/market_adapter/lp_chart_runner.js.map +1 -0
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts +23 -0
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_strategy_loader.js +169 -0
- package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -0
- package/dist/market_adapter/market_adapter.d.ts +133 -0
- package/dist/market_adapter/market_adapter.d.ts.map +1 -0
- package/dist/market_adapter/market_adapter.js +1331 -0
- package/dist/market_adapter/market_adapter.js.map +1 -0
- package/dist/market_adapter/merge_lp_data.d.ts +3 -0
- package/dist/market_adapter/merge_lp_data.d.ts.map +1 -0
- package/dist/market_adapter/merge_lp_data.js +125 -0
- package/dist/market_adapter/merge_lp_data.js.map +1 -0
- package/dist/market_adapter/test_helpers.d.ts +14 -0
- package/dist/market_adapter/test_helpers.d.ts.map +1 -0
- package/dist/market_adapter/test_helpers.js +22 -0
- package/dist/market_adapter/test_helpers.js.map +1 -0
- package/dist/market_adapter/utils/adapter_client.d.ts +20 -0
- package/dist/market_adapter/utils/adapter_client.d.ts.map +1 -0
- package/dist/market_adapter/utils/adapter_client.js +88 -0
- package/dist/market_adapter/utils/adapter_client.js.map +1 -0
- package/dist/market_adapter/utils/atomic_write.d.ts +9 -0
- package/dist/market_adapter/utils/atomic_write.d.ts.map +1 -0
- package/dist/market_adapter/utils/atomic_write.js +13 -0
- package/dist/market_adapter/utils/atomic_write.js.map +1 -0
- package/dist/market_adapter/utils/chain.d.ts +50 -0
- package/dist/market_adapter/utils/chain.d.ts.map +1 -0
- package/dist/market_adapter/utils/chain.js +196 -0
- package/dist/market_adapter/utils/chain.js.map +1 -0
- package/dist/market_adapter/utils/data_discovery.d.ts +6 -0
- package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -0
- package/dist/market_adapter/utils/data_discovery.js +35 -0
- package/dist/market_adapter/utils/data_discovery.js.map +1 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts +15 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js +60 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -0
- package/dist/market_adapter/utils/file_lock.d.ts +19 -0
- package/dist/market_adapter/utils/file_lock.d.ts.map +1 -0
- package/dist/market_adapter/utils/file_lock.js +191 -0
- package/dist/market_adapter/utils/file_lock.js.map +1 -0
- package/dist/market_adapter/utils/native_history.d.ts +19 -0
- package/dist/market_adapter/utils/native_history.d.ts.map +1 -0
- package/dist/market_adapter/utils/native_history.js +172 -0
- package/dist/market_adapter/utils/native_history.js.map +1 -0
- package/dist/market_adapter/utils/paths.d.ts +5 -0
- package/dist/market_adapter/utils/paths.d.ts.map +1 -0
- package/dist/market_adapter/utils/paths.js +7 -0
- package/dist/market_adapter/utils/paths.js.map +1 -0
- package/dist/modules/account_bots.d.ts +112 -0
- package/dist/modules/account_bots.d.ts.map +1 -0
- package/dist/modules/account_bots.js +1259 -0
- package/dist/modules/account_bots.js.map +1 -0
- package/dist/modules/account_orders.d.ts +273 -0
- package/dist/modules/account_orders.d.ts.map +1 -0
- package/dist/modules/account_orders.js +662 -0
- package/dist/modules/account_orders.js.map +1 -0
- package/dist/modules/authority_resolver.d.ts +2 -0
- package/dist/modules/authority_resolver.d.ts.map +1 -0
- package/dist/modules/authority_resolver.js +231 -0
- package/dist/modules/authority_resolver.js.map +1 -0
- package/dist/modules/bitshares-native/chain_client.d.ts +38 -0
- package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -0
- package/dist/modules/bitshares-native/chain_client.js +322 -0
- package/dist/modules/bitshares-native/chain_client.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts +59 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.js +456 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.d.ts +66 -0
- package/dist/modules/bitshares-native/crypto/ecc.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.js +557 -0
- package/dist/modules/bitshares-native/crypto/ecc.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts +2 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.js +20 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -0
- package/dist/modules/bitshares-native/index.d.ts +3 -0
- package/dist/modules/bitshares-native/index.d.ts.map +1 -0
- package/dist/modules/bitshares-native/index.js +32 -0
- package/dist/modules/bitshares-native/index.js.map +1 -0
- package/dist/modules/bitshares-native/resolvers.d.ts +40 -0
- package/dist/modules/bitshares-native/resolvers.d.ts.map +1 -0
- package/dist/modules/bitshares-native/resolvers.js +161 -0
- package/dist/modules/bitshares-native/resolvers.js.map +1 -0
- package/dist/modules/bitshares-native/serial/chain_constants.d.ts +56 -0
- package/dist/modules/bitshares-native/serial/chain_constants.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/chain_constants.js +92 -0
- package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -0
- package/dist/modules/bitshares-native/serial/index.d.ts +10 -0
- package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/index.js +14 -0
- package/dist/modules/bitshares-native/serial/index.js.map +1 -0
- package/dist/modules/bitshares-native/serial/operations.d.ts +102 -0
- package/dist/modules/bitshares-native/serial/operations.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/operations.js +615 -0
- package/dist/modules/bitshares-native/serial/operations.js.map +1 -0
- package/dist/modules/bitshares-native/serial/serializer.d.ts +64 -0
- package/dist/modules/bitshares-native/serial/serializer.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/serializer.js +252 -0
- package/dist/modules/bitshares-native/serial/serializer.js.map +1 -0
- package/dist/modules/bitshares-native/serial/types.d.ts +120 -0
- package/dist/modules/bitshares-native/serial/types.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/types.js +837 -0
- package/dist/modules/bitshares-native/serial/types.js.map +1 -0
- package/dist/modules/bitshares-native/signing_client.d.ts +6 -0
- package/dist/modules/bitshares-native/signing_client.d.ts.map +1 -0
- package/dist/modules/bitshares-native/signing_client.js +141 -0
- package/dist/modules/bitshares-native/signing_client.js.map +1 -0
- package/dist/modules/bitshares-native/subscriptions.d.ts +6 -0
- package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -0
- package/dist/modules/bitshares-native/subscriptions.js +865 -0
- package/dist/modules/bitshares-native/subscriptions.js.map +1 -0
- package/dist/modules/bitshares-native/transport.d.ts +51 -0
- package/dist/modules/bitshares-native/transport.d.ts.map +1 -0
- package/dist/modules/bitshares-native/transport.js +447 -0
- package/dist/modules/bitshares-native/transport.js.map +1 -0
- package/dist/modules/bitshares-native/tx/builder.d.ts +30 -0
- package/dist/modules/bitshares-native/tx/builder.d.ts.map +1 -0
- package/dist/modules/bitshares-native/tx/builder.js +262 -0
- package/dist/modules/bitshares-native/tx/builder.js.map +1 -0
- package/dist/modules/bitshares_client.d.ts +129 -0
- package/dist/modules/bitshares_client.d.ts.map +1 -0
- package/dist/modules/bitshares_client.js +627 -0
- package/dist/modules/bitshares_client.js.map +1 -0
- package/dist/modules/bot_settings.d.ts +33 -0
- package/dist/modules/bot_settings.d.ts.map +1 -0
- package/dist/modules/bot_settings.js +328 -0
- package/dist/modules/bot_settings.js.map +1 -0
- package/dist/modules/bots_file_lock.d.ts +88 -0
- package/dist/modules/bots_file_lock.d.ts.map +1 -0
- package/dist/modules/bots_file_lock.js +161 -0
- package/dist/modules/bots_file_lock.js.map +1 -0
- package/dist/modules/chain_keys.d.ts +302 -0
- package/dist/modules/chain_keys.d.ts.map +1 -0
- package/dist/modules/chain_keys.js +1095 -0
- package/dist/modules/chain_keys.js.map +1 -0
- package/dist/modules/chain_orders.d.ts +423 -0
- package/dist/modules/chain_orders.d.ts.map +1 -0
- package/dist/modules/chain_orders.js +1201 -0
- package/dist/modules/chain_orders.js.map +1 -0
- package/dist/modules/cli_whitelist_args.d.ts +6 -0
- package/dist/modules/cli_whitelist_args.d.ts.map +1 -0
- package/dist/modules/cli_whitelist_args.js +13 -0
- package/dist/modules/cli_whitelist_args.js.map +1 -0
- package/dist/modules/config.d.ts +57 -0
- package/dist/modules/config.d.ts.map +1 -0
- package/dist/modules/config.js +107 -0
- package/dist/modules/config.js.map +1 -0
- package/dist/modules/constants.d.ts +635 -0
- package/dist/modules/constants.d.ts.map +1 -0
- package/dist/modules/constants.js +1464 -0
- package/dist/modules/constants.js.map +1 -0
- package/dist/modules/cr_planner.d.ts +51 -0
- package/dist/modules/cr_planner.d.ts.map +1 -0
- package/dist/modules/cr_planner.js +299 -0
- package/dist/modules/cr_planner.js.map +1 -0
- package/dist/modules/credential_policy.d.ts +188 -0
- package/dist/modules/credential_policy.d.ts.map +1 -0
- package/dist/modules/credential_policy.js +1452 -0
- package/dist/modules/credential_policy.js.map +1 -0
- package/dist/modules/credential_runtime.d.ts +42 -0
- package/dist/modules/credential_runtime.d.ts.map +1 -0
- package/dist/modules/credential_runtime.js +148 -0
- package/dist/modules/credential_runtime.js.map +1 -0
- package/dist/modules/credential_session_cache.d.ts +36 -0
- package/dist/modules/credential_session_cache.d.ts.map +1 -0
- package/dist/modules/credential_session_cache.js +106 -0
- package/dist/modules/credential_session_cache.js.map +1 -0
- package/dist/modules/credit_runtime.d.ts +412 -0
- package/dist/modules/credit_runtime.d.ts.map +1 -0
- package/dist/modules/credit_runtime.js +2866 -0
- package/dist/modules/credit_runtime.js.map +1 -0
- package/dist/modules/crypto/browser_provider.d.ts +15 -0
- package/dist/modules/crypto/browser_provider.d.ts.map +1 -0
- package/dist/modules/crypto/browser_provider.js +113 -0
- package/dist/modules/crypto/browser_provider.js.map +1 -0
- package/dist/modules/crypto/index.d.ts +9 -0
- package/dist/modules/crypto/index.d.ts.map +1 -0
- package/dist/modules/crypto/index.js +44 -0
- package/dist/modules/crypto/index.js.map +1 -0
- package/dist/modules/crypto/node_provider.d.ts +15 -0
- package/dist/modules/crypto/node_provider.d.ts.map +1 -0
- package/dist/modules/crypto/node_provider.js +74 -0
- package/dist/modules/crypto/node_provider.js.map +1 -0
- package/dist/modules/crypto/provider.d.ts +34 -0
- package/dist/modules/crypto/provider.d.ts.map +1 -0
- package/dist/modules/crypto/provider.js +3 -0
- package/dist/modules/crypto/provider.js.map +1 -0
- package/dist/modules/crypto/pure_ripemd160.d.ts +8 -0
- package/dist/modules/crypto/pure_ripemd160.d.ts.map +1 -0
- package/dist/modules/crypto/pure_ripemd160.js +142 -0
- package/dist/modules/crypto/pure_ripemd160.js.map +1 -0
- package/dist/modules/crypto/pure_scrypt.d.ts +23 -0
- package/dist/modules/crypto/pure_scrypt.d.ts.map +1 -0
- package/dist/modules/crypto/pure_scrypt.js +161 -0
- package/dist/modules/crypto/pure_scrypt.js.map +1 -0
- package/dist/modules/crypto/pure_secp256k1.d.ts +29 -0
- package/dist/modules/crypto/pure_secp256k1.d.ts.map +1 -0
- package/dist/modules/crypto/pure_secp256k1.js +195 -0
- package/dist/modules/crypto/pure_secp256k1.js.map +1 -0
- package/dist/modules/crypto/sync.d.ts +13 -0
- package/dist/modules/crypto/sync.d.ts.map +1 -0
- package/dist/modules/crypto/sync.js +37 -0
- package/dist/modules/crypto/sync.js.map +1 -0
- package/dist/modules/dexbot_class.d.ts +1074 -0
- package/dist/modules/dexbot_class.d.ts.map +1 -0
- package/dist/modules/dexbot_class.js +4613 -0
- package/dist/modules/dexbot_class.js.map +1 -0
- package/dist/modules/dexbot_credential_client.d.ts +71 -0
- package/dist/modules/dexbot_credential_client.d.ts.map +1 -0
- package/dist/modules/dexbot_credential_client.js +224 -0
- package/dist/modules/dexbot_credential_client.js.map +1 -0
- package/dist/modules/dexbot_fill_runtime.d.ts +173 -0
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_fill_runtime.js +217 -0
- package/dist/modules/dexbot_fill_runtime.js.map +1 -0
- package/dist/modules/dexbot_maintenance_runtime.d.ts +279 -0
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_maintenance_runtime.js +1613 -0
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -0
- package/dist/modules/env.d.ts +12 -0
- package/dist/modules/env.d.ts.map +1 -0
- package/dist/modules/env.js +57 -0
- package/dist/modules/env.js.map +1 -0
- package/dist/modules/fund_registry.d.ts +96 -0
- package/dist/modules/fund_registry.d.ts.map +1 -0
- package/dist/modules/fund_registry.js +261 -0
- package/dist/modules/fund_registry.js.map +1 -0
- package/dist/modules/general_settings.d.ts +36 -0
- package/dist/modules/general_settings.d.ts.map +1 -0
- package/dist/modules/general_settings.js +63 -0
- package/dist/modules/general_settings.js.map +1 -0
- package/dist/modules/graceful_shutdown.d.ts +86 -0
- package/dist/modules/graceful_shutdown.d.ts.map +1 -0
- package/dist/modules/graceful_shutdown.js +164 -0
- package/dist/modules/graceful_shutdown.js.map +1 -0
- package/dist/modules/key_store.d.ts +60 -0
- package/dist/modules/key_store.d.ts.map +1 -0
- package/dist/modules/key_store.js +215 -0
- package/dist/modules/key_store.js.map +1 -0
- package/dist/modules/launcher/bot_supervisor.d.ts +84 -0
- package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -0
- package/dist/modules/launcher/bot_supervisor.js +1067 -0
- package/dist/modules/launcher/bot_supervisor.js.map +1 -0
- package/dist/modules/launcher/child_env.d.ts +9 -0
- package/dist/modules/launcher/child_env.d.ts.map +1 -0
- package/dist/modules/launcher/child_env.js +78 -0
- package/dist/modules/launcher/child_env.js.map +1 -0
- package/dist/modules/launcher/credential_bootstrap.d.ts +22 -0
- package/dist/modules/launcher/credential_bootstrap.d.ts.map +1 -0
- package/dist/modules/launcher/credential_bootstrap.js +303 -0
- package/dist/modules/launcher/credential_bootstrap.js.map +1 -0
- package/dist/modules/launcher/credential_daemon.d.ts +32 -0
- package/dist/modules/launcher/credential_daemon.d.ts.map +1 -0
- package/dist/modules/launcher/credential_daemon.js +173 -0
- package/dist/modules/launcher/credential_daemon.js.map +1 -0
- package/dist/modules/launcher/credential_secret.d.ts +6 -0
- package/dist/modules/launcher/credential_secret.d.ts.map +1 -0
- package/dist/modules/launcher/credential_secret.js +15 -0
- package/dist/modules/launcher/credential_secret.js.map +1 -0
- package/dist/modules/launcher/foreign_cred_daemon.d.ts +2 -0
- package/dist/modules/launcher/foreign_cred_daemon.d.ts.map +1 -0
- package/dist/modules/launcher/foreign_cred_daemon.js +166 -0
- package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -0
- package/dist/modules/launcher/headless_password.d.ts +8 -0
- package/dist/modules/launcher/headless_password.d.ts.map +1 -0
- package/dist/modules/launcher/headless_password.js +33 -0
- package/dist/modules/launcher/headless_password.js.map +1 -0
- package/dist/modules/launcher/launch_modes.d.ts +36 -0
- package/dist/modules/launcher/launch_modes.d.ts.map +1 -0
- package/dist/modules/launcher/launch_modes.js +129 -0
- package/dist/modules/launcher/launch_modes.js.map +1 -0
- package/dist/modules/launcher/market_adapter_runtime.d.ts +43 -0
- package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -0
- package/dist/modules/launcher/market_adapter_runtime.js +217 -0
- package/dist/modules/launcher/market_adapter_runtime.js.map +1 -0
- package/dist/modules/launcher/market_adapter_watchdog.d.ts +26 -0
- package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -0
- package/dist/modules/launcher/market_adapter_watchdog.js +214 -0
- package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -0
- package/dist/modules/launcher/monolithic_runtime.d.ts +89 -0
- package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -0
- package/dist/modules/launcher/monolithic_runtime.js +425 -0
- package/dist/modules/launcher/monolithic_runtime.js.map +1 -0
- package/dist/modules/launcher/runtime_entry.d.ts +26 -0
- package/dist/modules/launcher/runtime_entry.d.ts.map +1 -0
- package/dist/modules/launcher/runtime_entry.js +49 -0
- package/dist/modules/launcher/runtime_entry.js.map +1 -0
- package/dist/modules/launcher/status_reporting.d.ts +48 -0
- package/dist/modules/launcher/status_reporting.d.ts.map +1 -0
- package/dist/modules/launcher/status_reporting.js +113 -0
- package/dist/modules/launcher/status_reporting.js.map +1 -0
- package/dist/modules/launcher/supervisor_control.d.ts +6 -0
- package/dist/modules/launcher/supervisor_control.d.ts.map +1 -0
- package/dist/modules/launcher/supervisor_control.js +59 -0
- package/dist/modules/launcher/supervisor_control.js.map +1 -0
- package/dist/modules/logger.d.ts +2 -0
- package/dist/modules/logger.d.ts.map +1 -0
- package/dist/modules/logger.js +71 -0
- package/dist/modules/logger.js.map +1 -0
- package/dist/modules/market_adapter_whitelist.d.ts +22 -0
- package/dist/modules/market_adapter_whitelist.d.ts.map +1 -0
- package/dist/modules/market_adapter_whitelist.js +82 -0
- package/dist/modules/market_adapter_whitelist.js.map +1 -0
- package/dist/modules/node_health_cache.d.ts +55 -0
- package/dist/modules/node_health_cache.d.ts.map +1 -0
- package/dist/modules/node_health_cache.js +134 -0
- package/dist/modules/node_health_cache.js.map +1 -0
- package/dist/modules/node_manager.d.ts +215 -0
- package/dist/modules/node_manager.d.ts.map +1 -0
- package/dist/modules/node_manager.js +628 -0
- package/dist/modules/node_manager.js.map +1 -0
- package/dist/modules/order/accounting.d.ts +349 -0
- package/dist/modules/order/accounting.d.ts.map +1 -0
- package/dist/modules/order/accounting.js +1191 -0
- package/dist/modules/order/accounting.js.map +1 -0
- package/dist/modules/order/async_lock.d.ts +126 -0
- package/dist/modules/order/async_lock.d.ts.map +1 -0
- package/dist/modules/order/async_lock.js +195 -0
- package/dist/modules/order/async_lock.js.map +1 -0
- package/dist/modules/order/export.d.ts +129 -0
- package/dist/modules/order/export.d.ts.map +1 -0
- package/dist/modules/order/export.js +316 -0
- package/dist/modules/order/export.js.map +1 -0
- package/dist/modules/order/format.d.ts +158 -0
- package/dist/modules/order/format.d.ts.map +1 -0
- package/dist/modules/order/format.js +232 -0
- package/dist/modules/order/format.js.map +1 -0
- package/dist/modules/order/grid.d.ts +549 -0
- package/dist/modules/order/grid.d.ts.map +1 -0
- package/dist/modules/order/grid.js +1746 -0
- package/dist/modules/order/grid.js.map +1 -0
- package/dist/modules/order/grid_reconcile.d.ts +154 -0
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -0
- package/dist/modules/order/grid_reconcile.js +1192 -0
- package/dist/modules/order/grid_reconcile.js.map +1 -0
- package/dist/modules/order/index.d.ts +55 -0
- package/dist/modules/order/index.d.ts.map +1 -0
- package/dist/modules/order/index.js +79 -0
- package/dist/modules/order/index.js.map +1 -0
- package/dist/modules/order/logger.d.ts +136 -0
- package/dist/modules/order/logger.d.ts.map +1 -0
- package/dist/modules/order/logger.js +614 -0
- package/dist/modules/order/logger.js.map +1 -0
- package/dist/modules/order/logger_state.d.ts +133 -0
- package/dist/modules/order/logger_state.d.ts.map +1 -0
- package/dist/modules/order/logger_state.js +170 -0
- package/dist/modules/order/logger_state.js.map +1 -0
- package/dist/modules/order/manager.d.ts +413 -0
- package/dist/modules/order/manager.d.ts.map +1 -0
- package/dist/modules/order/manager.js +1605 -0
- package/dist/modules/order/manager.js.map +1 -0
- package/dist/modules/order/processed_fill_store.d.ts +135 -0
- package/dist/modules/order/processed_fill_store.d.ts.map +1 -0
- package/dist/modules/order/processed_fill_store.js +288 -0
- package/dist/modules/order/processed_fill_store.js.map +1 -0
- package/dist/modules/order/runner.d.ts +70 -0
- package/dist/modules/order/runner.d.ts.map +1 -0
- package/dist/modules/order/runner.js +140 -0
- package/dist/modules/order/runner.js.map +1 -0
- package/dist/modules/order/strategy.d.ts +196 -0
- package/dist/modules/order/strategy.d.ts.map +1 -0
- package/dist/modules/order/strategy.js +398 -0
- package/dist/modules/order/strategy.js.map +1 -0
- package/dist/modules/order/sync_engine.d.ts +386 -0
- package/dist/modules/order/sync_engine.d.ts.map +1 -0
- package/dist/modules/order/sync_engine.js +1459 -0
- package/dist/modules/order/sync_engine.js.map +1 -0
- package/dist/modules/order/utils/math.d.ts +677 -0
- package/dist/modules/order/utils/math.d.ts.map +1 -0
- package/dist/modules/order/utils/math.js +1172 -0
- package/dist/modules/order/utils/math.js.map +1 -0
- package/dist/modules/order/utils/order.d.ts +572 -0
- package/dist/modules/order/utils/order.d.ts.map +1 -0
- package/dist/modules/order/utils/order.js +1145 -0
- package/dist/modules/order/utils/order.js.map +1 -0
- package/dist/modules/order/utils/system.d.ts +268 -0
- package/dist/modules/order/utils/system.d.ts.map +1 -0
- package/dist/modules/order/utils/system.js +1261 -0
- package/dist/modules/order/utils/system.js.map +1 -0
- package/dist/modules/order/utils/validate.d.ts +280 -0
- package/dist/modules/order/utils/validate.d.ts.map +1 -0
- package/dist/modules/order/utils/validate.js +918 -0
- package/dist/modules/order/utils/validate.js.map +1 -0
- package/dist/modules/order/working_grid.d.ts +212 -0
- package/dist/modules/order/working_grid.d.ts.map +1 -0
- package/dist/modules/order/working_grid.js +279 -0
- package/dist/modules/order/working_grid.js.map +1 -0
- package/dist/modules/path_api.d.ts +32 -0
- package/dist/modules/path_api.d.ts.map +1 -0
- package/dist/modules/path_api.js +148 -0
- package/dist/modules/path_api.js.map +1 -0
- package/dist/modules/paths.d.ts +58 -0
- package/dist/modules/paths.d.ts.map +1 -0
- package/dist/modules/paths.js +82 -0
- package/dist/modules/paths.js.map +1 -0
- package/dist/modules/process_discovery.d.ts +58 -0
- package/dist/modules/process_discovery.d.ts.map +1 -0
- package/dist/modules/process_discovery.js +265 -0
- package/dist/modules/process_discovery.js.map +1 -0
- package/dist/modules/runtime.d.ts +34 -0
- package/dist/modules/runtime.d.ts.map +1 -0
- package/dist/modules/runtime.js +98 -0
- package/dist/modules/runtime.js.map +1 -0
- package/dist/modules/runtime_settings.d.ts +12 -0
- package/dist/modules/runtime_settings.d.ts.map +1 -0
- package/dist/modules/runtime_settings.js +122 -0
- package/dist/modules/runtime_settings.js.map +1 -0
- package/dist/modules/settings_merge.d.ts +38 -0
- package/dist/modules/settings_merge.d.ts.map +1 -0
- package/dist/modules/settings_merge.js +246 -0
- package/dist/modules/settings_merge.js.map +1 -0
- package/dist/modules/storage/browser_adapter.d.ts +56 -0
- package/dist/modules/storage/browser_adapter.d.ts.map +1 -0
- package/dist/modules/storage/browser_adapter.js +231 -0
- package/dist/modules/storage/browser_adapter.js.map +1 -0
- package/dist/modules/storage/index.d.ts +28 -0
- package/dist/modules/storage/index.d.ts.map +1 -0
- package/dist/modules/storage/index.js +52 -0
- package/dist/modules/storage/index.js.map +1 -0
- package/dist/modules/storage/node_adapter.d.ts +49 -0
- package/dist/modules/storage/node_adapter.d.ts.map +1 -0
- package/dist/modules/storage/node_adapter.js +167 -0
- package/dist/modules/storage/node_adapter.js.map +1 -0
- package/dist/modules/storage/types.d.ts +92 -0
- package/dist/modules/storage/types.d.ts.map +1 -0
- package/dist/modules/storage/types.js +3 -0
- package/dist/modules/storage/types.js.map +1 -0
- package/dist/modules/types.d.ts +1382 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +11 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/modules/utils/base58check.d.ts +12 -0
- package/dist/modules/utils/base58check.d.ts.map +1 -0
- package/dist/modules/utils/base58check.js +112 -0
- package/dist/modules/utils/base58check.js.map +1 -0
- package/dist/modules/utils/build_dir.d.ts +7 -0
- package/dist/modules/utils/build_dir.d.ts.map +1 -0
- package/dist/modules/utils/build_dir.js +8 -0
- package/dist/modules/utils/build_dir.js.map +1 -0
- package/dist/modules/utils/fs_utils.d.ts +25 -0
- package/dist/modules/utils/fs_utils.d.ts.map +1 -0
- package/dist/modules/utils/fs_utils.js +27 -0
- package/dist/modules/utils/fs_utils.js.map +1 -0
- package/dist/modules/utils/math_utils.d.ts +10 -0
- package/dist/modules/utils/math_utils.d.ts.map +1 -0
- package/dist/modules/utils/math_utils.js +17 -0
- package/dist/modules/utils/math_utils.js.map +1 -0
- package/dist/modules/validate_profiles.d.ts +37 -0
- package/dist/modules/validate_profiles.d.ts.map +1 -0
- package/dist/modules/validate_profiles.js +369 -0
- package/dist/modules/validate_profiles.js.map +1 -0
- package/dist/pm2.d.ts +167 -0
- package/dist/pm2.d.ts.map +1 -0
- package/dist/pm2.js +998 -0
- package/dist/pm2.js.map +1 -0
- package/dist/scripts/analyze-git.d.ts +11 -0
- package/dist/scripts/analyze-git.d.ts.map +1 -0
- package/dist/scripts/analyze-git.js +851 -0
- package/dist/scripts/analyze-git.js.map +1 -0
- package/dist/scripts/analyze-orders.d.ts +17 -0
- package/dist/scripts/analyze-orders.d.ts.map +1 -0
- package/dist/scripts/analyze-orders.js +1568 -0
- package/dist/scripts/analyze-orders.js.map +1 -0
- package/dist/scripts/diagnose-kibana-candles.d.ts +3 -0
- package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -0
- package/dist/scripts/diagnose-kibana-candles.js +82 -0
- package/dist/scripts/diagnose-kibana-candles.js.map +1 -0
- package/dist/scripts/diagnose-pool-history.d.ts +3 -0
- package/dist/scripts/diagnose-pool-history.d.ts.map +1 -0
- package/dist/scripts/diagnose-pool-history.js +296 -0
- package/dist/scripts/diagnose-pool-history.js.map +1 -0
- package/dist/scripts/divergence-calc.d.ts +26 -0
- package/dist/scripts/divergence-calc.d.ts.map +1 -0
- package/dist/scripts/divergence-calc.js +119 -0
- package/dist/scripts/divergence-calc.js.map +1 -0
- package/dist/scripts/generate_lp_chart.d.ts +31 -0
- package/dist/scripts/generate_lp_chart.d.ts.map +1 -0
- package/dist/scripts/generate_lp_chart.js +92 -0
- package/dist/scripts/generate_lp_chart.js.map +1 -0
- package/dist/scripts/generate_mainnet_corpus_report.d.ts +24 -0
- package/dist/scripts/generate_mainnet_corpus_report.d.ts.map +1 -0
- package/dist/scripts/generate_mainnet_corpus_report.js +237 -0
- package/dist/scripts/generate_mainnet_corpus_report.js.map +1 -0
- package/dist/scripts/generate_market_adapter_whitelist.d.ts +2 -0
- package/dist/scripts/generate_market_adapter_whitelist.d.ts.map +1 -0
- package/dist/scripts/generate_market_adapter_whitelist.js +111 -0
- package/dist/scripts/generate_market_adapter_whitelist.js.map +1 -0
- package/dist/scripts/migrate_bot_keys.d.ts +6 -0
- package/dist/scripts/migrate_bot_keys.d.ts.map +1 -0
- package/dist/scripts/migrate_bot_keys.js +301 -0
- package/dist/scripts/migrate_bot_keys.js.map +1 -0
- package/dist/scripts/native_release_gates.d.ts +3 -0
- package/dist/scripts/native_release_gates.d.ts.map +1 -0
- package/dist/scripts/native_release_gates.js +52 -0
- package/dist/scripts/native_release_gates.js.map +1 -0
- package/dist/scripts/print_grid.d.ts +16 -0
- package/dist/scripts/print_grid.d.ts.map +1 -0
- package/dist/scripts/print_grid.js +80 -0
- package/dist/scripts/print_grid.js.map +1 -0
- package/dist/scripts/run-tests.d.ts +2 -0
- package/dist/scripts/run-tests.d.ts.map +1 -0
- package/dist/scripts/run-tests.js +49 -0
- package/dist/scripts/run-tests.js.map +1 -0
- package/dist/scripts/sync-version.d.ts +14 -0
- package/dist/scripts/sync-version.d.ts.map +1 -0
- package/dist/scripts/sync-version.js +158 -0
- package/dist/scripts/sync-version.js.map +1 -0
- package/dist/scripts/test-credit-renewal.d.ts +2 -0
- package/dist/scripts/test-credit-renewal.d.ts.map +1 -0
- package/dist/scripts/test-credit-renewal.js +329 -0
- package/dist/scripts/test-credit-renewal.js.map +1 -0
- package/dist/scripts/update.d.ts +24 -0
- package/dist/scripts/update.d.ts.map +1 -0
- package/dist/scripts/update.js +650 -0
- package/dist/scripts/update.js.map +1 -0
- package/dist/scripts/validate_bots.d.ts +16 -0
- package/dist/scripts/validate_bots.d.ts.map +1 -0
- package/dist/scripts/validate_bots.js +106 -0
- package/dist/scripts/validate_bots.js.map +1 -0
- package/dist/scripts/verify-browser-bundle.d.ts +22 -0
- package/dist/scripts/verify-browser-bundle.d.ts.map +1 -0
- package/dist/scripts/verify-browser-bundle.js +339 -0
- package/dist/scripts/verify-browser-bundle.js.map +1 -0
- package/dist/unlock.d.ts +48 -0
- package/dist/unlock.d.ts.map +1 -0
- package/dist/unlock.js +925 -0
- package/dist/unlock.js.map +1 -0
- package/package.json +112 -0
- package/scripts/README.md +356 -0
- package/scripts/clear-all.sh +195 -0
- package/scripts/clear-logs.sh +95 -0
- package/scripts/clear-market-adapter.sh +196 -0
- package/scripts/clear-orders.sh +113 -0
- package/scripts/create-bot-symlinks.sh +51 -0
- package/scripts/postinstall.js +9 -0
- package/scripts/reset-settings.sh +118 -0
|
@@ -0,0 +1,1145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* modules/order/utils/order.ts - Order Domain Utilities
|
|
4
|
+
*
|
|
5
|
+
* Business rules for orders, state predicates, filtering, and reconciliation.
|
|
6
|
+
* Includes grid indexing, order comparison, delta building, and strategy calculations.
|
|
7
|
+
*
|
|
8
|
+
* ===============================================================================
|
|
9
|
+
* TABLE OF CONTENTS (37 exported functions)
|
|
10
|
+
* ===============================================================================
|
|
11
|
+
*
|
|
12
|
+
* SECTION 1: CHAIN ORDER MATCHING & RECONCILIATION (5 functions)
|
|
13
|
+
* - parseChainOrder(chainOrder, assets) - Parse blockchain order to grid format
|
|
14
|
+
* - findMatchingGridOrderByOpenOrder(parsedChainOrder, opts) - Find matching grid order
|
|
15
|
+
* - applyChainSizeToGridOrder(manager, gridOrder, chainSize) - Apply chain size to grid
|
|
16
|
+
* - correctOrderPriceOnChain(manager, correctionInfo, ...) - Correct order price on chain
|
|
17
|
+
* - correctAllPriceMismatches(manager, accountName, ...) - Correct all price mismatches
|
|
18
|
+
*
|
|
19
|
+
* SECTION 2: ORDER CONSTRUCTION (3 functions)
|
|
20
|
+
* - buildCreateOrderArgs(order, assetA, assetB) - Build create order arguments
|
|
21
|
+
* - getOrderTypeFromUpdatedFlags(buyUpdated, sellUpdated) - Get type from update flags
|
|
22
|
+
* - resolveConfiguredPriceBound(value, fallback, startPrice, mode) - Resolve price bounds
|
|
23
|
+
* - buildFillKey(fillOrParts) - Build a stable fill dedupe key
|
|
24
|
+
* - buildCreateOpFingerprint(params) - Build fingerprint for create operations
|
|
25
|
+
*
|
|
26
|
+
* SECTION 3: STATE TRANSITIONS (2 functions)
|
|
27
|
+
* - virtualizeOrder(order) - Convert order to VIRTUAL state
|
|
28
|
+
* - convertToSpreadPlaceholder(order) - Convert order to SPREAD placeholder
|
|
29
|
+
*
|
|
30
|
+
* SECTION 4: FILTERING & COUNTING (5 functions)
|
|
31
|
+
* - filterOrdersByType(orders, orderType) - Filter orders by type
|
|
32
|
+
|
|
33
|
+
* - buildOutsideInPairGroups(items, accessors) - Outside->center pair grouping
|
|
34
|
+
* - extractBatchOperationResults(result) - Extract operation_results from chain batch result
|
|
35
|
+
* - formatUnmatchedChainOrder(order) - Format structural drift diagnostics
|
|
36
|
+
*
|
|
37
|
+
* SECTION 5: STATE PREDICATES (7 functions)
|
|
38
|
+
* - isOrderOnChain(order) - Check if order is ACTIVE or PARTIAL
|
|
39
|
+
* - isOrderVirtual(order) - Check if order is VIRTUAL
|
|
40
|
+
* - hasOnChainId(order) - Check if order has blockchain orderId
|
|
41
|
+
* - isOrderPlaced(order) - Check if order is placed on chain
|
|
42
|
+
* - isPhantomOrder(order) - Check if order is phantom (ACTIVE without orderId)
|
|
43
|
+
* - isSlotAvailable(order) - Check if slot is available for placement
|
|
44
|
+
* - isOrderHealthy(order, context) - Comprehensive order health check
|
|
45
|
+
*
|
|
46
|
+
* SECTION 6: SIZE VALIDATION (2 functions)
|
|
47
|
+
* - checkSizeThreshold(size, threshold) - Check if size exceeds threshold
|
|
48
|
+
* - checkSizesBeforeMinimum(sizes, minSize) - Check sizes against minimum
|
|
49
|
+
*
|
|
50
|
+
* SECTION 7: GRID BOUNDARY & ROLES (4 functions)
|
|
51
|
+
* - calculateIdealBoundary(allSlots, startPrice, gapSlots) - Calculate ideal boundary
|
|
52
|
+
* - calculateFundDrivenBoundary(allSlots, availA, availB, startPrice, gapSlots) - Fund-driven boundary
|
|
53
|
+
* - assignGridRoles(allSlots, boundaryIdx, gapSlots, ...) - Assign BUY/SELL roles
|
|
54
|
+
* - shouldFlagOutOfSpread(order, startPrice, configSpread) - Check if order is out of spread
|
|
55
|
+
*
|
|
56
|
+
* SECTION 8: GRID INDEXING (2 functions)
|
|
57
|
+
* - buildIndexes(grid) - Build complete index set from grid
|
|
58
|
+
* - validateIndexes(grid, indexes) - Validate index consistency
|
|
59
|
+
*
|
|
60
|
+
* SECTION 9: ORDER COMPARISON & DELTA (3 functions)
|
|
61
|
+
* - ordersEqual(a, b) - Compare two orders for equality
|
|
62
|
+
* - buildDelta(masterGrid, workingGrid) - Build delta actions between grids
|
|
63
|
+
* - getOrderSize(order) - Extract order size with fallback
|
|
64
|
+
*
|
|
65
|
+
* SECTION 10: STRATEGY CALCULATIONS (3 functions)
|
|
66
|
+
* - deriveTargetBoundary(fills, currentBoundaryIdx, allSlots, config, gapSlots) - Derive boundary from fills
|
|
67
|
+
* - getSideBudget(side, funds, config, totalTarget) - Calculate side budget after fees
|
|
68
|
+
* - calculateBudgetedSizes(slots, side, budget, weightDist, incrementPercent, assets) - Calculate budgeted sizes
|
|
69
|
+
*
|
|
70
|
+
* ===============================================================================
|
|
71
|
+
*/
|
|
72
|
+
const { ORDER_TYPES, ORDER_STATES, TIMING, FEE_PARAMETERS, GRID_LIMITS } = require('../../constants');
|
|
73
|
+
const Format = require('../format');
|
|
74
|
+
const { isValidNumber, toFiniteNumber } = Format;
|
|
75
|
+
const MathUtils = require('./math');
|
|
76
|
+
const { blockchainToFloat, floatToBlockchainInt, quantizeFloat } = MathUtils;
|
|
77
|
+
const Logger = require('../../logger');
|
|
78
|
+
const orderLogger = new Logger('Order');
|
|
79
|
+
// ================================================================================
|
|
80
|
+
// SECTION 1: CHAIN ORDER MATCHING & RECONCILIATION
|
|
81
|
+
// ================================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Parse blockchain order into standard grid order format.
|
|
84
|
+
* Extracts price, type (BUY/SELL), and size from blockchain order structure.
|
|
85
|
+
* Handles precision scaling between assets.
|
|
86
|
+
*
|
|
87
|
+
* @param {Object} chainOrder - Order from blockchain with sell_price and for_sale
|
|
88
|
+
* @param {Object} assets - Asset metadata with assetA, assetB, and precisions
|
|
89
|
+
* @returns {Object|null} Parsed order {orderId, price, type, size} or null if invalid
|
|
90
|
+
*/
|
|
91
|
+
function parseChainOrder(chainOrder, assets) {
|
|
92
|
+
if (!chainOrder || !chainOrder.sell_price || !assets)
|
|
93
|
+
return null;
|
|
94
|
+
const { base, quote } = chainOrder.sell_price;
|
|
95
|
+
if (!base || !quote || !base.asset_id || !quote.asset_id || base.amount === 0)
|
|
96
|
+
return null;
|
|
97
|
+
let price;
|
|
98
|
+
let type;
|
|
99
|
+
const precisionDelta = assets.assetA.precision - assets.assetB.precision;
|
|
100
|
+
const scaleFactor = precisionDelta >= 0
|
|
101
|
+
? Math.pow(10, precisionDelta)
|
|
102
|
+
: Math.pow(10, Math.abs(precisionDelta));
|
|
103
|
+
if (base.asset_id === assets.assetA.id && quote.asset_id === assets.assetB.id) {
|
|
104
|
+
price = precisionDelta >= 0
|
|
105
|
+
? (quote.amount / base.amount) * scaleFactor
|
|
106
|
+
: (quote.amount / base.amount) / scaleFactor;
|
|
107
|
+
type = ORDER_TYPES.SELL;
|
|
108
|
+
}
|
|
109
|
+
else if (base.asset_id === assets.assetB.id && quote.asset_id === assets.assetA.id) {
|
|
110
|
+
price = precisionDelta >= 0
|
|
111
|
+
? (base.amount / quote.amount) * scaleFactor
|
|
112
|
+
: (base.amount / quote.amount) / scaleFactor;
|
|
113
|
+
type = ORDER_TYPES.BUY;
|
|
114
|
+
}
|
|
115
|
+
else
|
|
116
|
+
return null;
|
|
117
|
+
let size;
|
|
118
|
+
try {
|
|
119
|
+
if (chainOrder.for_sale !== undefined && chainOrder.for_sale !== null) {
|
|
120
|
+
const prec = (type === ORDER_TYPES.SELL) ? assets.assetA.precision : assets.assetB.precision;
|
|
121
|
+
size = blockchainToFloat(toFiniteNumber(chainOrder.for_sale), prec);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
orderLogger.warn(`parseChainOrder failed for ${chainOrder?.id}: ${e.message}`);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return { orderId: chainOrder.id, price, type, size };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Find grid order matching a blockchain order.
|
|
132
|
+
* First tries exact orderId match, then falls back to price/size matching within tolerance.
|
|
133
|
+
* Used during synchronization to link blockchain orders to grid slots.
|
|
134
|
+
*
|
|
135
|
+
* @param {Object} parsedChainOrder - Parsed blockchain order {orderId, price, type, size}
|
|
136
|
+
* @param {Object} [opts={}] - Options object
|
|
137
|
+
* @param {Map} [opts.orders] - Grid orders map to search
|
|
138
|
+
* @param {Object} [opts.assets] - Asset metadata for precision
|
|
139
|
+
* @param {Function} [opts.calcToleranceFn] - Function to calculate price tolerance
|
|
140
|
+
* @param {Object} [opts.logger] - Optional logger
|
|
141
|
+
* @param {boolean} [opts.skipSizeMatch=false] - Skip size matching check
|
|
142
|
+
* @param {boolean} [opts.allowSmallerChainSize=false] - Allow chain order to be smaller
|
|
143
|
+
* @param {boolean} [opts.requireAvailableSlot=false] - Skip slots already bound to a different chain order
|
|
144
|
+
* @param {Set<string>} [opts.excludeGridOrderIds] - Skip grid slot ids already assigned in this sync pass
|
|
145
|
+
* @returns {Object|null} Matching grid order or null if no match found
|
|
146
|
+
*/
|
|
147
|
+
function findMatchingGridOrderByOpenOrder(parsedChainOrder, opts) {
|
|
148
|
+
const { orders, assets, calcToleranceFn, logger } = opts || {};
|
|
149
|
+
if (!parsedChainOrder || !orders)
|
|
150
|
+
return null;
|
|
151
|
+
if (parsedChainOrder.orderId) {
|
|
152
|
+
for (const gridOrder of orders.values()) {
|
|
153
|
+
if (gridOrder?.orderId === parsedChainOrder.orderId)
|
|
154
|
+
return gridOrder;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const chainSize = toFiniteNumber(parsedChainOrder.size);
|
|
158
|
+
const chainPrice = toFiniteNumber(parsedChainOrder.price);
|
|
159
|
+
const isSell = parsedChainOrder.type === ORDER_TYPES.SELL;
|
|
160
|
+
const precision = isSell ? assets?.assetA?.precision : assets?.assetB?.precision;
|
|
161
|
+
if (typeof precision !== 'number')
|
|
162
|
+
return null;
|
|
163
|
+
const chainInt = floatToBlockchainInt(chainSize, precision);
|
|
164
|
+
let bestMatch = null;
|
|
165
|
+
let bestPriceDiff = Infinity;
|
|
166
|
+
for (const gridOrder of orders.values()) {
|
|
167
|
+
const typeMatch = gridOrder?.type === parsedChainOrder.type ||
|
|
168
|
+
(opts?.allowSpreadType && gridOrder?.type === ORDER_TYPES.SPREAD);
|
|
169
|
+
if (!gridOrder || !typeMatch)
|
|
170
|
+
continue;
|
|
171
|
+
if (opts?.excludeGridOrderIds?.has?.(gridOrder.id))
|
|
172
|
+
continue;
|
|
173
|
+
if (![ORDER_STATES.ACTIVE, ORDER_STATES.PARTIAL, ORDER_STATES.VIRTUAL].includes(gridOrder.state))
|
|
174
|
+
continue;
|
|
175
|
+
if (opts?.requireAvailableSlot && gridOrder.orderId && gridOrder.orderId !== parsedChainOrder.orderId)
|
|
176
|
+
continue;
|
|
177
|
+
const priceDiff = Math.abs(gridOrder.price - chainPrice);
|
|
178
|
+
// Virtual/spread slots have size=0 — fall back to chain order's size so the
|
|
179
|
+
// precision-based tolerance is meaningful instead of collapsing to 0.
|
|
180
|
+
const effectiveSize = gridOrder.size > 0 ? gridOrder.size : chainSize;
|
|
181
|
+
// When calcToleranceFn returns null (e.g. zero-size virtual slot), fall back to
|
|
182
|
+
// exact matching (tolerance=0). This is intentional — virtual/spread slots should
|
|
183
|
+
// only match chain orders at exactly their grid price.
|
|
184
|
+
const priceTolerance = calcToleranceFn?.(gridOrder.price, effectiveSize, parsedChainOrder.type) || 0;
|
|
185
|
+
if (priceDiff > priceTolerance)
|
|
186
|
+
continue;
|
|
187
|
+
const gridInt = floatToBlockchainInt(gridOrder.size, precision);
|
|
188
|
+
const sizeMismatch = opts?.allowSmallerChainSize ? (chainInt > gridInt + 1) : (Math.abs(gridInt - chainInt) > 1);
|
|
189
|
+
if (!opts?.skipSizeMatch && sizeMismatch)
|
|
190
|
+
continue;
|
|
191
|
+
if (priceDiff < bestPriceDiff) {
|
|
192
|
+
bestPriceDiff = priceDiff;
|
|
193
|
+
bestMatch = gridOrder;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return bestMatch;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Update grid order size based on blockchain state.
|
|
200
|
+
* Detects partial fills and updates accounting if size changed.
|
|
201
|
+
* Skips dust refills (prevents unnecessary sync when size decreases).
|
|
202
|
+
*
|
|
203
|
+
* Returns the updated order object or null if no update needed.
|
|
204
|
+
*
|
|
205
|
+
* @param {Object} manager - OrderManager instance
|
|
206
|
+
* @param {Object} gridOrder - Grid order to update
|
|
207
|
+
* @param {number} chainSize - Size from blockchain
|
|
208
|
+
* @returns {Promise<Object|null>} Updated order object or null
|
|
209
|
+
* @throws {Error} If chainSize suspicious (possible data corruption)
|
|
210
|
+
*/
|
|
211
|
+
async function applyChainSizeToGridOrder(manager, gridOrder, chainSize) {
|
|
212
|
+
if (!manager || !gridOrder)
|
|
213
|
+
return null;
|
|
214
|
+
if (gridOrder.state !== ORDER_STATES.ACTIVE && gridOrder.state !== ORDER_STATES.PARTIAL)
|
|
215
|
+
return null;
|
|
216
|
+
const precision = (gridOrder.type === ORDER_TYPES.SELL) ? manager.assets?.assetA?.precision : manager.assets?.assetB?.precision;
|
|
217
|
+
if (isValidNumber(precision) && isValidNumber(chainSize)) {
|
|
218
|
+
const SUSPICIOUS_SATOSHI_LIMIT = 1e15;
|
|
219
|
+
const suspiciousThreshold = SUSPICIOUS_SATOSHI_LIMIT / Math.pow(10, precision);
|
|
220
|
+
if (Math.abs(toFiniteNumber(chainSize)) > suspiciousThreshold) {
|
|
221
|
+
const msg = `CRITICAL: suspicious chainSize=${chainSize} exceeds limit ${suspiciousThreshold}. Possible blockchain sync error or data corruption.`;
|
|
222
|
+
manager.logger?.log?.(msg, 'error');
|
|
223
|
+
throw new Error(msg);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const oldSize = toFiniteNumber(gridOrder.size);
|
|
227
|
+
const newSize = isValidNumber(chainSize) ? toFiniteNumber(chainSize) : oldSize;
|
|
228
|
+
if (gridOrder.isDustRefill && newSize < oldSize) {
|
|
229
|
+
const oldInt = floatToBlockchainInt(oldSize, precision);
|
|
230
|
+
const newInt = floatToBlockchainInt(newSize, precision);
|
|
231
|
+
const deltaInt = Math.max(0, oldInt - newInt);
|
|
232
|
+
// Ignore only negligible one-unit quantization noise on dust refill orders.
|
|
233
|
+
// Real decreases must still be synchronized to avoid stuck PARTIAL states.
|
|
234
|
+
if (deltaInt <= 1)
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
if (floatToBlockchainInt(oldSize, precision) === floatToBlockchainInt(newSize, precision)) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
const updatedOrder = { ...gridOrder, size: newSize };
|
|
241
|
+
const delta = newSize - oldSize;
|
|
242
|
+
if (delta < 0 && manager.logger) {
|
|
243
|
+
if (typeof manager.logger.logFundsStatus === 'function')
|
|
244
|
+
manager.logger.logFundsStatus(manager);
|
|
245
|
+
}
|
|
246
|
+
return updatedOrder;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Build a stable fill dedupe key.
|
|
250
|
+
* Accepts either a fill-history entry or explicit parts.
|
|
251
|
+
* Returns null if required fields are missing — callers should
|
|
252
|
+
* skip dedup rather than operate on a degraded key.
|
|
253
|
+
*
|
|
254
|
+
* @param {Object} fillOrParts - Fill entry ({ op, block_num, id }) or { orderId, blockNum, historyId }
|
|
255
|
+
* @returns {string|null} Stable key in order:block:history form, or null if fields are missing
|
|
256
|
+
*/
|
|
257
|
+
function buildFillKey(fillOrParts) {
|
|
258
|
+
const fillOp = fillOrParts?.op?.[1];
|
|
259
|
+
const orderId = fillOp?.order_id ?? fillOrParts?.orderId;
|
|
260
|
+
const blockNum = fillOrParts?.block_num ?? fillOrParts?.blockNum;
|
|
261
|
+
const historyId = fillOrParts?.id ?? fillOrParts?.historyId;
|
|
262
|
+
if (!orderId || blockNum == null || !historyId)
|
|
263
|
+
return null;
|
|
264
|
+
return `${orderId}:${blockNum}:${historyId}`;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Correct a single order's price on blockchain.
|
|
268
|
+
* Cancels surplus orders; updates price for others.
|
|
269
|
+
* Removes from correction queue after processing.
|
|
270
|
+
*
|
|
271
|
+
* @param {Object} manager - OrderManager instance
|
|
272
|
+
* @param {Object} correctionInfo - Correction details {gridOrder, chainOrderId, expectedPrice, size, type, isSurplus}
|
|
273
|
+
* @param {string} accountName - Account name for blockchain transaction
|
|
274
|
+
* @param {string} privateKey - Private key for signing
|
|
275
|
+
* @param {Object} accountOrders - AccountOrders accessor for blockchain ops
|
|
276
|
+
* @returns {Promise<Object>} Result {success, cancelled, skipped, error, orderGone}
|
|
277
|
+
*/
|
|
278
|
+
async function correctOrderPriceOnChain(manager, correctionInfo, accountName, privateKey, accountOrders) {
|
|
279
|
+
const { gridOrder, chainOrderId, expectedPrice, size, type, isSurplus } = correctionInfo;
|
|
280
|
+
const stillNeeded = manager.ordersNeedingPriceCorrection?.some(c => c.chainOrderId === chainOrderId);
|
|
281
|
+
if (!stillNeeded)
|
|
282
|
+
return { success: true, skipped: true };
|
|
283
|
+
// Surplus/type-mismatch entries need cancellation, not a price update
|
|
284
|
+
if (isSurplus) {
|
|
285
|
+
try {
|
|
286
|
+
const sideLabel = type === ORDER_TYPES.SELL ? 'SELL' : 'BUY';
|
|
287
|
+
manager.logger?.log?.(`[CORRECTION] Cancelling surplus/mismatched ${sideLabel} order ${chainOrderId} for slot ${gridOrder?.id || 'unknown'}`, 'info');
|
|
288
|
+
await accountOrders.cancelOrder(accountName, privateKey, chainOrderId);
|
|
289
|
+
if (gridOrder && manager._applyOrderUpdate) {
|
|
290
|
+
const spreadOrder = convertToSpreadPlaceholder(gridOrder);
|
|
291
|
+
await manager._applyOrderUpdate(spreadOrder, 'surplus-type-mismatch-cancel', {
|
|
292
|
+
skipAccounting: false,
|
|
293
|
+
fee: 0
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return { success: true, cancelled: true };
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
return { success: false, error: error.message, orderGone: error.message?.includes('not found') };
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
manager.ordersNeedingPriceCorrection = manager.ordersNeedingPriceCorrection.filter(c => c.chainOrderId !== chainOrderId);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
let amountToSell, minToReceive;
|
|
306
|
+
if (type === ORDER_TYPES.SELL) {
|
|
307
|
+
amountToSell = size;
|
|
308
|
+
minToReceive = size * expectedPrice;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
amountToSell = size;
|
|
312
|
+
minToReceive = size / expectedPrice;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const updateResult = await accountOrders.updateOrder(accountName, privateKey, chainOrderId, { amountToSell, minToReceive });
|
|
316
|
+
if (updateResult === null) {
|
|
317
|
+
return { success: false, error: 'skipped' };
|
|
318
|
+
}
|
|
319
|
+
return { success: true };
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
return { success: false, error: error.message, orderGone: error.message?.includes('not found') };
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
manager.ordersNeedingPriceCorrection = manager.ordersNeedingPriceCorrection.filter(c => c.chainOrderId !== chainOrderId);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Correct all pending price mismatches atomically.
|
|
330
|
+
* Processes corrections sequentially with sync delays between operations.
|
|
331
|
+
*
|
|
332
|
+
* @param {Object} manager - OrderManager instance
|
|
333
|
+
* @param {string} accountName - Account name for blockchain transactions
|
|
334
|
+
* @param {string} privateKey - Private key for signing
|
|
335
|
+
* @param {Object} accountOrders - AccountOrders accessor for blockchain ops
|
|
336
|
+
* @returns {Promise<Object>} Summary {corrected, failed, results}
|
|
337
|
+
*/
|
|
338
|
+
async function correctAllPriceMismatches(manager, accountName, privateKey, accountOrders) {
|
|
339
|
+
if (!manager || !manager._gridLock)
|
|
340
|
+
return { corrected: 0, failed: 0, results: [] };
|
|
341
|
+
return await manager._gridLock.acquire(async () => {
|
|
342
|
+
const results = [];
|
|
343
|
+
let corrected = 0;
|
|
344
|
+
let failed = 0;
|
|
345
|
+
const seen = new Set();
|
|
346
|
+
const ordersToCorrect = (manager.ordersNeedingPriceCorrection || []).filter(c => {
|
|
347
|
+
if (!c.chainOrderId || seen.has(c.chainOrderId))
|
|
348
|
+
return false;
|
|
349
|
+
seen.add(c.chainOrderId);
|
|
350
|
+
return true;
|
|
351
|
+
});
|
|
352
|
+
for (const correctionInfo of ordersToCorrect) {
|
|
353
|
+
const result = await correctOrderPriceOnChain(manager, correctionInfo, accountName, privateKey, accountOrders);
|
|
354
|
+
results.push({ ...correctionInfo, result });
|
|
355
|
+
if (result && result.success)
|
|
356
|
+
corrected++;
|
|
357
|
+
else
|
|
358
|
+
failed++;
|
|
359
|
+
const { sleep } = require('./system');
|
|
360
|
+
await sleep(TIMING.SYNC_DELAY_MS);
|
|
361
|
+
}
|
|
362
|
+
// Persist master grid mutations from surplus-type-mismatch cancellations.
|
|
363
|
+
// Without this, corrections that cancel an order and convert its grid slot
|
|
364
|
+
// to a spread placeholder are in-memory only until the next fill-driven or
|
|
365
|
+
// maintenance-driven persist cycle.
|
|
366
|
+
if (corrected > 0 && typeof manager.persistGrid === 'function') {
|
|
367
|
+
await manager.persistGrid();
|
|
368
|
+
}
|
|
369
|
+
return { corrected, failed, results };
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
// ================================================================================
|
|
373
|
+
// SECTION 2-3: ORDER CONSTRUCTION & STATE TRANSITIONS
|
|
374
|
+
// ================================================================================
|
|
375
|
+
/**
|
|
376
|
+
* Build blockchain order arguments from grid order.
|
|
377
|
+
* Converts grid order data to blockchain-compatible amounts and asset IDs.
|
|
378
|
+
* Handles both BUY and SELL order types.
|
|
379
|
+
*
|
|
380
|
+
* @param {Object} order - Grid order with type, size, price
|
|
381
|
+
* @param {Object} assetA - Asset metadata with id and precision
|
|
382
|
+
* @param {Object} assetB - Asset metadata with id and precision
|
|
383
|
+
* @returns {Object} Blockchain args {amountToSell, sellAssetId, minToReceive, receiveAssetId}
|
|
384
|
+
* @throws {Error} If asset precision missing
|
|
385
|
+
*/
|
|
386
|
+
function buildCreateOrderArgs(order, assetA, assetB) {
|
|
387
|
+
let precision = (order.type === 'sell') ? assetA?.precision : assetB?.precision;
|
|
388
|
+
if (typeof precision !== 'number')
|
|
389
|
+
throw new Error("Asset precision missing");
|
|
390
|
+
// IMPORTANT: create args must always come from target grid size.
|
|
391
|
+
// Never reuse rawOnChain.for_sale here because stale metadata from a prior
|
|
392
|
+
// slot role can inflate create amounts (e.g., SPREAD->BUY activation).
|
|
393
|
+
const quantizedSize = quantizeFloat(order.size, precision);
|
|
394
|
+
if (order.type === 'sell') {
|
|
395
|
+
return { amountToSell: quantizedSize, sellAssetId: assetA.id, minToReceive: quantizedSize * order.price, receiveAssetId: assetB.id };
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
return { amountToSell: quantizedSize, sellAssetId: assetB.id, minToReceive: quantizedSize / order.price, receiveAssetId: assetA.id };
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Build a deterministic fingerprint for a planned CREATE order.
|
|
403
|
+
*
|
|
404
|
+
* The fingerprint is used by the COW recovery path to match an
|
|
405
|
+
* order the bot just tried to broadcast to an on-chain order that may or may
|
|
406
|
+
* not have been accepted. Determinism is the key property: if the bot replays
|
|
407
|
+
* the same CREATE op after a credential daemon timeout, the new fingerprint
|
|
408
|
+
* must equal the old one so the chain side can be correlated.
|
|
409
|
+
*
|
|
410
|
+
* The fingerprint uses the (side, assetA, assetB, sellInt, receiveInt, slotId)
|
|
411
|
+
* tuple. sellInt and receiveInt are the raw blockchain integer amounts from
|
|
412
|
+
* buildCreateOrderOp's finalInts (see modules/chain_orders.ts). Using the
|
|
413
|
+
* raw integer pair is more robust than re-deriving a price float because
|
|
414
|
+
* it is invariant to human-side rounding.
|
|
415
|
+
*
|
|
416
|
+
* The slot id is included so two CREATEs with identical price+size on the
|
|
417
|
+
* same side (theoretically possible across non-adjacent grid slots) are
|
|
418
|
+
* still distinguishable.
|
|
419
|
+
*
|
|
420
|
+
* Returns null on any malformed input so callers can skip non-CREATE / non-
|
|
421
|
+
* integer contexts without raising.
|
|
422
|
+
*
|
|
423
|
+
* @param {Object} params
|
|
424
|
+
* @param {string} params.side - 'sell' or 'buy'
|
|
425
|
+
* @param {string} params.assetA - Base asset id (e.g. '1.3.0')
|
|
426
|
+
* @param {string} params.assetB - Quote asset id (e.g. '1.3.121')
|
|
427
|
+
* @param {number|string} params.sellInt - Integer (blockchain-precision) amount-to-sell
|
|
428
|
+
* @param {number|string} params.receiveInt - Integer (blockchain-precision) min-to-receive
|
|
429
|
+
* @param {string} params.slotId - Grid slot id (e.g. 'sell-3', 'buy-7')
|
|
430
|
+
* @returns {string|null} Fingerprint or null on bad input
|
|
431
|
+
*/
|
|
432
|
+
function buildCreateOpFingerprint(params) {
|
|
433
|
+
if (!params || typeof params !== 'object')
|
|
434
|
+
return null;
|
|
435
|
+
const { side, assetA, assetB, sellInt, receiveInt, slotId } = params;
|
|
436
|
+
if (side !== 'sell' && side !== 'buy')
|
|
437
|
+
return null;
|
|
438
|
+
if (!assetA || !assetB)
|
|
439
|
+
return null;
|
|
440
|
+
if (!Number.isFinite(Number(sellInt)) || !Number.isFinite(Number(receiveInt)))
|
|
441
|
+
return null;
|
|
442
|
+
if (!slotId)
|
|
443
|
+
return null;
|
|
444
|
+
return `${side}:${assetA}:${assetB}:${Number(sellInt)}:${Number(receiveInt)}:${String(slotId)}`;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Determine which order sides were updated based on update flags.
|
|
448
|
+
*
|
|
449
|
+
* @param {boolean} buyUpdated - Whether buy side was updated
|
|
450
|
+
* @param {boolean} sellUpdated - Whether sell side was updated
|
|
451
|
+
* @returns {string} "buy", "sell", or "both"
|
|
452
|
+
*/
|
|
453
|
+
function getOrderTypeFromUpdatedFlags(buyUpdated, sellUpdated) {
|
|
454
|
+
return (buyUpdated && sellUpdated) ? 'both' : (buyUpdated ? 'buy' : 'sell');
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Resolve configured price bound (minPrice/maxPrice) to numeric value.
|
|
458
|
+
* Supports relative expressions like "2x" and fallback defaults.
|
|
459
|
+
*
|
|
460
|
+
* @param {*} value - Configured value (number, percentage, relative, or empty)
|
|
461
|
+
* @param {number} fallback - Fallback value if configured value is empty
|
|
462
|
+
* @param {number} startPrice - Reference price for relative calculations
|
|
463
|
+
* @param {string} mode - "min" or "max" for relative calculation mode
|
|
464
|
+
* @returns {number} Resolved numeric price
|
|
465
|
+
* @throws {Error} If value is invalid and cannot be interpreted
|
|
466
|
+
*/
|
|
467
|
+
function resolveConfiguredPriceBound(value, fallback, startPrice, mode) {
|
|
468
|
+
const configuredValue = (value === null || value === undefined || value === '') ? fallback : value;
|
|
469
|
+
const relative = MathUtils.resolveRelativePrice(configuredValue, startPrice, mode);
|
|
470
|
+
if (Number.isFinite(relative)) {
|
|
471
|
+
return relative;
|
|
472
|
+
}
|
|
473
|
+
const numeric = Number(configuredValue);
|
|
474
|
+
if (!Number.isFinite(numeric)) {
|
|
475
|
+
const boundName = mode === 'min' ? 'minPrice' : mode === 'max' ? 'maxPrice' : 'price bound';
|
|
476
|
+
throw new Error(`Invalid ${boundName}: ${String(configuredValue)}. Expected a numeric value or multiplier like 3x.`);
|
|
477
|
+
}
|
|
478
|
+
return numeric;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Convert order to virtual state.
|
|
482
|
+
* Clears on-chain ID and raw blockchain data, marks as VIRTUAL.
|
|
483
|
+
*
|
|
484
|
+
* @param {Object} order - Order to virtualize
|
|
485
|
+
* @returns {Object} Virtualized order (VIRTUAL state, no orderId)
|
|
486
|
+
*/
|
|
487
|
+
function virtualizeOrder(order) {
|
|
488
|
+
if (!order)
|
|
489
|
+
return order;
|
|
490
|
+
const { btsFeeState, ...rest } = order;
|
|
491
|
+
return { ...rest, state: ORDER_STATES.VIRTUAL, orderId: null, rawOnChain: null };
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Convert order to spread placeholder (virtual, zero-sized spread order).
|
|
495
|
+
* Used when clearing order slots during rotations or rebalancing.
|
|
496
|
+
*
|
|
497
|
+
* @param {Object} order - Order to convert
|
|
498
|
+
* @returns {Object} Spread placeholder order (VIRTUAL, SPREAD type, zero size)
|
|
499
|
+
*/
|
|
500
|
+
function convertToSpreadPlaceholder(order) {
|
|
501
|
+
return { ...virtualizeOrder(order), type: ORDER_TYPES.SPREAD, size: 0 };
|
|
502
|
+
}
|
|
503
|
+
// ================================================================================
|
|
504
|
+
// SECTION 4-6: FILTERING, PREDICATES & SIZE VALIDATION
|
|
505
|
+
// ================================================================================
|
|
506
|
+
/**
|
|
507
|
+
* Filter orders array by type.
|
|
508
|
+
*
|
|
509
|
+
* @param {Array<Object>} orders - Orders to filter
|
|
510
|
+
* @param {string} orderType - Order type to match (BUY, SELL, SPREAD)
|
|
511
|
+
* @returns {Array<Object>} Filtered orders of specified type
|
|
512
|
+
*/
|
|
513
|
+
function filterOrdersByType(orders, orderType) {
|
|
514
|
+
return Array.isArray(orders) ? orders.filter(o => o && o.type === orderType) : [];
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Build outside->center paired groups from mixed BUY/SELL items.
|
|
518
|
+
* SELL items are ordered highest->lowest price, BUY items lowest->highest,
|
|
519
|
+
* then zipped into groups: [sell0,buy0], [sell1,buy1], ...
|
|
520
|
+
*
|
|
521
|
+
* @param {Array<*>} items - Source items containing order-like data.
|
|
522
|
+
* @param {Object} accessors - Accessor functions for item shape.
|
|
523
|
+
* @param {(item: any) => boolean} [accessors.isValid=Boolean] - Validity predicate.
|
|
524
|
+
* @param {(item: any) => string} accessors.getType - Returns ORDER_TYPES value.
|
|
525
|
+
* @param {(item: any) => number|string} accessors.getPrice - Returns item price.
|
|
526
|
+
* @returns {Array<Array<*>>} Grouped items in outside->center pair order.
|
|
527
|
+
*/
|
|
528
|
+
function buildOutsideInPairGroups(items, { isValid = Boolean, getType, getPrice }) {
|
|
529
|
+
const safeItems = Array.isArray(items) ? items.filter(item => isValid(item)) : [];
|
|
530
|
+
if (safeItems.length === 0)
|
|
531
|
+
return [];
|
|
532
|
+
const sellItems = safeItems
|
|
533
|
+
.filter(item => getType(item) === ORDER_TYPES.SELL)
|
|
534
|
+
.sort((a, b) => Number(getPrice(b) || 0) - Number(getPrice(a) || 0));
|
|
535
|
+
const buyItems = safeItems
|
|
536
|
+
.filter(item => getType(item) === ORDER_TYPES.BUY)
|
|
537
|
+
.sort((a, b) => Number(getPrice(a) || 0) - Number(getPrice(b) || 0));
|
|
538
|
+
const groups = [];
|
|
539
|
+
const maxLen = Math.max(sellItems.length, buyItems.length);
|
|
540
|
+
for (let i = 0; i < maxLen; i++) {
|
|
541
|
+
const group = [];
|
|
542
|
+
if (i < sellItems.length)
|
|
543
|
+
group.push(sellItems[i]);
|
|
544
|
+
if (i < buyItems.length)
|
|
545
|
+
group.push(buyItems[i]);
|
|
546
|
+
if (group.length > 0)
|
|
547
|
+
groups.push(group);
|
|
548
|
+
}
|
|
549
|
+
return groups;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Extract operation_results from a chain batch execution result.
|
|
553
|
+
* Handles the multiple result shapes returned by different chain library versions
|
|
554
|
+
* and wrapped/unwrapped transaction formats.
|
|
555
|
+
*
|
|
556
|
+
* @param {Object|Array} result - Raw chain batch execution result.
|
|
557
|
+
* @returns {Array} Array of operation result tuples, or empty array if unrecognized.
|
|
558
|
+
*/
|
|
559
|
+
function extractBatchOperationResults(result) {
|
|
560
|
+
const ops = ((result && Array.isArray(result.operation_results) && result.operation_results) ||
|
|
561
|
+
(result && result.raw && Array.isArray(result.raw.operation_results) && result.raw.operation_results) ||
|
|
562
|
+
(result && result.raw && result.raw.trx && Array.isArray(result.raw.trx.operation_results) && result.raw.trx.operation_results) ||
|
|
563
|
+
(result && Array.isArray(result) && result[0] && result[0].trx && Array.isArray(result[0].trx.operation_results) && result[0].trx.operation_results) ||
|
|
564
|
+
null);
|
|
565
|
+
return (ops && ops.length > 0) ? ops : null;
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Format an unmatched chain order/blocker for operator logs.
|
|
569
|
+
*
|
|
570
|
+
* @param {Object} order - Unmatched chain order or structural blocker.
|
|
571
|
+
* @returns {string} Compact human-readable diagnostic.
|
|
572
|
+
*/
|
|
573
|
+
function formatUnmatchedChainOrder(order) {
|
|
574
|
+
if (!order)
|
|
575
|
+
return 'unknown unmatched order';
|
|
576
|
+
const parts = [
|
|
577
|
+
`${order.chainOrderId || 'unknown'}:${order.type || 'unknown'}@${Format.formatPrice6(order.price)}`,
|
|
578
|
+
];
|
|
579
|
+
if (order.size !== undefined)
|
|
580
|
+
parts.push(`size=${Format.formatAmount(order.size)}`);
|
|
581
|
+
if (order.slotId)
|
|
582
|
+
parts.push(`slot=${order.slotId}`);
|
|
583
|
+
if (order.reason)
|
|
584
|
+
parts.push(`reason=${order.reason}`);
|
|
585
|
+
if (order.fingerprint)
|
|
586
|
+
parts.push(`fingerprint=${order.fingerprint}`);
|
|
587
|
+
if (order.candidateDiagnostics)
|
|
588
|
+
parts.push(`candidates=${order.candidateDiagnostics}`);
|
|
589
|
+
return parts.join(' ');
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Check if order is on blockchain (ACTIVE or PARTIAL state).
|
|
593
|
+
*
|
|
594
|
+
* @param {Object} order - Order to check
|
|
595
|
+
* @returns {boolean} True if order has on-chain state
|
|
596
|
+
*/
|
|
597
|
+
function isOrderOnChain(order) {
|
|
598
|
+
return (order?.state === ORDER_STATES.ACTIVE || order?.state === ORDER_STATES.PARTIAL) && !!order?.orderId;
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Check if order is virtual (not on blockchain yet).
|
|
602
|
+
*
|
|
603
|
+
* @param {Object} order - Order to check
|
|
604
|
+
* @returns {boolean} True if order in VIRTUAL state
|
|
605
|
+
*/
|
|
606
|
+
function isOrderVirtual(order) { return order?.state === ORDER_STATES.VIRTUAL; }
|
|
607
|
+
/**
|
|
608
|
+
* Check if order has on-chain ID.
|
|
609
|
+
*
|
|
610
|
+
* @param {Object} order - Order to check
|
|
611
|
+
* @returns {boolean} True if order has orderId
|
|
612
|
+
*/
|
|
613
|
+
function hasOnChainId(order) { return !!order?.orderId; }
|
|
614
|
+
/**
|
|
615
|
+
* Check if order is placed and confirmed on blockchain.
|
|
616
|
+
* Must be on-chain (ACTIVE/PARTIAL) with orderId.
|
|
617
|
+
*
|
|
618
|
+
* @param {Object} order - Order to check
|
|
619
|
+
* @returns {boolean} True if order is confirmed placed
|
|
620
|
+
*/
|
|
621
|
+
function isOrderPlaced(order) { return isOrderOnChain(order) && hasOnChainId(order); }
|
|
622
|
+
/**
|
|
623
|
+
* Check if order is phantom (on-chain but missing orderId).
|
|
624
|
+
* Indicates a sync error or ghost order state.
|
|
625
|
+
*
|
|
626
|
+
* @param {Object} order - Order to check
|
|
627
|
+
* @returns {boolean} True if order appears on-chain but has no ID
|
|
628
|
+
*/
|
|
629
|
+
function isPhantomOrder(order) {
|
|
630
|
+
const inOnChainState = order?.state === ORDER_STATES.ACTIVE || order?.state === ORDER_STATES.PARTIAL;
|
|
631
|
+
return inOnChainState && !hasOnChainId(order);
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Check if slot is available for new order placement.
|
|
635
|
+
* Slot must be VIRTUAL (not on-chain) and have no orderId.
|
|
636
|
+
*
|
|
637
|
+
* @param {Object} order - Order/slot to check
|
|
638
|
+
* @returns {boolean} True if slot available
|
|
639
|
+
*/
|
|
640
|
+
function isSlotAvailable(order) { return isOrderVirtual(order) && !hasOnChainId(order); }
|
|
641
|
+
/**
|
|
642
|
+
* Check if order size meets health thresholds.
|
|
643
|
+
* Must be above absolute minimum and double-dust threshold.
|
|
644
|
+
*
|
|
645
|
+
* @param {number} size - Order size to check
|
|
646
|
+
* @param {string} type - Order type (BUY/SELL)
|
|
647
|
+
* @param {Object} assets - Asset metadata with precisions
|
|
648
|
+
* @param {number} idealSize - Ideal grid size for dust calculation
|
|
649
|
+
* @returns {boolean} True if order is healthy
|
|
650
|
+
*/
|
|
651
|
+
function isOrderHealthy(size, type, assets, idealSize) {
|
|
652
|
+
const numericSize = Number(size);
|
|
653
|
+
const numericIdeal = Number(idealSize);
|
|
654
|
+
if (!Number.isFinite(numericSize) || numericSize <= 0)
|
|
655
|
+
return false;
|
|
656
|
+
if (!Number.isFinite(numericIdeal) || numericIdeal <= 0)
|
|
657
|
+
return false;
|
|
658
|
+
return MathUtils.validateOrderSize(numericSize, type, assets, 50, numericIdeal, 5).isValid;
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Check if any size in array falls below threshold.
|
|
662
|
+
* Used for validation before order placement.
|
|
663
|
+
*
|
|
664
|
+
* @param {Array<number>} sizes - Sizes to check
|
|
665
|
+
* @param {number} threshold - Minimum threshold value
|
|
666
|
+
* @param {number} precision - Asset precision for quantization check
|
|
667
|
+
* @param {boolean} [includeNonFinite=false] - Treat non-finite values as below threshold
|
|
668
|
+
* @returns {boolean} True if any size is below threshold
|
|
669
|
+
*/
|
|
670
|
+
function checkSizeThreshold(sizes, threshold, precision, includeNonFinite = false) {
|
|
671
|
+
if (threshold <= 0 || !Array.isArray(sizes) || sizes.length === 0)
|
|
672
|
+
return false;
|
|
673
|
+
const precisionSlack = isValidNumber(precision)
|
|
674
|
+
? MathUtils.getPrecisionSlack(precision, 1)
|
|
675
|
+
: Number.EPSILON;
|
|
676
|
+
return sizes.some(sz => {
|
|
677
|
+
if (!Number.isFinite(sz))
|
|
678
|
+
return includeNonFinite;
|
|
679
|
+
if (sz <= 0)
|
|
680
|
+
return false;
|
|
681
|
+
if (isValidNumber(precision))
|
|
682
|
+
return floatToBlockchainInt(sz, precision) < floatToBlockchainInt(threshold, precision);
|
|
683
|
+
return sz < (threshold - precisionSlack);
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Check if any sizes are below minimum (including non-finite values).
|
|
688
|
+
* Wrapper for checkSizeThreshold with includeNonFinite=true.
|
|
689
|
+
*
|
|
690
|
+
* @param {Array<number>} sizes - Sizes to check
|
|
691
|
+
* @param {number} minSize - Minimum size threshold
|
|
692
|
+
* @param {number} precision - Asset precision
|
|
693
|
+
* @returns {boolean} True if any size is below minimum
|
|
694
|
+
*/
|
|
695
|
+
function checkSizesBeforeMinimum(sizes, minSize, precision) {
|
|
696
|
+
return checkSizeThreshold(sizes, minSize, precision, true);
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Calculate ideal grid boundary based on reference price.
|
|
700
|
+
* Places boundary near reference price with gap spacing in mind.
|
|
701
|
+
*
|
|
702
|
+
* @param {Array<Object>} allSlots - All grid slots sorted by price
|
|
703
|
+
* @param {number} referencePrice - Reference/anchor price
|
|
704
|
+
* @param {number} gapSlots - Number of gap slots between buy and sell
|
|
705
|
+
* @returns {number} Ideal boundary index or -1 if slots empty
|
|
706
|
+
*/
|
|
707
|
+
function calculateIdealBoundary(allSlots, referencePrice, gapSlots) {
|
|
708
|
+
if (!allSlots || allSlots.length === 0)
|
|
709
|
+
return -1;
|
|
710
|
+
let splitIdx = allSlots.findIndex(s => s.price >= referencePrice);
|
|
711
|
+
if (splitIdx === -1)
|
|
712
|
+
splitIdx = allSlots.length;
|
|
713
|
+
const buySpread = Math.floor(gapSlots / 2);
|
|
714
|
+
return Math.max(0, Math.min(allSlots.length - 1, splitIdx - buySpread - 1));
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Calculate grid boundary based on available funds ratio.
|
|
718
|
+
* Distributes buy/sell slots proportional to fund values.
|
|
719
|
+
*
|
|
720
|
+
* @param {Array<Object>} allSlots - All grid slots sorted by price
|
|
721
|
+
* @param {number} availA - Available assetA (sell-side capital)
|
|
722
|
+
* @param {number} availB - Available assetB (buy-side capital)
|
|
723
|
+
* @param {number} price - Current reference price for valuation
|
|
724
|
+
* @param {number} gapSlots - Number of gap slots between buy and sell
|
|
725
|
+
* @returns {number} Fund-driven boundary index
|
|
726
|
+
*/
|
|
727
|
+
function calculateFundDrivenBoundary(allSlots, availA, availB, price, gapSlots) {
|
|
728
|
+
const valA = toFiniteNumber(availA) * toFiniteNumber(price);
|
|
729
|
+
const valB = toFiniteNumber(availB);
|
|
730
|
+
const totalVal = valA + valB;
|
|
731
|
+
if (totalVal <= 0)
|
|
732
|
+
return Math.floor((allSlots.length - gapSlots) / 2);
|
|
733
|
+
const targetBuySlots = Math.round((allSlots.length - gapSlots) * (valB / totalVal));
|
|
734
|
+
return Math.max(0, Math.min(allSlots.length - gapSlots - 1, targetBuySlots - 1));
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Assign BUY/SELL/SPREAD roles to grid slots based on boundary.
|
|
738
|
+
* Slots below boundary are BUY, above boundary are SELL, between are SPREAD.
|
|
739
|
+
* Can optionally override even on-chain orders.
|
|
740
|
+
*
|
|
741
|
+
* @param {Array<Object>} allSlots - All grid slots to assign
|
|
742
|
+
* @param {number} boundaryIdx - Boundary index
|
|
743
|
+
* @param {number} gapSlots - Number of gap slots between buy and sell
|
|
744
|
+
* @param {Object} ORDER_TYPES - ORDER_TYPES constants
|
|
745
|
+
* @param {Object} ORDER_STATES - ORDER_STATES constants
|
|
746
|
+
* @param {Object} [options={}] - Options
|
|
747
|
+
* @param {boolean} [options.assignOnChain=false] - Override on-chain orders if true
|
|
748
|
+
* @returns {Array<Object>} Slots with updated type assignments
|
|
749
|
+
*/
|
|
750
|
+
function assignGridRoles(allSlots, boundaryIdx, gapSlots, ORDER_TYPES, ORDER_STATES, options = {}) {
|
|
751
|
+
const assignOnChain = options.assignOnChain === true;
|
|
752
|
+
const getCurrentSlot = (typeof options.getCurrentSlot === 'function') ? options.getCurrentSlot : null;
|
|
753
|
+
const buyEndIdx = boundaryIdx;
|
|
754
|
+
const sellStartIdx = boundaryIdx + gapSlots + 1;
|
|
755
|
+
return allSlots.map((slot, i) => {
|
|
756
|
+
const liveSlot = getCurrentSlot ? (getCurrentSlot(slot.id) || slot) : slot;
|
|
757
|
+
const canAssign = assignOnChain || !isOrderOnChain(liveSlot);
|
|
758
|
+
if (canAssign) {
|
|
759
|
+
const newType = (i <= buyEndIdx) ? ORDER_TYPES.BUY : (i >= sellStartIdx) ? ORDER_TYPES.SELL : ORDER_TYPES.SPREAD;
|
|
760
|
+
if (slot.type !== newType) {
|
|
761
|
+
return { ...slot, type: newType };
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
return slot;
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Determine if grid is out of spread and by how many steps.
|
|
769
|
+
* Compares current spread against nominal with tolerance.
|
|
770
|
+
* Returns number of excess steps (0 = in-spread).
|
|
771
|
+
*
|
|
772
|
+
* @param {number} currentSpread - Current bid-ask spread percentage
|
|
773
|
+
* @param {number} nominalSpread - Nominal spread percentage
|
|
774
|
+
* @param {number} toleranceSteps - Tolerance in increment steps
|
|
775
|
+
* @param {number} buyCount - Number of active buy orders
|
|
776
|
+
* @param {number} sellCount - Number of active sell orders
|
|
777
|
+
* @param {number} [incrementPercent=0.5] - Grid increment percentage
|
|
778
|
+
* @returns {number} Excess steps (0 if in-spread, >0 if out-of-spread)
|
|
779
|
+
*/
|
|
780
|
+
function shouldFlagOutOfSpread(currentSpread, nominalSpread, toleranceSteps, buyCount, sellCount, incrementPercent = 0.5) {
|
|
781
|
+
if (buyCount === 0 || sellCount === 0)
|
|
782
|
+
return 0;
|
|
783
|
+
const step = 1 + (incrementPercent / 100);
|
|
784
|
+
const currentSteps = Math.log(1 + (currentSpread / 100)) / Math.log(step);
|
|
785
|
+
const limitSteps = (Math.log(1 + (nominalSpread / 100)) / Math.log(step)) + toleranceSteps;
|
|
786
|
+
if (currentSteps <= limitSteps)
|
|
787
|
+
return 0;
|
|
788
|
+
return Math.max(1, Math.ceil(currentSteps - limitSteps));
|
|
789
|
+
}
|
|
790
|
+
// ================================================================================
|
|
791
|
+
// SECTION 8: GRID INDEXING
|
|
792
|
+
// ================================================================================
|
|
793
|
+
/**
|
|
794
|
+
* Build complete index set from grid
|
|
795
|
+
* @param {Map} grid - Order grid
|
|
796
|
+
* @returns {Object} - Index object with state and type indexes
|
|
797
|
+
*/
|
|
798
|
+
function buildIndexes(grid) {
|
|
799
|
+
const indexes = {
|
|
800
|
+
[ORDER_STATES.VIRTUAL]: new Set(),
|
|
801
|
+
[ORDER_STATES.ACTIVE]: new Set(),
|
|
802
|
+
[ORDER_STATES.PARTIAL]: new Set(),
|
|
803
|
+
[ORDER_TYPES.BUY]: new Set(),
|
|
804
|
+
[ORDER_TYPES.SELL]: new Set(),
|
|
805
|
+
[ORDER_TYPES.SPREAD]: new Set()
|
|
806
|
+
};
|
|
807
|
+
for (const order of grid.values()) {
|
|
808
|
+
if (indexes[order.state])
|
|
809
|
+
indexes[order.state].add(order.id);
|
|
810
|
+
if (indexes[order.type])
|
|
811
|
+
indexes[order.type].add(order.id);
|
|
812
|
+
}
|
|
813
|
+
return indexes;
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Validate index consistency (for testing/debugging)
|
|
817
|
+
* @param {Map} grid - Order grid
|
|
818
|
+
* @param {Object} indexes - Index object
|
|
819
|
+
* @returns {Object} - Validation result
|
|
820
|
+
*/
|
|
821
|
+
function validateIndexes(grid, indexes) {
|
|
822
|
+
const errors = [];
|
|
823
|
+
for (const [id, order] of grid.entries()) {
|
|
824
|
+
const stateIndex = indexes[order.state];
|
|
825
|
+
const typeIndex = indexes[order.type];
|
|
826
|
+
if (!stateIndex || !stateIndex.has(id)) {
|
|
827
|
+
errors.push(`Order ${id} missing from state index ${order.state}`);
|
|
828
|
+
}
|
|
829
|
+
if (!typeIndex || !typeIndex.has(id)) {
|
|
830
|
+
errors.push(`Order ${id} missing from type index ${order.type}`);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
for (const [key, indexSet] of Object.entries(indexes)) {
|
|
834
|
+
for (const id of indexSet) {
|
|
835
|
+
if (!grid.has(id)) {
|
|
836
|
+
errors.push(`Orphaned index entry: ${key} has ${id} but not in grid`);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
return {
|
|
841
|
+
valid: errors.length === 0,
|
|
842
|
+
errors
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
// ================================================================================
|
|
846
|
+
// SECTION 9: ORDER COMPARISON & DELTA
|
|
847
|
+
// ================================================================================
|
|
848
|
+
function _getRelativeTolerance(configOverride) {
|
|
849
|
+
const raw = configOverride?.gridLimits?.RELATIVE_ORDER_UPDATE_THRESHOLD_PERCENT
|
|
850
|
+
?? GRID_LIMITS.RELATIVE_ORDER_UPDATE_THRESHOLD_PERCENT;
|
|
851
|
+
return Number(raw) / 100;
|
|
852
|
+
}
|
|
853
|
+
const ORDER_RELATIVE_TOLERANCE = _getRelativeTolerance();
|
|
854
|
+
function getDecimalPlaces(value) {
|
|
855
|
+
const numeric = Number(value);
|
|
856
|
+
if (!Number.isFinite(numeric))
|
|
857
|
+
return 0;
|
|
858
|
+
const text = numeric.toString().toLowerCase();
|
|
859
|
+
if (!text.includes('e')) {
|
|
860
|
+
const parts = text.split('.');
|
|
861
|
+
return parts[1] ? parts[1].length : 0;
|
|
862
|
+
}
|
|
863
|
+
const [mantissa, exponentRaw] = text.split('e');
|
|
864
|
+
const exponent = Number(exponentRaw);
|
|
865
|
+
const dotIndex = mantissa.indexOf('.');
|
|
866
|
+
const mantissaDecimals = dotIndex >= 0 ? (mantissa.length - dotIndex - 1) : 0;
|
|
867
|
+
return Math.max(0, mantissaDecimals - exponent);
|
|
868
|
+
}
|
|
869
|
+
function parseOptionalPrecision(value) {
|
|
870
|
+
if (value === null || value === undefined || value === '')
|
|
871
|
+
return null;
|
|
872
|
+
const numeric = Number(value);
|
|
873
|
+
if (!Number.isFinite(numeric) || numeric < 0)
|
|
874
|
+
return null;
|
|
875
|
+
return numeric;
|
|
876
|
+
}
|
|
877
|
+
function precisionToQuantum(precision) {
|
|
878
|
+
const p = parseOptionalPrecision(precision);
|
|
879
|
+
if (p === null)
|
|
880
|
+
return null;
|
|
881
|
+
const quantum = Math.pow(10, -p);
|
|
882
|
+
return quantum > 0 ? quantum : Number.EPSILON;
|
|
883
|
+
}
|
|
884
|
+
function observedQuantum(a, b) {
|
|
885
|
+
const maxDecimals = Math.max(getDecimalPlaces(a), getDecimalPlaces(b));
|
|
886
|
+
if (maxDecimals <= 0)
|
|
887
|
+
return Number.EPSILON;
|
|
888
|
+
const quantum = Math.pow(10, -maxDecimals);
|
|
889
|
+
return quantum > 0 ? quantum : Number.EPSILON;
|
|
890
|
+
}
|
|
891
|
+
function resolveOrderSizePrecision(orderType, precisions = {}) {
|
|
892
|
+
if (!precisions || typeof precisions !== 'object')
|
|
893
|
+
return null;
|
|
894
|
+
if (orderType === ORDER_TYPES.BUY)
|
|
895
|
+
return parseOptionalPrecision(precisions.buyPrecision);
|
|
896
|
+
if (orderType === ORDER_TYPES.SELL)
|
|
897
|
+
return parseOptionalPrecision(precisions.sellPrecision);
|
|
898
|
+
return parseOptionalPrecision(precisions.defaultPrecision);
|
|
899
|
+
}
|
|
900
|
+
function resolvePriceTolerance(precisions = {}, order, referenceOrder) {
|
|
901
|
+
const leftPrice = Number(order?.price);
|
|
902
|
+
const rightPrice = Number(referenceOrder?.price);
|
|
903
|
+
const relativeToleranceRatio = Number(precisions.priceRelativeTolerance);
|
|
904
|
+
if (!Number.isFinite(relativeToleranceRatio) || relativeToleranceRatio < 0)
|
|
905
|
+
return 0;
|
|
906
|
+
const scale = Math.max(Math.abs(leftPrice || 0), Math.abs(rightPrice || 0));
|
|
907
|
+
return scale * relativeToleranceRatio;
|
|
908
|
+
}
|
|
909
|
+
function nearlyEqualAbsolute(a, b, tolerance) {
|
|
910
|
+
const left = Number(a);
|
|
911
|
+
const right = Number(b);
|
|
912
|
+
if (!Number.isFinite(left) || !Number.isFinite(right)) {
|
|
913
|
+
return left === right;
|
|
914
|
+
}
|
|
915
|
+
if (left === right)
|
|
916
|
+
return true;
|
|
917
|
+
const tol = Number.isFinite(Number(tolerance)) && Number(tolerance) > 0
|
|
918
|
+
? Number(tolerance)
|
|
919
|
+
: Number.EPSILON;
|
|
920
|
+
return Math.abs(left - right) <= tol;
|
|
921
|
+
}
|
|
922
|
+
function nearlyEqualRelative(a, b, options = {}) {
|
|
923
|
+
const left = Number(a);
|
|
924
|
+
const right = Number(b);
|
|
925
|
+
if (!Number.isFinite(left) || !Number.isFinite(right)) {
|
|
926
|
+
return left === right;
|
|
927
|
+
}
|
|
928
|
+
if (left === right)
|
|
929
|
+
return true;
|
|
930
|
+
const diff = Math.abs(left - right);
|
|
931
|
+
const scale = Math.max(Math.abs(left), Math.abs(right));
|
|
932
|
+
const configuredPrecisionQuantum = precisionToQuantum(options.precision);
|
|
933
|
+
const minimumTolerance = configuredPrecisionQuantum || observedQuantum(left, right);
|
|
934
|
+
const tolerance = Math.max(scale * ORDER_RELATIVE_TOLERANCE, minimumTolerance);
|
|
935
|
+
return diff <= tolerance;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Extract order size with fallback
|
|
939
|
+
* @param {Object} order - Order object
|
|
940
|
+
* @returns {number|null} - Size or null if not found
|
|
941
|
+
*/
|
|
942
|
+
function getOrderSize(order) {
|
|
943
|
+
const size = toFiniteNumber(order?.size, null);
|
|
944
|
+
if (size !== null)
|
|
945
|
+
return size;
|
|
946
|
+
return toFiniteNumber(order?.amount);
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Compare two orders for equality
|
|
950
|
+
* @param {Object} a - First order
|
|
951
|
+
* @param {Object} b - Second order
|
|
952
|
+
* @param {Object} [options={}] - Comparison options
|
|
953
|
+
* @param {Object} [options.precisions] - Optional precision hints {buyPrecision, sellPrecision, defaultPrecision, priceRelativeTolerance}
|
|
954
|
+
* @returns {boolean} - True if orders are equivalent
|
|
955
|
+
*/
|
|
956
|
+
function ordersEqual(a, b, options = {}) {
|
|
957
|
+
if (!a || !b)
|
|
958
|
+
return false;
|
|
959
|
+
if (a === b)
|
|
960
|
+
return true;
|
|
961
|
+
const precisionHints = options.precisions || options.comparePrecisions || {};
|
|
962
|
+
const sizePrecision = resolveOrderSizePrecision(a.type, precisionHints);
|
|
963
|
+
const priceTolerance = resolvePriceTolerance(precisionHints, a, b);
|
|
964
|
+
return a.id === b.id &&
|
|
965
|
+
a.type === b.type &&
|
|
966
|
+
a.state === b.state &&
|
|
967
|
+
nearlyEqualAbsolute(a.price, b.price, priceTolerance) &&
|
|
968
|
+
nearlyEqualRelative(getOrderSize(a), getOrderSize(b), { precision: sizePrecision }) &&
|
|
969
|
+
a.orderId === b.orderId &&
|
|
970
|
+
a.gridIndex === b.gridIndex;
|
|
971
|
+
}
|
|
972
|
+
/**
|
|
973
|
+
* Build delta actions between master and working grid
|
|
974
|
+
* @param {Map} masterGrid - Source of truth grid
|
|
975
|
+
* @param {Map} workingGrid - Modified working copy
|
|
976
|
+
* @param {Object} [options={}] - Delta options forwarded to ordersEqual
|
|
977
|
+
* @returns {Array} - Array of action objects
|
|
978
|
+
*/
|
|
979
|
+
function buildDelta(masterGrid, workingGrid, options = {}) {
|
|
980
|
+
const actions = [];
|
|
981
|
+
for (const [id, workingOrder] of workingGrid.entries()) {
|
|
982
|
+
const masterOrder = masterGrid.get(id);
|
|
983
|
+
if (!masterOrder) {
|
|
984
|
+
actions.push({
|
|
985
|
+
type: 'create',
|
|
986
|
+
id,
|
|
987
|
+
order: workingOrder
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
else if (!ordersEqual(workingOrder, masterOrder, options)) {
|
|
991
|
+
actions.push({
|
|
992
|
+
type: 'update',
|
|
993
|
+
id,
|
|
994
|
+
order: workingOrder,
|
|
995
|
+
prevOrder: masterOrder,
|
|
996
|
+
orderId: masterOrder.orderId
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
for (const [id, masterOrder] of masterGrid.entries()) {
|
|
1001
|
+
if (!workingGrid.has(id)) {
|
|
1002
|
+
actions.push({
|
|
1003
|
+
type: 'cancel',
|
|
1004
|
+
id,
|
|
1005
|
+
orderId: masterOrder.orderId
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
return actions;
|
|
1010
|
+
}
|
|
1011
|
+
// ================================================================================
|
|
1012
|
+
// SECTION 10: STRATEGY CALCULATIONS
|
|
1013
|
+
// ================================================================================
|
|
1014
|
+
/**
|
|
1015
|
+
* Determine new boundary based on fills and current state.
|
|
1016
|
+
*
|
|
1017
|
+
* @param {Array} fills - Recent fill events
|
|
1018
|
+
* @param {number|null} currentBoundaryIdx - Current boundary index
|
|
1019
|
+
* @param {Array} allSlots - All grid slots sorted by price
|
|
1020
|
+
* @param {Object} config - Bot configuration
|
|
1021
|
+
* @param {number} gapSlots - Number of spread gap slots
|
|
1022
|
+
* @returns {number} New boundary index
|
|
1023
|
+
*/
|
|
1024
|
+
function deriveTargetBoundary(fills, currentBoundaryIdx, allSlots, config, gapSlots) {
|
|
1025
|
+
let newBoundaryIdx = currentBoundaryIdx;
|
|
1026
|
+
// Initial recovery if boundary is undefined
|
|
1027
|
+
if (newBoundaryIdx === undefined || newBoundaryIdx === null) {
|
|
1028
|
+
const referencePrice = config.startPrice;
|
|
1029
|
+
newBoundaryIdx = calculateIdealBoundary(allSlots, referencePrice, gapSlots);
|
|
1030
|
+
}
|
|
1031
|
+
// Apply shift from fills
|
|
1032
|
+
for (const fill of fills) {
|
|
1033
|
+
const isShiftEligible = fill?.isPartial !== true ||
|
|
1034
|
+
fill?.isDelayedRotationTrigger === true;
|
|
1035
|
+
if (!isShiftEligible)
|
|
1036
|
+
continue;
|
|
1037
|
+
if (fill.type === ORDER_TYPES.SELL)
|
|
1038
|
+
newBoundaryIdx++;
|
|
1039
|
+
else if (fill.type === ORDER_TYPES.BUY)
|
|
1040
|
+
newBoundaryIdx--;
|
|
1041
|
+
}
|
|
1042
|
+
// Clamp boundary
|
|
1043
|
+
return Math.max(0, Math.min(allSlots.length - 1, newBoundaryIdx));
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* Calculate side budget after BTS fee deduction.
|
|
1047
|
+
*
|
|
1048
|
+
* @param {string} side - 'buy' or 'sell'
|
|
1049
|
+
* @param {Object} funds - Snapshot of allocated funds
|
|
1050
|
+
* @param {Object} config - Bot configuration
|
|
1051
|
+
* @param {number} totalTarget - Total target order count (used for BTS fee calculation on both sides)
|
|
1052
|
+
* @returns {number} Available budget for the side
|
|
1053
|
+
*/
|
|
1054
|
+
function getSideBudget(side, funds, config, totalTarget) {
|
|
1055
|
+
const isBuy = side === 'buy';
|
|
1056
|
+
const allocated = isBuy ? (funds.allocatedBuy || 0) : (funds.allocatedSell || 0);
|
|
1057
|
+
const btsReservationMultiplier = config?.feeParams?.BTS_RESERVATION_MULTIPLIER ?? FEE_PARAMETERS.BTS_RESERVATION_MULTIPLIER;
|
|
1058
|
+
const isBtsSide = (isBuy && config.assetB === 'BTS') || (!isBuy && config.assetA === 'BTS');
|
|
1059
|
+
if (isBtsSide && allocated > 0) {
|
|
1060
|
+
const btsFees = MathUtils.calculateOrderCreationFees(config.assetA, config.assetB, totalTarget, btsReservationMultiplier);
|
|
1061
|
+
return Math.max(0, allocated - btsFees);
|
|
1062
|
+
}
|
|
1063
|
+
// Non-BTS pair: reserve proportional share for BTS fee budget
|
|
1064
|
+
if (!isBtsSide && allocated > 0 && funds.btsBalance) {
|
|
1065
|
+
const formulaBudget = MathUtils.calculateOrderCreationFees(config.assetA, config.assetB, totalTarget, btsReservationMultiplier);
|
|
1066
|
+
const configMin = config.min_BTS_value;
|
|
1067
|
+
const effectiveMin = (configMin > 0) ? configMin : formulaBudget;
|
|
1068
|
+
const btsFree = funds.btsBalance.free || 0;
|
|
1069
|
+
const btsDeficit = Math.max(0, effectiveMin - btsFree);
|
|
1070
|
+
if (btsDeficit > 0) {
|
|
1071
|
+
const sideFree = isBuy ? (funds.chainFreeBuy || 0) : (funds.chainFreeSell || 0);
|
|
1072
|
+
const totalFree = (funds.chainFreeBuy || 0) + (funds.chainFreeSell || 0);
|
|
1073
|
+
const share = totalFree > 0 ? sideFree / totalFree : 0.5;
|
|
1074
|
+
return Math.max(0, Math.min(allocated, sideFree - btsDeficit * share));
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
return allocated;
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Calculate sizes for all slots on a side using weighted distribution.
|
|
1081
|
+
*
|
|
1082
|
+
* @param {Array} slots - Array of slots for the side
|
|
1083
|
+
* @param {string} side - 'buy' or 'sell'
|
|
1084
|
+
* @param {number} budget - Total budget for the side
|
|
1085
|
+
* @param {number} weightDist - Weight distribution factor
|
|
1086
|
+
* @param {number} incrementPercent - Grid increment percentage
|
|
1087
|
+
* @param {Object} assets - Asset metadata for precision
|
|
1088
|
+
* @returns {Array} Array of calculated sizes
|
|
1089
|
+
*/
|
|
1090
|
+
function calculateBudgetedSizes(slots, side, budget, weightDist, incrementPercent, assets) {
|
|
1091
|
+
const isBuy = side === 'buy';
|
|
1092
|
+
let precision;
|
|
1093
|
+
if (assets?.assetA && assets?.assetB) {
|
|
1094
|
+
try {
|
|
1095
|
+
const { A: precA, B: precB } = MathUtils.getPrecisionsForManager(assets);
|
|
1096
|
+
precision = isBuy ? precB : precA;
|
|
1097
|
+
}
|
|
1098
|
+
catch (e) {
|
|
1099
|
+
// Precision not available — floatToBlockchainInt will throw
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
const incrementFactor = incrementPercent / 100;
|
|
1103
|
+
return MathUtils.allocateFundsByWeights(budget, slots.length, weightDist, incrementFactor, isBuy, // Reverse for BUY (Market-Close is last in array)
|
|
1104
|
+
0, precision);
|
|
1105
|
+
}
|
|
1106
|
+
module.exports = {
|
|
1107
|
+
parseChainOrder,
|
|
1108
|
+
findMatchingGridOrderByOpenOrder,
|
|
1109
|
+
applyChainSizeToGridOrder,
|
|
1110
|
+
buildFillKey,
|
|
1111
|
+
correctOrderPriceOnChain,
|
|
1112
|
+
correctAllPriceMismatches,
|
|
1113
|
+
buildCreateOrderArgs,
|
|
1114
|
+
getOrderTypeFromUpdatedFlags,
|
|
1115
|
+
resolveConfiguredPriceBound,
|
|
1116
|
+
virtualizeOrder,
|
|
1117
|
+
convertToSpreadPlaceholder,
|
|
1118
|
+
filterOrdersByType,
|
|
1119
|
+
buildOutsideInPairGroups,
|
|
1120
|
+
extractBatchOperationResults,
|
|
1121
|
+
formatUnmatchedChainOrder,
|
|
1122
|
+
isOrderOnChain,
|
|
1123
|
+
isOrderVirtual,
|
|
1124
|
+
hasOnChainId,
|
|
1125
|
+
isOrderPlaced,
|
|
1126
|
+
isPhantomOrder,
|
|
1127
|
+
isSlotAvailable,
|
|
1128
|
+
isOrderHealthy,
|
|
1129
|
+
checkSizeThreshold,
|
|
1130
|
+
checkSizesBeforeMinimum,
|
|
1131
|
+
calculateIdealBoundary,
|
|
1132
|
+
calculateFundDrivenBoundary,
|
|
1133
|
+
assignGridRoles,
|
|
1134
|
+
shouldFlagOutOfSpread,
|
|
1135
|
+
buildIndexes,
|
|
1136
|
+
validateIndexes,
|
|
1137
|
+
ordersEqual,
|
|
1138
|
+
buildDelta,
|
|
1139
|
+
getOrderSize,
|
|
1140
|
+
deriveTargetBoundary,
|
|
1141
|
+
getSideBudget,
|
|
1142
|
+
calculateBudgetedSizes,
|
|
1143
|
+
buildCreateOpFingerprint
|
|
1144
|
+
};
|
|
1145
|
+
//# sourceMappingURL=order.js.map
|