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