dexbot 1.5.3 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +4 -3
  3. package/analysis/README.md +1 -2
  4. package/analysis/ama_fitting/fetch_lp_candles.ts +1 -9
  5. package/analysis/ama_fitting/package.json +1 -1
  6. package/analysis/analyze_derivatives.ts +1 -1
  7. package/analysis/bot_usage/discover_bot_accounts.ts +12 -6
  8. package/analysis/resolve_source.ts +9 -2
  9. package/analysis/tradingview/README.md +29 -11
  10. package/analysis/tradingview/analyze_tradingview.ts +92 -3
  11. package/analysis/tradingview/tradingview_uplot_chart_generator.ts +1120 -182
  12. package/analysis/trend_detection/package.json +1 -1
  13. package/claw/docs/DEXBOT2_TUNING_CHEAT_SHEET.md +1 -1
  14. package/claw/modules/dexbot_profiles.ts +22 -2
  15. package/claw/package.json +1 -1
  16. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  17. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  18. package/claw/skills/launcher-ops/references/launcher-workflow.md +1 -1
  19. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  20. package/claw/tests/test_dexbot_profiles.ts +65 -0
  21. package/dist/analysis/ama_fitting/fetch_lp_candles.js +1 -9
  22. package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -1
  23. package/dist/analysis/analyze_derivatives.js +1 -1
  24. package/dist/analysis/bot_usage/discover_bot_accounts.js +11 -6
  25. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
  26. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +2 -0
  27. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  28. package/dist/analysis/resolve_source.d.ts +1 -0
  29. package/dist/analysis/resolve_source.d.ts.map +1 -1
  30. package/dist/analysis/resolve_source.js +6 -2
  31. package/dist/analysis/resolve_source.js.map +1 -1
  32. package/dist/analysis/tradingview/analyze_tradingview.d.ts +5 -0
  33. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
  34. package/dist/analysis/tradingview/analyze_tradingview.js +112 -3
  35. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  36. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +5 -1
  37. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
  38. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1118 -182
  39. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
  40. package/dist/bot.js +1 -1
  41. package/dist/bot.js.map +1 -1
  42. package/dist/dexbot.js +3 -3
  43. package/dist/dexbot.js.map +1 -1
  44. package/dist/market_adapter/ama_signal_runner.js +2 -2
  45. package/dist/market_adapter/candle_utils.d.ts +6 -0
  46. package/dist/market_adapter/candle_utils.d.ts.map +1 -1
  47. package/dist/market_adapter/candle_utils.js +6 -0
  48. package/dist/market_adapter/candle_utils.js.map +1 -1
  49. package/dist/market_adapter/core/kibana_candles.d.ts +17 -1
  50. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
  51. package/dist/market_adapter/core/kibana_candles.js +101 -19
  52. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  53. package/dist/market_adapter/core/kibana_client.d.ts +2 -0
  54. package/dist/market_adapter/core/kibana_client.d.ts.map +1 -1
  55. package/dist/market_adapter/core/kibana_client.js +31 -4
  56. package/dist/market_adapter/core/kibana_client.js.map +1 -1
  57. package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
  58. package/dist/market_adapter/core/market_adapter_service.js +0 -6
  59. package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
  60. package/dist/market_adapter/inputs/fetch_book_data.d.ts +14 -0
  61. package/dist/market_adapter/inputs/fetch_book_data.d.ts.map +1 -0
  62. package/dist/market_adapter/inputs/fetch_book_data.js +138 -0
  63. package/dist/market_adapter/inputs/fetch_book_data.js.map +1 -0
  64. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1 -1
  65. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +16 -2
  66. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  67. package/dist/market_adapter/inputs/fetch_lp_data.js +109 -281
  68. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  69. package/dist/market_adapter/inputs/kibana_feed_source.d.ts +87 -0
  70. package/dist/market_adapter/inputs/kibana_feed_source.d.ts.map +1 -0
  71. package/dist/market_adapter/inputs/kibana_feed_source.js +570 -0
  72. package/dist/market_adapter/inputs/kibana_feed_source.js.map +1 -0
  73. package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -1
  74. package/dist/market_adapter/inputs/kibana_source.js +10 -5
  75. package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
  76. package/dist/market_adapter/inputs/window_cache.d.ts +166 -0
  77. package/dist/market_adapter/inputs/window_cache.d.ts.map +1 -0
  78. package/dist/market_adapter/inputs/window_cache.js +500 -0
  79. package/dist/market_adapter/inputs/window_cache.js.map +1 -0
  80. package/dist/market_adapter/interval_utils.d.ts +8 -1
  81. package/dist/market_adapter/interval_utils.d.ts.map +1 -1
  82. package/dist/market_adapter/interval_utils.js +14 -1
  83. package/dist/market_adapter/interval_utils.js.map +1 -1
  84. package/dist/modules/account_bots.d.ts +1 -0
  85. package/dist/modules/account_bots.d.ts.map +1 -1
  86. package/dist/modules/account_bots.js +21 -5
  87. package/dist/modules/account_bots.js.map +1 -1
  88. package/dist/modules/account_orders.d.ts +25 -4
  89. package/dist/modules/account_orders.d.ts.map +1 -1
  90. package/dist/modules/account_orders.js +67 -4
  91. package/dist/modules/account_orders.js.map +1 -1
  92. package/dist/modules/bitshares-native/chain_client.d.ts +2 -0
  93. package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -1
  94. package/dist/modules/bitshares-native/chain_client.js +3 -1
  95. package/dist/modules/bitshares-native/chain_client.js.map +1 -1
  96. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
  97. package/dist/modules/bitshares-native/subscriptions.js +13 -3
  98. package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
  99. package/dist/modules/bitshares-native/transport.d.ts +2 -0
  100. package/dist/modules/bitshares-native/transport.d.ts.map +1 -1
  101. package/dist/modules/bitshares-native/transport.js +122 -28
  102. package/dist/modules/bitshares-native/transport.js.map +1 -1
  103. package/dist/modules/bitshares_client.d.ts.map +1 -1
  104. package/dist/modules/bitshares_client.js +59 -8
  105. package/dist/modules/bitshares_client.js.map +1 -1
  106. package/dist/modules/bot_settings.d.ts.map +1 -1
  107. package/dist/modules/bot_settings.js +11 -0
  108. package/dist/modules/bot_settings.js.map +1 -1
  109. package/dist/modules/constants.d.ts +13 -0
  110. package/dist/modules/constants.d.ts.map +1 -1
  111. package/dist/modules/constants.js +68 -4
  112. package/dist/modules/constants.js.map +1 -1
  113. package/dist/modules/dexbot_class.d.ts +8 -0
  114. package/dist/modules/dexbot_class.d.ts.map +1 -1
  115. package/dist/modules/dexbot_class.js +57 -2
  116. package/dist/modules/dexbot_class.js.map +1 -1
  117. package/dist/modules/dexbot_cow_runtime.d.ts +26 -1
  118. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  119. package/dist/modules/dexbot_cow_runtime.js +157 -28
  120. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  121. package/dist/modules/dexbot_fill_runtime.d.ts +41 -1
  122. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  123. package/dist/modules/dexbot_fill_runtime.js +135 -5
  124. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  125. package/dist/modules/dexbot_maintenance_runtime.d.ts +79 -12
  126. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  127. package/dist/modules/dexbot_maintenance_runtime.js +554 -46
  128. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  129. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  130. package/dist/modules/dexbot_startup_runtime.js +13 -0
  131. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  132. package/dist/modules/dexbot_state_recovery.d.ts +15 -1
  133. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  134. package/dist/modules/dexbot_state_recovery.js +36 -7
  135. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  136. package/dist/modules/fund_registry.d.ts +1 -1
  137. package/dist/modules/fund_registry.js +1 -1
  138. package/dist/modules/node_connect_policy.d.ts +52 -0
  139. package/dist/modules/node_connect_policy.d.ts.map +1 -0
  140. package/dist/modules/node_connect_policy.js +35 -0
  141. package/dist/modules/node_connect_policy.js.map +1 -0
  142. package/dist/modules/node_manager.d.ts +32 -0
  143. package/dist/modules/node_manager.d.ts.map +1 -1
  144. package/dist/modules/node_manager.js +76 -9
  145. package/dist/modules/node_manager.js.map +1 -1
  146. package/dist/modules/order/accounting.d.ts +30 -0
  147. package/dist/modules/order/accounting.d.ts.map +1 -1
  148. package/dist/modules/order/accounting.js +176 -3
  149. package/dist/modules/order/accounting.js.map +1 -1
  150. package/dist/modules/order/export.d.ts.map +1 -1
  151. package/dist/modules/order/export.js +1 -0
  152. package/dist/modules/order/export.js.map +1 -1
  153. package/dist/modules/order/grid.d.ts.map +1 -1
  154. package/dist/modules/order/grid.js +143 -15
  155. package/dist/modules/order/grid.js.map +1 -1
  156. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  157. package/dist/modules/order/grid_reconcile.js +5 -3
  158. package/dist/modules/order/grid_reconcile.js.map +1 -1
  159. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  160. package/dist/modules/order/grid_reconcile_internal.js +182 -6
  161. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  162. package/dist/modules/order/manager.d.ts +64 -2
  163. package/dist/modules/order/manager.d.ts.map +1 -1
  164. package/dist/modules/order/manager.js +231 -14
  165. package/dist/modules/order/manager.js.map +1 -1
  166. package/dist/modules/order/strategy.d.ts +3 -0
  167. package/dist/modules/order/strategy.d.ts.map +1 -1
  168. package/dist/modules/order/strategy.js +79 -7
  169. package/dist/modules/order/strategy.js.map +1 -1
  170. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  171. package/dist/modules/order/sync_engine.js +16 -1
  172. package/dist/modules/order/sync_engine.js.map +1 -1
  173. package/dist/modules/order/utils/math.d.ts +11 -1
  174. package/dist/modules/order/utils/math.d.ts.map +1 -1
  175. package/dist/modules/order/utils/math.js +24 -1
  176. package/dist/modules/order/utils/math.js.map +1 -1
  177. package/dist/modules/order/utils/order.d.ts +258 -13
  178. package/dist/modules/order/utils/order.d.ts.map +1 -1
  179. package/dist/modules/order/utils/order.js +662 -12
  180. package/dist/modules/order/utils/order.js.map +1 -1
  181. package/dist/modules/order/utils/system.d.ts +36 -0
  182. package/dist/modules/order/utils/system.d.ts.map +1 -1
  183. package/dist/modules/order/utils/system.js +102 -6
  184. package/dist/modules/order/utils/system.js.map +1 -1
  185. package/dist/modules/order/utils/validate.d.ts.map +1 -1
  186. package/dist/modules/order/utils/validate.js +6 -2
  187. package/dist/modules/order/utils/validate.js.map +1 -1
  188. package/dist/modules/paths.d.ts +2 -0
  189. package/dist/modules/paths.d.ts.map +1 -1
  190. package/dist/modules/paths.js +1 -0
  191. package/dist/modules/paths.js.map +1 -1
  192. package/dist/modules/runtime_settings.d.ts +13 -0
  193. package/dist/modules/runtime_settings.d.ts.map +1 -1
  194. package/dist/modules/runtime_settings.js +20 -0
  195. package/dist/modules/runtime_settings.js.map +1 -1
  196. package/dist/modules/utils/errors.d.ts +16 -0
  197. package/dist/modules/utils/errors.d.ts.map +1 -1
  198. package/dist/modules/utils/errors.js +31 -0
  199. package/dist/modules/utils/errors.js.map +1 -1
  200. package/dist/pm2.js +7 -7
  201. package/dist/scripts/analyze-credit.d.ts.map +1 -1
  202. package/dist/scripts/analyze-credit.js +13 -3
  203. package/dist/scripts/analyze-credit.js.map +1 -1
  204. package/dist/scripts/analyze-orders.js +2 -2
  205. package/dist/scripts/analyze-orders.js.map +1 -1
  206. package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -1
  207. package/dist/scripts/diagnose-kibana-candles.js +0 -1
  208. package/dist/scripts/diagnose-kibana-candles.js.map +1 -1
  209. package/dist/scripts/test-credit-renewal.js +1 -1
  210. package/dist/scripts/test-credit-renewal.js.map +1 -1
  211. package/dist/scripts/tv.d.ts +24 -2
  212. package/dist/scripts/tv.d.ts.map +1 -1
  213. package/dist/scripts/tv.js +190 -65
  214. package/dist/scripts/tv.js.map +1 -1
  215. package/docs/BITSHARES_ONBOARDING.md +9 -2
  216. package/docs/COW_INVARIANTS.md +18 -1
  217. package/docs/DEXBOT_COMPARISON.md +3 -3
  218. package/docs/EVOLUTION.md +8 -7
  219. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +21 -9
  220. package/docs/GRID_RECALCULATION.md +5 -6
  221. package/docs/GRID_RECONCILE.md +12 -2
  222. package/docs/MPA_CREDIT_USAGE.md +2 -2
  223. package/docs/README.md +5 -6
  224. package/docs/architecture.md +0 -58
  225. package/docs/developer_guide.md +2 -1
  226. package/docs/docker.md +1 -1
  227. package/market_adapter/README.md +4 -0
  228. package/modules/README.md +1 -1
  229. package/package.json +1 -1
  230. package/scripts/README.md +5 -3
  231. package/tests/README.md +2 -2
@@ -1,16 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
  /**
4
- * dexbot tv — TradingView chart shortcut.
5
- *
6
4
  * Usage:
7
- * dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--scale log|linear]
5
+ * dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--feed|--pool|--book]
8
6
  *
9
7
  * - 1h candles, N months of history (default 3).
10
- * - Target resolution:
8
+ * - Target resolution (default: pool-first, orderbook fallback when no pool):
11
9
  * - bot name/key from profiles/bots.json
12
- * - pool id (e.g. 133 or 1.19.133)
13
- * - AssetA/AssetB symbols (pool-first, orderbook fill fallback when no pool)
10
+ * - pool id (e.g. 133 or 1.19.133, always LP pool candles)
11
+ * - AssetA/AssetB symbols; MPA pairs (e.g. BTS/HONEST.USD) can opt into
12
+ * the on-chain price-feed history with --feed.
14
13
  *
15
14
  * This script ONLY pulls fresh candle data and writes it to a temp JSON file.
16
15
  * Rendering (chart HTML, AMA overlay like the exporter, auto chart path + print)
@@ -26,33 +25,140 @@ const __dirname = path.dirname(__filename);
26
25
  import { loadBotMeta, resolveAmaConfig, loadBotSettings, computeBotKey } from '../analysis/bot_key_utils.js';
27
26
  import { PATHS } from '../modules/paths.js';
28
27
  import { normalizePoolId, resolveAsset, findPoolByAssets } from '../market_adapter/utils/chain.js';
29
- import { fetchCandlesSequentially, outputPath, buildFetchWindowsFromRange } from '../market_adapter/inputs/fetch_lp_data.js';
30
- import { getMarketCandles } from '../market_adapter/core/kibana_market_candles.js';
31
- import { mergeCandles } from '../market_adapter/candle_utils.js';
28
+ import { fetchCandlesSequentially, outputPath } from '../market_adapter/inputs/fetch_lp_data.js';
29
+ import { fetchMarketCandlesSequentially } from '../market_adapter/inputs/fetch_book_data.js';
30
+ import { fetchFeedCandlesSequentially } from '../market_adapter/inputs/kibana_feed_source.js';
32
31
  import { getErrorMessage } from '../modules/utils/errors.js';
33
32
  import { muteChainLogs } from '../modules/utils/chain_logs.js';
34
33
  import { isSameBotName, sanitizeKey } from '../modules/utils/sanitize_key.js';
34
+ import { slugPart } from '../market_adapter/interval_utils.js';
35
35
  const INTERVAL_SECONDS = 3600;
36
36
  const DEFAULT_MONTHS = 3;
37
+ // Explicit --feed warns when the settlement feed is older than this
38
+ // (a stale feed draws a flat/misleading chart). Default: 7 days.
39
+ const FEED_STALE_WARN_AGE_MS = 7 * 24 * 3600 * 1000;
37
40
  const HOURS_PER_MONTH = 730;
38
41
  function printUsage() {
39
- console.log('Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--scale log|linear]');
42
+ console.log('Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--feed|--pool|--book]');
40
43
  console.log('');
41
44
  console.log(' <bot> Bot name or key from profiles/bots.json (AMA overlay like the exporter)');
42
- console.log(' <pool-id> Liquidity pool id, e.g. 133 or 1.19.133');
45
+ console.log(' <pool-id> Liquidity pool id, e.g. 133 or 1.19.133 (always pool candles)');
43
46
  console.log(' AssetA/AssetB Pair symbols, e.g. TOKENA/TOKENB (pool-first, orderbook fallback)');
47
+ console.log(' MPA pairs (e.g. BTS/HONEST.USD) can chart price-feed history via --feed');
44
48
  console.log('');
45
49
  console.log('Options:');
46
50
  console.log(` --month N Months of 1h history (default ${DEFAULT_MONTHS})`);
47
51
  console.log(' --months N Alias for --month');
48
52
  console.log(' --chart <path> Override auto output path');
49
- console.log(' --scale <log|linear> Price axis scale (default log)');
53
+ console.log(' --feed Price-feed candles (MPA pairs; BTS/MPA or MPA/MPA cross)');
54
+ console.log(' --pool Force LP pool candles (errors when the pair has no pool)');
55
+ console.log(' --book Force order-book fill candles (--orderbook is an alias)');
56
+ }
57
+ async function resolveMpaBacking(mpaSymbol, bitsharesClient) {
58
+ const db = bitsharesClient.BitShares?.db;
59
+ if (!db || typeof db.lookup_asset_symbols !== 'function')
60
+ return null;
61
+ let mpa = null;
62
+ try {
63
+ const found = await db.lookup_asset_symbols([mpaSymbol]);
64
+ mpa = found?.[0] || null;
65
+ }
66
+ catch (_) {
67
+ return null;
68
+ }
69
+ if (!mpa?.id || !mpa.bitasset_data_id)
70
+ return null;
71
+ try {
72
+ const objs = await db.get_objects([mpa.bitasset_data_id]);
73
+ const bitasset = Array.isArray(objs) ? objs[0] : objs;
74
+ const backingId = String(bitasset?.options?.short_backing_asset || '');
75
+ if (!backingId)
76
+ return null;
77
+ const metas = typeof db.get_assets === 'function' ? await db.get_assets([backingId]) : null;
78
+ const list = Array.isArray(metas) ? metas.flat(Infinity) : [];
79
+ const backing = list.find((a) => String(a?.id) === backingId) || null;
80
+ if (!backing?.id || !Number.isFinite(Number(backing.precision)))
81
+ return null;
82
+ return {
83
+ mpa: { id: String(mpa.id), precision: Number(mpa.precision), symbol: mpaSymbol },
84
+ backing: { id: String(backing.id), precision: Number(backing.precision), symbol: String(backing.symbol || backingId) },
85
+ isPredictionMarket: bitasset?.options?.is_prediction_market === true,
86
+ feedPublicationTime: typeof bitasset?.current_feed_publication_time === 'string' ? bitasset.current_feed_publication_time : null,
87
+ };
88
+ }
89
+ catch (_) {
90
+ return null;
91
+ }
92
+ }
93
+ async function pickFeedContext(symA, symB, source, bitsharesClient) {
94
+ // Feed candles are strictly opt-in (--feed). All other modes chart
95
+ // tradeable market candles (pool-first, orderbook fallback) without
96
+ // touching the chain for MPA detection.
97
+ if (source !== 'feed')
98
+ return null;
99
+ const ctxA = await resolveMpaBacking(symA, bitsharesClient);
100
+ const ctxB = await resolveMpaBacking(symB, bitsharesClient);
101
+ const legs = [ctxA, ctxB].filter(Boolean);
102
+ if (legs.length === 0)
103
+ throw new Error(`--feed requires an MPA pair, got ${symA}/${symB}`);
104
+ // Prediction markets are bitassets too, but their "feed" is a binary
105
+ // settlement outcome, not a price series — never chart it as one.
106
+ for (const leg of legs) {
107
+ if (leg.isPredictionMarket)
108
+ throw new Error(`--feed cannot chart ${leg.mpa.symbol}: prediction-market feeds are settlement outcomes, not prices`);
109
+ }
110
+ if (legs.length === 2) {
111
+ if (String(legs[0].backing.id) !== String(legs[1].backing.id)) {
112
+ throw new Error(`--feed cannot cross ${legs[0].mpa.symbol}/${legs[1].mpa.symbol}: different backing assets (${legs[0].backing.symbol} vs ${legs[1].backing.symbol})`);
113
+ }
114
+ return { kind: 'cross', legs };
115
+ }
116
+ return { kind: 'single', legs };
117
+ }
118
+ function feedAgeMs(ctx, nowMs = Date.now()) {
119
+ if (!ctx?.feedPublicationTime)
120
+ return null;
121
+ const ts = Date.parse(ctx.feedPublicationTime.endsWith('Z') ? ctx.feedPublicationTime : `${ctx.feedPublicationTime}Z`);
122
+ if (!Number.isFinite(ts))
123
+ return null;
124
+ return nowMs - ts;
125
+ }
126
+ function feedName(feedCtx) {
127
+ if (feedCtx.kind === 'cross')
128
+ return `${feedCtx.legs[0].mpa.symbol}/${feedCtx.legs[1].mpa.symbol}`;
129
+ return feedCtx.legs[0].mpa.symbol;
130
+ }
131
+ async function activateFeedIfCovered(symA, symB, assetA, assetB, source, bitsharesClient) {
132
+ const ctx = await pickFeedContext(symA, symB, source, bitsharesClient);
133
+ if (!ctx)
134
+ return null;
135
+ const ids = [String(assetA?.id || ''), String(assetB?.id || '')];
136
+ if (ctx.kind === 'cross') {
137
+ const covered = ids.includes(String(ctx.legs[0].mpa.id)) && ids.includes(String(ctx.legs[1].mpa.id));
138
+ if (!covered) {
139
+ throw new Error(`--feed cannot price ${assetA?.symbol || ''}/${assetB?.symbol || ''}: the cross feed covers ${feedName(ctx)} only`);
140
+ }
141
+ }
142
+ else if (!ids.includes(String(ctx.legs[0].mpa.id)) || !ids.includes(String(ctx.legs[0].backing.id))) {
143
+ throw new Error(`--feed cannot price ${assetA?.symbol || ''}/${assetB?.symbol || ''}: the ${ctx.legs[0].mpa.symbol} feed covers ${ctx.legs[0].backing.symbol}/${ctx.legs[0].mpa.symbol} only`);
144
+ }
145
+ // A stale settlement price draws a flat/misleading chart. Explicit
146
+ // --feed still charts it on request, but says so out loud.
147
+ // For a cross, the stalest leg gates the warning.
148
+ const ages = ctx.legs.map((leg) => feedAgeMs(leg));
149
+ const known = ages.filter((a) => a != null);
150
+ const worst = known.length === ages.length && known.length > 0 ? Math.max(...known) : null;
151
+ if (worst == null || worst > FEED_STALE_WARN_AGE_MS) {
152
+ const ageLabel = worst == null ? 'unknown age' : `${Math.round(worst / 86400000)}d old`;
153
+ console.warn(`[tv] Warning: ${feedName(ctx)} feed is stale (${ageLabel}); charting it anyway by explicit request`);
154
+ }
155
+ return ctx;
50
156
  }
51
157
  function parseArgs(argv) {
52
158
  let target = null;
53
159
  let months = DEFAULT_MONTHS;
54
160
  let chart = null;
55
- let priceScale = 'log';
161
+ let source = 'auto';
56
162
  let help = false;
57
163
  for (let i = 0; i < argv.length; i++) {
58
164
  const arg = argv[i];
@@ -87,15 +193,11 @@ function parseArgs(argv) {
87
193
  if (!chart)
88
194
  throw new Error('--chart: missing path');
89
195
  }
90
- else if (arg === '--scale' || arg === '--price-scale') {
91
- priceScale = String(argv[++i] || 'log').toLowerCase();
92
- if (priceScale !== 'log' && priceScale !== 'linear')
93
- throw new Error(`--scale: unsupported value "${priceScale}" (use log|linear)`);
94
- }
95
- else if (arg.startsWith('--scale=')) {
96
- priceScale = arg.split('=')[1]?.toLowerCase() || 'log';
97
- if (priceScale !== 'log' && priceScale !== 'linear')
98
- throw new Error(`--scale: unsupported value "${priceScale}" (use log|linear)`);
196
+ else if (arg === '--feed' || arg === '--pool' || arg === '--book' || arg === '--orderbook') {
197
+ const picked = arg === '--feed' ? 'feed' : arg === '--pool' ? 'pool' : 'book';
198
+ if (source !== 'auto' && source !== picked)
199
+ throw new Error(`Conflicting source flags: --${source} with ${arg} (use only one of --feed, --pool, --book)`);
200
+ source = picked;
99
201
  }
100
202
  else if (arg.startsWith('--')) {
101
203
  throw new Error(`Unknown flag "${arg}". Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N]`);
@@ -107,7 +209,7 @@ function parseArgs(argv) {
107
209
  throw new Error(`Unexpected argument "${arg}". Only one target is supported. Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N]`);
108
210
  }
109
211
  }
110
- return { target, months, chart, priceScale, help };
212
+ return { target, months, chart, source, help };
111
213
  }
112
214
  function isPoolIdTarget(target) {
113
215
  return /^(1\.19\.\d+|\d+)$/.test(target.trim());
@@ -129,9 +231,6 @@ function findBotByTarget(target) {
129
231
  }
130
232
  return null;
131
233
  }
132
- function slugPart(value) {
133
- return String(value || '').trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'unknown';
134
- }
135
234
  function monthsLabel(months) {
136
235
  return Number.isInteger(months) ? `${months}m` : `${String(months).replace('.', 'p')}m`;
137
236
  }
@@ -184,7 +283,7 @@ async function resolvePoolAssets(poolId, bitsharesClient) {
184
283
  async function run() {
185
284
  // Mute chain connection chatter first — shared helper, console.error untouched.
186
285
  muteChainLogs();
187
- const { target, months, chart, priceScale, help } = parseArgs(process.argv.slice(2));
286
+ const { target, months, chart, source, help } = parseArgs(process.argv.slice(2));
188
287
  if (help || !target) {
189
288
  printUsage();
190
289
  if (!target && !help)
@@ -218,6 +317,7 @@ async function run() {
218
317
  let assetA;
219
318
  let assetB;
220
319
  let poolId = null;
320
+ let feedCtx = null;
221
321
  let sourceLabel = '';
222
322
  let botKey = null;
223
323
  let botMeta = null;
@@ -231,13 +331,22 @@ async function run() {
231
331
  const [metaA, metaB] = await Promise.all([resolveAsset(symA, bitsharesClient), resolveAsset(symB, bitsharesClient)]);
232
332
  assetA = { id: metaA.id, precision: metaA.precision, symbol: symA };
233
333
  assetB = { id: metaB.id, precision: metaB.precision, symbol: symB };
234
- try {
235
- poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
334
+ feedCtx = await activateFeedIfCovered(symA, symB, assetA, assetB, source, bitsharesClient);
335
+ if (feedCtx) {
336
+ sourceLabel = `feed ${feedName(feedCtx)}`;
236
337
  }
237
- catch (_) {
238
- poolId = null;
338
+ else if (source === 'book') {
339
+ sourceLabel = 'orderbook';
340
+ }
341
+ else {
342
+ try {
343
+ poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
344
+ }
345
+ catch (_) {
346
+ poolId = null;
347
+ }
348
+ sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
239
349
  }
240
- sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
241
350
  }
242
351
  else if (poolTarget) {
243
352
  poolId = normalizePoolId(target.trim());
@@ -250,23 +359,42 @@ async function run() {
250
359
  const [metaA, metaB] = await Promise.all([resolveAsset(pairParts[0], bitsharesClient), resolveAsset(pairParts[1], bitsharesClient)]);
251
360
  assetA = { id: metaA.id, precision: metaA.precision, symbol: pairParts[0] };
252
361
  assetB = { id: metaB.id, precision: metaB.precision, symbol: pairParts[1] };
253
- try {
254
- poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
362
+ feedCtx = await activateFeedIfCovered(pairParts[0], pairParts[1], assetA, assetB, source, bitsharesClient);
363
+ if (feedCtx) {
364
+ sourceLabel = `feed ${feedName(feedCtx)}`;
255
365
  }
256
- catch (_) {
257
- poolId = null;
366
+ else if (source === 'book') {
367
+ sourceLabel = 'orderbook';
368
+ }
369
+ else {
370
+ try {
371
+ poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
372
+ }
373
+ catch (_) {
374
+ poolId = null;
375
+ }
376
+ sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
258
377
  }
259
- sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
260
378
  }
261
379
  // ── Data pull (the only job of this script) ──────────────────────────
262
- // Both paths reuse the existing Kibana infrastructure in 1-month
263
- // windows: LP goes through the fetcher's manifest/resume + per-chunk
264
- // timeout/retry machinery, book fills use the same windowing with the
265
- // shared mergeCandles helper. No fetch logic is duplicated here.
380
+ // All three paths share ONE chunk-cache function (runCachedWindows)
381
+ // in 1-month windows; the LP path additionally sets a per-chunk
382
+ // timeout/retry budget. Reruns query only what is missing.
383
+ // No fetch logic is duplicated here.
266
384
  const TV_CHUNK_MONTHS = 1;
267
385
  console.log(`[tv] Fetching 1h candles (${months}mo, ${timeRange.gte.slice(0, 10)} → ${timeRange.lte.slice(0, 10)}) from ${sourceLabel} for ${assetA.symbol}/${assetB.symbol}...`);
268
386
  let candles;
269
- if (poolId) {
387
+ if (feedCtx) {
388
+ // Feed publishes go through the same chunk-cache machinery as LP
389
+ // candles: reruns reuse local buckets and query only what is
390
+ // missing (plus a tail refresh for late-indexed publishes).
391
+ candles = await fetchFeedCandlesSequentially(feedCtx, assetA, assetB, {
392
+ intervalSeconds: INTERVAL_SECONDS,
393
+ timeRange,
394
+ chunkMonths: TV_CHUNK_MONTHS,
395
+ });
396
+ }
397
+ else if (poolId) {
270
398
  candles = await fetchCandlesSequentially(poolId, assetA, assetB, {
271
399
  intervalSeconds: INTERVAL_SECONDS,
272
400
  timeRange,
@@ -274,34 +402,30 @@ async function run() {
274
402
  }, outputPath(poolId, INTERVAL_SECONDS, assetA, assetB));
275
403
  }
276
404
  else {
277
- const windows = buildFetchWindowsFromRange(timeRange, TV_CHUNK_MONTHS);
278
- let merged = [];
279
- for (let w = 0; w < windows.length; w++) {
280
- console.log(` Window ${w + 1}/${windows.length}: ${windows[w].gte.slice(0, 10)} → ${windows[w].lte.slice(0, 10)}`);
281
- const part = await getMarketCandles(assetA, assetB, { intervalSeconds: INTERVAL_SECONDS, timeRange: windows[w] });
282
- console.log(` -> ${part.length} candles`);
283
- merged = merged.length === 0
284
- ? part
285
- : mergeCandles(merged, part, {
286
- onCollision: (existing, incoming) => incoming[5] > existing[5] ? incoming : existing,
287
- });
288
- }
289
- candles = merged;
405
+ // Order-book fills go through the same chunk-cache machinery as LP
406
+ // candles and feed publishes: reruns reuse local buckets and query
407
+ // only what is missing (plus a tail refresh for late-indexed fills).
408
+ candles = await fetchMarketCandlesSequentially(assetA, assetB, {
409
+ intervalSeconds: INTERVAL_SECONDS,
410
+ timeRange,
411
+ chunkMonths: TV_CHUNK_MONTHS,
412
+ });
290
413
  }
291
414
  if (!Array.isArray(candles) || candles.length === 0)
292
415
  throw new Error('No candles returned for the requested range');
293
- console.log(`[tv] Fetched ${candles.length} candles`);
294
416
  tmpFile = path.join(os.tmpdir(), `dexbot-tv-${sanitizeKey(botKey || assetA.symbol + '-' + assetB.symbol)}-${process.pid}.json`);
295
417
  fs.writeFileSync(tmpFile, JSON.stringify({
296
418
  meta: {
297
419
  fetchedAt: new Date().toISOString(),
298
- source: `dexbot tv (${sourceLabel})`,
420
+ feed: feedCtx ? feedName(feedCtx) : null,
299
421
  pool: poolId,
300
422
  assetA: { id: assetA.id, precision: assetA.precision, symbol: assetA.symbol },
301
423
  assetB: { id: assetB.id, precision: assetB.precision, symbol: assetB.symbol },
302
424
  intervalSeconds: INTERVAL_SECONDS,
303
425
  lookbackHours,
304
- format: '[timestamp_ms, open, high, low, close, volume_A]',
426
+ format: feedCtx
427
+ ? '[timestamp_ms, open, high, low, close, feed_publish_count]'
428
+ : '[timestamp_ms, open, high, low, close, volume_A]',
305
429
  },
306
430
  candles,
307
431
  }), 'utf8');
@@ -309,25 +433,26 @@ async function run() {
309
433
  const analyzer = path.join(__dirname, '..', 'analysis', 'tradingview', 'analyze_tradingview.js');
310
434
  if (!fs.existsSync(analyzer))
311
435
  throw new Error(`TradingView exporter not found at ${analyzer} (run npm run build first)`);
436
+ const feedSuffix = feedCtx ? '_feed' : '';
312
437
  const baseName = botKey
313
- ? `tv_${sanitizeKey(botKey)}`
438
+ ? `tv_${sanitizeKey(botKey)}${feedSuffix}`
314
439
  : poolId
315
440
  ? `tv_pool_${String(poolId).replace(/^1\.19\./, '')}`
316
- : `tv_${slugPart(assetA.symbol)}_${slugPart(assetB.symbol)}`;
441
+ : `tv_${slugPart(assetA.symbol)}_${slugPart(assetB.symbol)}${feedSuffix}`;
317
442
  const chartFile = chart
318
443
  ? path.resolve(chart)
319
444
  : path.join(PATHS.ANALYSIS.CHARTS_DIR, `${baseName}_1h_${monthsLabel(months)}.html`);
320
- const label = poolId ? `Pool ${String(poolId).replace(/^1\.19\./, '')}` : `${assetA.symbol}/${assetB.symbol}`;
445
+ const label = feedCtx
446
+ ? `Feed ${feedName(feedCtx)} (${assetA.symbol}/${assetB.symbol})`
447
+ : poolId ? `Pool ${String(poolId).replace(/^1\.19\./, '')}` : `${assetA.symbol}/${assetB.symbol}`;
321
448
  const title = botKey && botMeta?.name ? `${botMeta.name} · ${label} · 1h · TradingView` : `${label} · 1h · TradingView`;
322
- const analyzerArgs = ['--file', tmpFile, '--chart', chartFile, '--title', title, '--scale', priceScale];
449
+ const analyzerArgs = ['--file', tmpFile, '--chart', chartFile, '--title', title];
323
450
  if (botKey) {
324
451
  // Same AMA overlay the exporter resolves for this bot.
325
452
  const ama = resolveAmaConfig(botKey);
326
453
  analyzerArgs.push('--bot-key', botKey, '--ama-er-period', String(ama.erPeriod), '--ama-fast-period', String(ama.fastPeriod), '--ama-slow-period', String(ama.slowPeriod));
327
454
  }
328
455
  const result = spawnSync(process.execPath, [analyzer, ...analyzerArgs], { stdio: 'inherit' });
329
- if (result.error)
330
- throw result.error;
331
456
  if (result.status !== 0)
332
457
  throw new Error(`TradingView exporter exited with status ${result.status}`);
333
458
  try {
@@ -353,5 +478,5 @@ if (invoked) {
353
478
  process.exit(1);
354
479
  });
355
480
  }
356
- export { parseArgs, isPoolIdTarget };
481
+ export { parseArgs, isPoolIdTarget, resolveMpaBacking, pickFeedContext, activateFeedIfCovered, feedAgeMs, feedName, FEED_STALE_WARN_AGE_MS };
357
482
  //# sourceMappingURL=tv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tv.js","sourceRoot":"","sources":["../../scripts/tv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tv.js","sourceRoot":"","sources":["../../scripts/tv.ts"],"names":[],"mappings":";AACA,YAAY,CAAC;AACb;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7G,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE/D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,oEAAoE;AACpE,iEAAiE;AACjE,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,SAAS,UAAU;IACf,OAAO,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAAC;IAChH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,oDAAoD,cAAc,GAAG,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;AAC9F,CAAC;AACD,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,eAAoB;IACpE,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,oBAAoB,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,GAAG,GAAQ,IAAI,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;QAC3E,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO;YACH,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;YAChF,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE;YACtH,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI;YACpE,mBAAmB,EAAE,OAAO,QAAQ,EAAE,6BAA6B,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI;SACnI,CAAC;IACN,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc,EAAE,eAAoB;IAC3F,mEAAmE;IACnE,oEAAoE;IACpE,wCAAwC;IACxC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3F,qEAAqE;IACrE,kEAAkE;IAClE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,GAAG,CAAC,MAAM,+DAA+D,CAAC,CAAC;IACtJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,+BAA+B,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1K,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,GAA2C,EAAE,QAAgB,IAAI,CAAC,GAAG,EAAE;IACtF,IAAI,CAAC,GAAG,EAAE,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC;IACvH,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,KAAK,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAsC;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACnG,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,MAAW,EAAE,MAAc,EAAE,eAAoB;IAC3H,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACvE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,IAAI,EAAE,2BAA2B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxI,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,IAAI,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACnM,CAAC;IACD,mEAAmE;IACnE,2DAA2D;IAC3D,kDAAkD;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAa,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,sBAAsB,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,GAAG,CAAC,mBAAmB,QAAQ,2CAA2C,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC7B,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,MAAM,GAAG,cAAc,CAAC;IAC5B,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAC7C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,8CAA8C,CAAC,CAAC;YACjI,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,8BAA8B,CAAC,CAAC;YACjH,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,8BAA8B,CAAC,CAAC;YAClH,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAC3F,MAAM,MAAM,GAAG,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9E,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,SAAS,GAAG,2CAA2C,CAAC,CAAC;YAC1J,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,6DAA6D,CAAC,CAAC;QACvG,CAAC;aAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,CAAC;QACjB,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,2FAA2F,CAAC,CAAC;QAC5I,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACnC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAE,QAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,QAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnG,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,CAAC;QACP,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;AAC5F,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,eAAoB;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAW,CAAC;IACjD,mEAAmE;IACnE,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC;IACzC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5G,+CAA+C;gBAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnE,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;oBACjB,OAAO;wBACH,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE;wBACzG,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE;qBAC5G,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,0CAA0C;QAC9C,CAAC;IACL,CAAC;IACD,iFAAiF;IACjF,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,4CAA4C,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACtI,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,0CAA0C,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACH,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE;QAC5F,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE;KAC/F,CAAC;AACN,CAAC;AAED,KAAK,UAAU,GAAG;IACd,gFAAgF;IAChF,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;IACpD,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IAE/F,qEAAqE;IACrE,qDAAqD;IACrD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAgB,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,cAAc,CAAC,MAAgB,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,IAAK,MAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,MAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAE,QAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,QAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,wBAAwB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC;IACvM,CAAC;IACD,IAAI,UAAU,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,0CAA0C,CAAC,CAAC;IAE7H,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAAC;IAC7C,MAAM,gBAAgB,EAAE,CAAC;IAEzB,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACD,IAAI,MAAW,CAAC;QAChB,IAAI,MAAW,CAAC;QAChB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,OAAO,GAAyC,IAAI,CAAC;QACzD,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,OAAO,GAAQ,IAAI,CAAC;QACxB,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,mDAAmD,CAAC,CAAC;YACvG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YACrH,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACpE,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACpE,OAAO,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;YAC3F,IAAI,OAAO,EAAE,CAAC;gBACV,WAAW,GAAG,QAAQ,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,CAAC;iBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,WAAW,GAAG,WAAW,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC;oBACD,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7G,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,MAAM,GAAG,IAAI,CAAC;gBAClB,CAAC;gBACD,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1D,CAAC;QACL,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACpB,MAAM,GAAG,eAAe,CAAE,MAAiB,CAAC,IAAI,EAAE,CAAW,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAClE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACzB,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACzB,WAAW,GAAG,QAAQ,MAAM,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YACrI,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;YAC3G,IAAI,OAAO,EAAE,CAAC;gBACV,WAAW,GAAG,QAAQ,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,CAAC;iBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,WAAW,GAAG,WAAW,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC;oBACD,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7G,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,MAAM,GAAG,IAAI,CAAC;gBAClB,CAAC;gBACD,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1D,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,oEAAoE;QACpE,gEAAgE;QAChE,2DAA2D;QAC3D,qCAAqC;QACrC,MAAM,eAAe,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,QAAQ,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAClL,IAAI,OAAc,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACV,iEAAiE;YACjE,6DAA6D;YAC7D,4DAA4D;YAC5D,OAAO,GAAG,MAAM,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;gBAClE,eAAe,EAAE,gBAAgB;gBACjC,SAAS;gBACT,WAAW,EAAE,eAAe;aAC/B,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAChB,OAAO,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC7D,eAAe,EAAE,gBAAgB;gBACjC,SAAS;gBACT,WAAW,EAAE,eAAe;aAC/B,EAAE,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,mEAAmE;YACnE,mEAAmE;YACnE,qEAAqE;YACrE,OAAO,GAAG,MAAM,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE;gBAC3D,eAAe,EAAE,gBAAgB;gBACjC,SAAS;gBACT,WAAW,EAAE,eAAe;aAC/B,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAEpH,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;QAChI,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;YACrC,IAAI,EAAE;gBACF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;gBACxC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;gBAC7E,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;gBAC7E,eAAe,EAAE,gBAAgB;gBACjC,aAAa;gBACb,MAAM,EAAE,OAAO;oBACX,CAAC,CAAC,4DAA4D;oBAC9D,CAAC,CAAC,kDAAkD;aAC3D;YACD,OAAO;SACV,CAAC,EAAE,MAAM,CAAC,CAAC;QAEZ,wEAAwE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,wBAAwB,CAAC,CAAC;QACjG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,4BAA4B,CAAC,CAAC;QACzH,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM;YACnB,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE;YAC1C,CAAC,CAAC,MAAM;gBACJ,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;gBACrD,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QAClF,MAAM,SAAS,GAAG,KAAK;YACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,QAAQ,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,OAAO;YACjB,CAAC,CAAC,QAAQ,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG;YACjE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACtG,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,qBAAqB,CAAC;QACxH,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjF,IAAI,MAAM,EAAE,CAAC;YACT,uDAAuD;YACvD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACrC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EACjC,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EACvC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAC3C,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,+BAA+B,CAAC,CAAC;QAC7E,OAAO,GAAG,IAAI,CAAC;IACnB,CAAC;YAAS,CAAC;QACP,IAAI,CAAC;YACD,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YAChF,EAAE,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACjC,8EAA8E;QAC9E,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;AACL,CAAC;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,IAAI,OAAO,EAAE,CAAC;IACV,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,eAAe,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAA"}
@@ -294,6 +294,13 @@ The only things worth tuning later:
294
294
  See the "Recommended Bot Setup" section of the
295
295
  [README](../README.md#recommended-bot-setup).
296
296
 
297
+ ### Editing a running bot
298
+
299
+ You can re-run `dexbot bot` and save while the bot runs. Order counts,
300
+ reserves, funds and weights apply live (~1min, no restart); grid geometry
301
+ needs `dexbot reset <bot>`, market/account changes need a restart. The
302
+ editor prints exactly what applies live every time it saves.
303
+
297
304
  ### Activate the market adapter
298
305
 
299
306
  For AMA pricing, enable the market adapter once:
@@ -332,7 +339,7 @@ dexbot start --dryrun --foreground # stop with Ctrl+C
332
339
  | :--- | :--- |
333
340
  | Runtime status | `dexbot stat` |
334
341
  | Live output | `dexbot start --foreground` (stop with Ctrl+C) |
335
- | Logs | `<profiles>/logs/` — runtime `dexbot.log`, per-bot `<bot-name>.log` (see [Where are the logs?](#where-are-the-logs)) |
342
+ | Logs | `<profiles>/logs/` — runtime `dexbot.log`, per-bot `<bot>.log` (see [Where are the logs?](#where-are-the-logs)) |
336
343
  | Clear logs | `dexbot clear` |
337
344
 
338
345
  See [LOGGING.md](LOGGING.md) for the full logging reference.
@@ -396,7 +403,7 @@ overrides the location entirely.
396
403
  | File | Contents |
397
404
  | :--- | :--- |
398
405
  | `dexbot.log` / `dexbot-error.log` | Runtime (monolithic daemon) stdout/stderr |
399
- | `<bot-name>.log` / `<bot-name>-error.log` | Per-bot output |
406
+ | `<bot>.log` / `<bot>-error.log` | Per-bot output |
400
407
  | `dexbot-cred.log` | Credential daemon |
401
408
  | `dexbot-adapter.log` / `dexbot-adapter-error.log` | Market adapter managed by the runtime |
402
409
  | `market_adapter.log` | Standalone adapter mode |
@@ -56,6 +56,23 @@ This document defines the non-negotiable behavioral invariants for the DEXBot2 s
56
56
  - `INV-COW-005` Grid regeneration bumps `_gridVersion`
57
57
  - `_clearOrderCachesLogic` must bump `_gridVersion` so an in-flight COW plan (baseVersion from the pre-swap grid) is refused at commit instead of committing over a regenerated zero-slot grid.
58
58
 
59
+ - `INV-COW-006` Boundary moves only on fills and same-batch spread promotion
60
+ - Fund changes never move the boundary. Only boundary crawl (`deriveTargetBoundary`, `order/utils/order.ts`) and spread promotion move it, and promotion shifts it only onto orders placed in the same atomic batch (`prepareSpreadCorrectionOrders`).
61
+ - Funds drive order sizing/budget allocation only; `syncBoundaryToFunds`/`calculateFundDrivenBoundary` are deleted (1.5.3).
62
+
63
+ - `INV-COW-007` Boundary hold on guard-skipped refills
64
+ - When a slot on the plan's refill wire (`collectRefillSlotIds`: the plan's CREATE ids minus reserve-ladder edge ids) was guard-skipped at broadcast (`skippedUpdateSlotIds` ∪ `clampedUpdateSlotIds` ∪ `skippedCreateSlotIds`), `resolveRefillBoundaryHold` keeps the COMMITTED boundary instead of committing the plan's shifted one over the stranded rail hole; the grid still commits.
65
+ - Reserve-ladder CREATEs are excluded because reserves are static edge insurance whose fills never crawl — a skipped reserve must not pin geometry.
66
+ - The hold rides to the commit as `options.boundaryHeld`, which suppresses the pending-crawl clear.
67
+ - `trackBoundaryHold` counts consecutive hold batches (`manager._consecutiveBoundaryHolds`, cleared on the first clean batch) with a last-hold snapshot (`manager._lastBoundaryHoldInfo`); runs of 3+ escalate visibly. It also records a hold signature (`manager._lastHeldPlanSignature`: committed boundary + guard pivot + `_lastFilledAt` + held wire) so a fill-less re-plan of an unchanged state defers instead of re-broadcasting the identical vetoed plan.
68
+ - Fill-driven rebalances never sleep on `_broadcastingFlag` inside `_fillProcessingLock`: `performSafeRebalance({deferIfBroadcasting:true})` returns a `deferred` result and the region-end hook schedules one no-fill rebalance (`schedulePostRecoveryRebalance`). This prevents the 20s lock-acquisition-timeout cascade when a broadcast region outlives the 30s `_awaitBroadcastIdle` wait. The stale-flag watchdog (`_clearStaleBroadcastFlag`, 120s) fires the same region-end hook when it hard-clears a leaked flag, so deferred fills are woken even when the region never ends through `stopBroadcasting()`.
69
+ - A hold run carrying fresh fills (>= `TIMING.BOUNDARY_HOLD_RESYNC_THRESHOLD`) requests a guard-aware structural re-center (`requestStructuralGridResync`, cooldown `TIMING.BOUNDARY_HOLD_RESYNC_COOLDOWN_MS`) instead of holding forever — the heal path when the grid is trailing the market.
70
+
71
+ - `INV-COW-008` Owed fill crawls survive unapplied commits
72
+ - `order/strategy.ts` records a crawl per shift-eligible fill at intake (slot-level dedupe, capped at 500); `deriveTargetBoundary` folds still-owed `_pendingFillCrawls` into the next derivation, excluding the current batch's slots and reserve slots.
73
+ - `_commitWorkingGrid` clears them only when the plan's boundary was actually applied — a held boundary (`boundaryHeld`), a gate-rejected boundary, and a null boundary all leave them owed.
74
+ - `consumePendingFillCrawls` applies them onto a restored finite boundary; `applyPersistedPendingCrawls` is the shared startup/recovery wrapper used before sync/reconcile; `_clearPendingFillCrawls` drops them when the boundary is re-anchored (grid rebuild via `initializeGrid`, rejected snapshot via `rejectCorruptedGridSnapshot`, persisted snapshot wipe via `AccountOrders.clearGrid`).
75
+
59
76
  - `INV-PROJ-001` New projected orders remain virtual
60
77
  - Orders projected into empty slots must be `VIRTUAL` with no `orderId` until chain confirmation.
61
78
 
@@ -166,7 +183,7 @@ This document defines the non-negotiable behavioral invariants for the DEXBot2 s
166
183
  - `INV-GRID-001` One-to-one order mapping
167
184
  - One grid slot = at most one on-chain order. No two chain orders may map to the same grid slot.
168
185
  - Sync engine tracks `matchedGridOrderIds` through both sync passes and skips already-matched slots.
169
- - Surplus orders (matched count > `activeOrders.buy/sell` targets) are flagged for cancellation.
186
+ - Surplus orders (matched count above the per-side `activeOrders` + `reserveOrders` targets) are flagged for cancellation.
170
187
 
171
188
  - `INV-GRID-002` One order per price level
172
189
  - The active grid must have at most one on-chain order per (type, price) pair.
@@ -1,7 +1,7 @@
1
1
  # DEXBot vs DEXBot2 — Detailed Comparison Report
2
2
 
3
3
  > **Date:** 2026-09-02 *(metrics refreshed against local source trees)*
4
- > **Scope:** Full architectural, functional, and operational comparison between the original [DEXBot](https://github.com/Codaone/DEXBot) (Python, v1.0.0) and DEXBot2 (TypeScript, v1.5.3).
4
+ > **Scope:** Full architectural, functional, and operational comparison between the original [DEXBot](https://github.com/Codaone/DEXBot) (Python, v1.0.0) and DEXBot2 (TypeScript, v1.6.0).
5
5
  > **Audience:** Developers, contributors, and operators evaluating or migrating between the two projects.
6
6
 
7
7
  ---
@@ -36,7 +36,7 @@
36
36
 
37
37
  | Attribute | DEXBot (original) | DEXBot2 |
38
38
  |---|---|---|
39
- | **Release Track** | 1.0.0 | v1.5.3 |
39
+ | **Release Track** | 1.0.0 | v1.6.0 |
40
40
  | **Language** | Python 3.6+ | TypeScript 5.x |
41
41
  | **Status** | Released 1.0.0, unmaintained | Active development |
42
42
  | **Last Repo Activity** | May 23, 2020 | 2026-09-02 |
@@ -780,7 +780,7 @@ Where:
780
780
 
781
781
  | Metric | DEXBot | DEXBot2 |
782
782
  |---|---|---|
783
- | **Release Track** | 1.0.0 | v1.5.3 |
783
+ | **Release Track** | 1.0.0 | v1.6.0 |
784
784
  | **Active Since** | ~2018 | December 2025 |
785
785
  | **Last Commit** | May 23, 2020 | 2026-09-02 |
786
786
  | **Total Commits** | 2281 | 2,125 (v1.4.25) |
package/docs/EVOLUTION.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  ## Executive Summary
4
4
 
5
- DEXBot2 is a sophisticated decentralized exchange trading bot for the BitShares blockchain. This report documents the complete evolution of the project from its inception in December 2025 through the current 1.5.3 stable release.
5
+ DEXBot2 is a sophisticated decentralized exchange trading bot for the BitShares blockchain. This report documents the complete evolution of the project from its inception in December 2025 through the current 1.6.0 stable release.
6
6
 
7
7
  ### Key Milestones
8
8
  - **Project Inception**: December 2, 2025
9
- - **Growth Phase**: 2,141 commits over ~9 active months
9
+ - **Growth Phase**: 2,211 commits over ~9 active months
10
10
  - **Code Maturity**: Evolution from basic utilities to a ~100,000+ LoC intelligent TypeScript system
11
- - **Stability**: Progression from manual testing to a suite of 248 automated test files
12
- - **Releases**: 103 release entries (v0.1.0 to v1.5.3)
11
+ - **Stability**: Progression from manual testing to a suite of 278 automated test files
12
+ - **Releases**: 104 release entries (v0.1.0 to v1.6.0)
13
13
 
14
14
  ---
15
15
 
@@ -113,11 +113,12 @@ Compact, era-level view; per-release commit detail lives in [CHANGELOG.md](../CH
113
113
  | v1.5.0 → v1.5.1 | 11 | Gap-evacuation guard allowance + rail-typed holes, persisted streaks with cancel-only teeth, vacated-rail refill, adoption/accounting/duplicate-guard hardening |
114
114
  | v1.5.1 → v1.5.2 | 10 | Sync rejection handling across pass-1/pass-2 adoption, crossing-guard candidate sharing, empty-read confirmation, broadcast-price CREATE validation, stamped gap-evacuation re-proof, credit whole-account display + expiry, offline export fill-block derivation |
115
115
  | v1.5.2 → v1.5.3 | 6 | Boundary ownership hardening (fund-driven sync removal, guard-skipped refill hold), COW broadcast/reconcile dedup, TradingView bot-grid range highlight, createOrder unknown-id materialize-or-error, curve-comparison docs |
116
+ | v1.5.3 → v1.6.0 | 37 | Node-failure strike ledger and broadcast-deferred fill rebalancing, trust-chain free-balance heal with deferred-drain tolerance, bidirectional grid-regeneration trigger, TradingView order overlay and chart pref namespacing, credit short-offer id display, live-config pickup (issue #27), reserve ladder anchored at resolved bounds + live-grid rail edges with single-source ordering and exact-size activation, owed-crawl persistence across refused broadcasts/restarts + hold-aware reload-safe lifecycle, fill-anchored boundary recovery + poisoned persisted-boundary erase, startup rail gate + static-center crawl fold, all `*-deferred` holds non-blocking + hold metrics surfaced, opt-in MPA price-feed charts + range-aware shared candle cache, range-band span parity on grid-less charts, orange range zone widened to 1.40x, docs reserve-ladder sweep, reserve-deficit targeted-sync trigger with window-exclusion counting, matched-surplus startup excess planning, shelf-order guards across reserve classification/placement/startup cancels/size recalc (issue #27 follow-ups), unified Kibana candle cache on runCachedWindows with fetch retry budgets, genuine-coverage LP window reuse, feed volume/AMA timeframe alignment, TradingView monthly candles/stat badges/rigid pan/volume toggle/feed affordance, credit full offer id + empty-pair Curr. CR hiding, live-config onboarding note |
116
117
 
117
118
  ---
118
119
 
119
120
  **Report Originally Generated**: February 19, 2026
120
- **Last Updated**: September 09, 2026
121
- **Total Commits**: 2,172
122
- **Date Range**: December 2, 2025 – September 09, 2026
121
+ **Last Updated**: September 12, 2026
122
+ **Total Commits**: 2,211
123
+ **Date Range**: December 2, 2025 – September 12, 2026
123
124
  **Repository**: DEXBot2 (BitShares DEX Trading Bot)