dexbot 1.4.25 → 1.5.1

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 (217) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +6 -2
  3. package/analysis/README.md +14 -7
  4. package/analysis/ama_fitting/package.json +1 -1
  5. package/analysis/analyze_derivatives.ts +1 -1
  6. package/analysis/bot_key_utils.ts +272 -3
  7. package/analysis/bot_usage/discover_bot_accounts.ts +64 -9
  8. package/analysis/bot_usage/kibana_bot_queries.ts +40 -1
  9. package/analysis/chart_utils.ts +6 -3
  10. package/analysis/grid_correction_check.ts +56 -20
  11. package/analysis/resolve_bot_accounts.ts +199 -0
  12. package/analysis/trade_profitability.ts +36 -8
  13. package/analysis/tradingview/README.md +25 -0
  14. package/analysis/tradingview/analyze_tradingview.ts +2 -2
  15. package/analysis/trend_detection/package.json +1 -1
  16. package/claw/modules/claw_launcher.ts +5 -4
  17. package/claw/modules/credit_runtime_adapter.ts +2 -1
  18. package/claw/modules/dexbot_profiles.ts +4 -3
  19. package/claw/package.json +1 -1
  20. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  21. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  22. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  23. package/dist/analysis/analyze_derivatives.js +1 -1
  24. package/dist/analysis/bot_key_utils.d.ts +28 -1
  25. package/dist/analysis/bot_key_utils.d.ts.map +1 -1
  26. package/dist/analysis/bot_key_utils.js +385 -3
  27. package/dist/analysis/bot_key_utils.js.map +1 -1
  28. package/dist/analysis/bot_usage/discover_bot_accounts.js +60 -10
  29. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
  30. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +45 -1
  31. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  32. package/dist/analysis/bot_usage/kibana_bot_queries.js +39 -1
  33. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
  34. package/dist/analysis/chart_utils.d.ts +2 -1
  35. package/dist/analysis/chart_utils.d.ts.map +1 -1
  36. package/dist/analysis/chart_utils.js +4 -1
  37. package/dist/analysis/chart_utils.js.map +1 -1
  38. package/dist/analysis/grid_correction_check.d.ts.map +1 -1
  39. package/dist/analysis/grid_correction_check.js +60 -20
  40. package/dist/analysis/grid_correction_check.js.map +1 -1
  41. package/dist/analysis/resolve_bot_accounts.d.ts +3 -0
  42. package/dist/analysis/resolve_bot_accounts.d.ts.map +1 -0
  43. package/dist/analysis/resolve_bot_accounts.js +216 -0
  44. package/dist/analysis/resolve_bot_accounts.js.map +1 -0
  45. package/dist/analysis/trade_profitability.d.ts.map +1 -1
  46. package/dist/analysis/trade_profitability.js +40 -8
  47. package/dist/analysis/trade_profitability.js.map +1 -1
  48. package/dist/analysis/tradingview/analyze_tradingview.js +2 -2
  49. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  50. package/dist/bot.d.ts.map +1 -1
  51. package/dist/bot.js +2 -1
  52. package/dist/bot.js.map +1 -1
  53. package/dist/dexbot.d.ts.map +1 -1
  54. package/dist/dexbot.js +73 -17
  55. package/dist/dexbot.js.map +1 -1
  56. package/dist/market_adapter/ama_signal_runner.js +2 -2
  57. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +2 -1
  58. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
  59. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +4 -1
  60. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  61. package/dist/market_adapter/inputs/fetch_lp_data.js +3 -2
  62. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  63. package/dist/modules/account_bots.d.ts +42 -1
  64. package/dist/modules/account_bots.d.ts.map +1 -1
  65. package/dist/modules/account_bots.js +168 -17
  66. package/dist/modules/account_bots.js.map +1 -1
  67. package/dist/modules/account_orders.d.ts +7 -1
  68. package/dist/modules/account_orders.d.ts.map +1 -1
  69. package/dist/modules/account_orders.js +34 -1
  70. package/dist/modules/account_orders.js.map +1 -1
  71. package/dist/modules/bitshares_client.d.ts +4 -1
  72. package/dist/modules/bitshares_client.d.ts.map +1 -1
  73. package/dist/modules/bitshares_client.js +12 -4
  74. package/dist/modules/bitshares_client.js.map +1 -1
  75. package/dist/modules/bot_settings.d.ts.map +1 -1
  76. package/dist/modules/bot_settings.js +2 -1
  77. package/dist/modules/bot_settings.js.map +1 -1
  78. package/dist/modules/cli_colors.d.ts +39 -0
  79. package/dist/modules/cli_colors.d.ts.map +1 -0
  80. package/dist/modules/cli_colors.js +42 -0
  81. package/dist/modules/cli_colors.js.map +1 -0
  82. package/dist/modules/constants.d.ts +2 -0
  83. package/dist/modules/constants.d.ts.map +1 -1
  84. package/dist/modules/constants.js +27 -11
  85. package/dist/modules/constants.js.map +1 -1
  86. package/dist/modules/credit_pricing.d.ts +61 -0
  87. package/dist/modules/credit_pricing.d.ts.map +1 -0
  88. package/dist/modules/credit_pricing.js +237 -0
  89. package/dist/modules/credit_pricing.js.map +1 -0
  90. package/dist/modules/credit_runtime.d.ts +1 -0
  91. package/dist/modules/credit_runtime.d.ts.map +1 -1
  92. package/dist/modules/credit_runtime.js +49 -107
  93. package/dist/modules/credit_runtime.js.map +1 -1
  94. package/dist/modules/dexbot_class.d.ts +3 -1
  95. package/dist/modules/dexbot_class.d.ts.map +1 -1
  96. package/dist/modules/dexbot_class.js +22 -6
  97. package/dist/modules/dexbot_class.js.map +1 -1
  98. package/dist/modules/dexbot_cow_runtime.d.ts +36 -2
  99. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  100. package/dist/modules/dexbot_cow_runtime.js +434 -20
  101. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  102. package/dist/modules/dexbot_maintenance_runtime.d.ts +15 -16
  103. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  104. package/dist/modules/dexbot_maintenance_runtime.js +69 -42
  105. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  106. package/dist/modules/dexbot_startup_runtime.d.ts +1 -0
  107. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  108. package/dist/modules/dexbot_startup_runtime.js +12 -1
  109. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  110. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  111. package/dist/modules/dexbot_state_recovery.js +7 -0
  112. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  113. package/dist/modules/fund_registry.d.ts +1 -1
  114. package/dist/modules/fund_registry.js +1 -1
  115. package/dist/modules/launcher/adapter_requirement.d.ts +38 -0
  116. package/dist/modules/launcher/adapter_requirement.d.ts.map +1 -0
  117. package/dist/modules/launcher/adapter_requirement.js +141 -0
  118. package/dist/modules/launcher/adapter_requirement.js.map +1 -0
  119. package/dist/modules/launcher/bot_supervisor.d.ts +2 -2
  120. package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
  121. package/dist/modules/launcher/bot_supervisor.js +32 -3
  122. package/dist/modules/launcher/bot_supervisor.js.map +1 -1
  123. package/dist/modules/launcher/launch_modes.d.ts.map +1 -1
  124. package/dist/modules/launcher/launch_modes.js +5 -4
  125. package/dist/modules/launcher/launch_modes.js.map +1 -1
  126. package/dist/modules/launcher/monolithic_runtime.d.ts +1 -1
  127. package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
  128. package/dist/modules/launcher/monolithic_runtime.js +12 -8
  129. package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
  130. package/dist/modules/launcher/status_reporting.d.ts +6 -6
  131. package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
  132. package/dist/modules/launcher/status_reporting.js +9 -6
  133. package/dist/modules/launcher/status_reporting.js.map +1 -1
  134. package/dist/modules/order/accounting.d.ts +34 -0
  135. package/dist/modules/order/accounting.d.ts.map +1 -1
  136. package/dist/modules/order/accounting.js +182 -5
  137. package/dist/modules/order/accounting.js.map +1 -1
  138. package/dist/modules/order/export.d.ts +1 -1
  139. package/dist/modules/order/export.js +1 -1
  140. package/dist/modules/order/grid.d.ts.map +1 -1
  141. package/dist/modules/order/grid.js +68 -28
  142. package/dist/modules/order/grid.js.map +1 -1
  143. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  144. package/dist/modules/order/grid_reconcile_internal.js +72 -0
  145. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  146. package/dist/modules/order/logger.d.ts +23 -1
  147. package/dist/modules/order/logger.d.ts.map +1 -1
  148. package/dist/modules/order/logger.js +60 -17
  149. package/dist/modules/order/logger.js.map +1 -1
  150. package/dist/modules/order/manager.d.ts +41 -1
  151. package/dist/modules/order/manager.d.ts.map +1 -1
  152. package/dist/modules/order/manager.js +186 -17
  153. package/dist/modules/order/manager.js.map +1 -1
  154. package/dist/modules/order/strategy.d.ts.map +1 -1
  155. package/dist/modules/order/strategy.js +17 -2
  156. package/dist/modules/order/strategy.js.map +1 -1
  157. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  158. package/dist/modules/order/sync_engine.js +59 -9
  159. package/dist/modules/order/sync_engine.js.map +1 -1
  160. package/dist/modules/order/utils/math.d.ts +42 -1
  161. package/dist/modules/order/utils/math.d.ts.map +1 -1
  162. package/dist/modules/order/utils/math.js +91 -1
  163. package/dist/modules/order/utils/math.js.map +1 -1
  164. package/dist/modules/order/utils/order.d.ts +52 -1
  165. package/dist/modules/order/utils/order.d.ts.map +1 -1
  166. package/dist/modules/order/utils/order.js +137 -7
  167. package/dist/modules/order/utils/order.js.map +1 -1
  168. package/dist/modules/order/utils/system.d.ts +66 -4
  169. package/dist/modules/order/utils/system.d.ts.map +1 -1
  170. package/dist/modules/order/utils/system.js +156 -16
  171. package/dist/modules/order/utils/system.js.map +1 -1
  172. package/dist/modules/order/utils/validate.d.ts +30 -3
  173. package/dist/modules/order/utils/validate.d.ts.map +1 -1
  174. package/dist/modules/order/utils/validate.js +206 -11
  175. package/dist/modules/order/utils/validate.js.map +1 -1
  176. package/dist/modules/utils/chain_logs.d.ts +11 -0
  177. package/dist/modules/utils/chain_logs.d.ts.map +1 -0
  178. package/dist/modules/utils/chain_logs.js +23 -0
  179. package/dist/modules/utils/chain_logs.js.map +1 -0
  180. package/dist/modules/utils/sanitize_key.d.ts +7 -0
  181. package/dist/modules/utils/sanitize_key.d.ts.map +1 -1
  182. package/dist/modules/utils/sanitize_key.js +15 -0
  183. package/dist/modules/utils/sanitize_key.js.map +1 -1
  184. package/dist/pm2.d.ts +11 -1
  185. package/dist/pm2.d.ts.map +1 -1
  186. package/dist/pm2.js +66 -15
  187. package/dist/pm2.js.map +1 -1
  188. package/dist/scripts/analyze-credit.d.ts +4 -0
  189. package/dist/scripts/analyze-credit.d.ts.map +1 -0
  190. package/dist/scripts/analyze-credit.js +760 -0
  191. package/dist/scripts/analyze-credit.js.map +1 -0
  192. package/dist/scripts/analyze-orders.d.ts +1 -10
  193. package/dist/scripts/analyze-orders.d.ts.map +1 -1
  194. package/dist/scripts/analyze-orders.js +11 -34
  195. package/dist/scripts/analyze-orders.js.map +1 -1
  196. package/dist/scripts/test-credit-renewal.d.ts.map +1 -1
  197. package/dist/scripts/test-credit-renewal.js +37 -5
  198. package/dist/scripts/test-credit-renewal.js.map +1 -1
  199. package/dist/scripts/tv.d.ts +11 -0
  200. package/dist/scripts/tv.d.ts.map +1 -0
  201. package/dist/scripts/tv.js +357 -0
  202. package/dist/scripts/tv.js.map +1 -0
  203. package/dist/scripts/update.js +77 -10
  204. package/dist/scripts/update.js.map +1 -1
  205. package/dist/unlock.d.ts.map +1 -1
  206. package/dist/unlock.js +20 -8
  207. package/dist/unlock.js.map +1 -1
  208. package/docs/DEXBOT_COMPARISON.md +3 -3
  209. package/docs/EVOLUTION.md +8 -6
  210. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +3 -1
  211. package/docs/GRID_RECONCILE.md +1 -0
  212. package/docs/LOGGING.md +3 -0
  213. package/docs/MPA_CREDIT_USAGE.md +3 -1
  214. package/docs/README.md +2 -2
  215. package/docs/WORKFLOW.md +3 -1
  216. package/package.json +2 -1
  217. package/scripts/README.md +12 -0
@@ -3,7 +3,8 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { PATHS } from '../modules/paths.js';
5
5
  import { getStorage } from '../modules/storage/index.js';
6
- const { readJSON } = getStorage();
6
+ const { readJSON, writeJSON } = getStorage();
7
+ import { parseJsonWithComments } from '../modules/order/utils/system.js';
7
8
  import { MARKET_ADAPTER } from '../modules/constants.js';
8
9
  import { loadMarketProfiles } from './tradingview/tradingview_uplot_chart_generator.js';
9
10
  import { sanitizeKey } from '../modules/utils/sanitize_key.js';
@@ -20,7 +21,14 @@ function loadBotSettings(filePath = PATHS.PROFILES.BOTS_JSON) {
20
21
  return readJSON(filePath);
21
22
  }
22
23
  catch (_) {
23
- return null;
24
+ // The bot editor reads/writes through a comment-tolerant parser, so
25
+ // operator comments may legally exist — fall back before giving up.
26
+ try {
27
+ return parseJsonWithComments(fs.readFileSync(filePath, 'utf8'));
28
+ }
29
+ catch (_) {
30
+ return null;
31
+ }
24
32
  }
25
33
  }
26
34
  function computeBotKey(bot, index) {
@@ -68,6 +76,380 @@ function loadBotMeta(botKey, filePath = PATHS.PROFILES.BOTS_JSON) {
68
76
  const loose = entries.find((bot) => sanitizeKey(bot?.name) === normalizedKey.replace(/-\d+$/, ''));
69
77
  return loose || null;
70
78
  }
79
+ /**
80
+ * Locate the source span of the entryIndex-th object literal inside the
81
+ * top-level "bots" array of a (possibly comment-bearing) JSON document.
82
+ * Strings and // + block comments are skipped while scanning, so braces
83
+ * inside them never disturb the balance count. Returns null when the
84
+ * document shape is unexpected — callers fall back to a full rewrite.
85
+ */
86
+ function findBotsEntrySpan(raw, entryIndex) {
87
+ const m = /"bots"\s*:\s*\[/.exec(raw);
88
+ if (!m)
89
+ return null;
90
+ let i = m.index + m[0].length; // just past '['
91
+ const n = raw.length;
92
+ let count = 0;
93
+ const skipWsComments = () => {
94
+ while (i < n) {
95
+ const c = raw[i];
96
+ if (c === ' ' || c === '\t' || c === '\n' || c === '\r') {
97
+ i++;
98
+ continue;
99
+ }
100
+ if (c === '/' && raw[i + 1] === '/') {
101
+ while (i < n && raw[i] !== '\n')
102
+ i++;
103
+ continue;
104
+ }
105
+ if (c === '/' && raw[i + 1] === '*') {
106
+ i += 2;
107
+ while (i < n && !(raw[i] === '*' && raw[i + 1] === '/'))
108
+ i++;
109
+ i += 2;
110
+ continue;
111
+ }
112
+ break;
113
+ }
114
+ };
115
+ const skipString = () => {
116
+ const q = raw[i];
117
+ i++;
118
+ while (i < n) {
119
+ const c = raw[i];
120
+ if (c === '\\') {
121
+ i += 2;
122
+ continue;
123
+ }
124
+ if (c === q) {
125
+ i++;
126
+ return;
127
+ }
128
+ i++;
129
+ }
130
+ };
131
+ // Skip one JSON value starting at raw[i]; false on malformed input.
132
+ const skipValue = () => {
133
+ skipWsComments();
134
+ if (i >= n)
135
+ return false;
136
+ const c = raw[i];
137
+ if (c === '"' || c === "'") {
138
+ skipString();
139
+ return true;
140
+ }
141
+ if (c === '{' || c === '[') {
142
+ const open = c;
143
+ const close = c === '{' ? '}' : ']';
144
+ i++;
145
+ let depth = 1;
146
+ while (i < n && depth > 0) {
147
+ const d = raw[i];
148
+ if (d === '"' || d === "'") {
149
+ skipString();
150
+ continue;
151
+ }
152
+ if (d === '/' && raw[i + 1] === '/') {
153
+ while (i < n && raw[i] !== '\n')
154
+ i++;
155
+ continue;
156
+ }
157
+ if (d === '/' && raw[i + 1] === '*') {
158
+ i += 2;
159
+ while (i < n && !(raw[i] === '*' && raw[i + 1] === '/'))
160
+ i++;
161
+ i += 2;
162
+ continue;
163
+ }
164
+ if (d === open)
165
+ depth++;
166
+ else if (d === close)
167
+ depth--;
168
+ i++;
169
+ }
170
+ return depth === 0;
171
+ }
172
+ while (i < n && raw[i] !== ',' && raw[i] !== ']' && raw[i] !== '}')
173
+ i++;
174
+ return true;
175
+ };
176
+ for (;;) {
177
+ skipWsComments();
178
+ if (i >= n)
179
+ return null;
180
+ if (raw[i] === ']')
181
+ return null; // array ended before entryIndex
182
+ if (raw[i] === '{') {
183
+ const start = i;
184
+ if (!skipValue())
185
+ return null;
186
+ if (count === entryIndex)
187
+ return { start, end: i };
188
+ count++;
189
+ }
190
+ else if (!skipValue()) {
191
+ return null;
192
+ }
193
+ skipWsComments();
194
+ if (i < n && raw[i] === ',') {
195
+ i++;
196
+ continue;
197
+ }
198
+ if (i < n && raw[i] === ']')
199
+ return null;
200
+ return null; // malformed separator
201
+ }
202
+ }
203
+ /**
204
+ * Locate the string value of a top-level key inside one bot-entry source
205
+ * span. Unlike a regex, this scan skips over // and block comments as well
206
+ * as string literals, so a key-looking fragment inside a comment (e.g.
207
+ * `// "accountId": "1.2.9999" (old)`) can never be mistaken for the real
208
+ * key. Returns the span of the quoted value (including quotes), or null
209
+ * when the key is absent or its value is not a string.
210
+ */
211
+ function findEntryKeyValueSpan(entrySrc, key) {
212
+ const n = entrySrc.length;
213
+ const isWs = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r';
214
+ let i = 0;
215
+ let depth = 0;
216
+ while (i < n) {
217
+ const c = entrySrc[i];
218
+ if (isWs(c)) {
219
+ i++;
220
+ continue;
221
+ }
222
+ if (c === '/' && entrySrc[i + 1] === '/') {
223
+ while (i < n && entrySrc[i] !== '\n')
224
+ i++;
225
+ continue;
226
+ }
227
+ if (c === '/' && entrySrc[i + 1] === '*') {
228
+ i += 2;
229
+ while (i < n && !(entrySrc[i] === '*' && entrySrc[i + 1] === '/'))
230
+ i++;
231
+ i += 2;
232
+ continue;
233
+ }
234
+ if (c === '{' || c === '[') {
235
+ depth++;
236
+ i++;
237
+ continue;
238
+ }
239
+ if (c === '}' || c === ']') {
240
+ depth--;
241
+ i++;
242
+ continue;
243
+ }
244
+ if (c !== '"') {
245
+ i++;
246
+ continue;
247
+ }
248
+ // String literal: read it (honoring backslash escapes).
249
+ let j = i + 1;
250
+ let str = '';
251
+ while (j < n) {
252
+ const d = entrySrc[j];
253
+ if (d === '\\') {
254
+ str += entrySrc.slice(j, j + 2);
255
+ j += 2;
256
+ continue;
257
+ }
258
+ if (d === '"')
259
+ break;
260
+ str += d;
261
+ j++;
262
+ }
263
+ if (j >= n)
264
+ return null;
265
+ const closingQuote = j;
266
+ if (depth !== 1 || str !== key) {
267
+ i = closingQuote + 1;
268
+ continue;
269
+ }
270
+ // Candidate key at top level: expect `:` then a quoted value.
271
+ let k = closingQuote + 1;
272
+ while (k < n && isWs(entrySrc[k]))
273
+ k++;
274
+ if (entrySrc[k] !== ':') {
275
+ i = closingQuote + 1;
276
+ continue;
277
+ }
278
+ k++;
279
+ while (k < n && isWs(entrySrc[k]))
280
+ k++;
281
+ if (entrySrc[k] !== '"') {
282
+ i = closingQuote + 1;
283
+ continue;
284
+ }
285
+ let m = k + 1;
286
+ while (m < n) {
287
+ const e = entrySrc[m];
288
+ if (e === '\\') {
289
+ m += 2;
290
+ continue;
291
+ }
292
+ if (e === '"')
293
+ return { valueStart: k, valueEnd: m + 1 };
294
+ m++;
295
+ }
296
+ return null;
297
+ }
298
+ return null;
299
+ }
300
+ /**
301
+ * Byte-preserving accountId update: replaces the value in place, or inserts
302
+ * `"accountId"` right after `"preferredAccount"` keeping the line indent, so
303
+ * comments, key order and formatting elsewhere in the file survive. The
304
+ * patched document is re-parsed (comments allowed) and the value asserted
305
+ * before the atomic tmp+rename write. Returns false on any uncertainty —
306
+ * callers fall back to a full rewrite.
307
+ */
308
+ function patchAccountIdInRaw(filePath, entryIndex, accountId) {
309
+ let raw;
310
+ try {
311
+ raw = fs.readFileSync(filePath, 'utf8');
312
+ }
313
+ catch (_) {
314
+ return false;
315
+ }
316
+ const span = findBotsEntrySpan(raw, entryIndex);
317
+ if (!span)
318
+ return false;
319
+ const entrySrc = raw.slice(span.start, span.end);
320
+ let patchedEntry = null;
321
+ const idSpan = findEntryKeyValueSpan(entrySrc, 'accountId');
322
+ if (idSpan) {
323
+ patchedEntry = entrySrc.slice(0, idSpan.valueStart)
324
+ + `"${accountId}"`
325
+ + entrySrc.slice(idSpan.valueEnd);
326
+ }
327
+ else {
328
+ const prefSpan = findEntryKeyValueSpan(entrySrc, 'preferredAccount');
329
+ if (!prefSpan)
330
+ return false;
331
+ const lineStart = entrySrc.lastIndexOf('\n', prefSpan.valueEnd) + 1;
332
+ const indentMatch = /^[ \t]*/.exec(entrySrc.slice(lineStart));
333
+ const indent = indentMatch ? indentMatch[0] : ' ';
334
+ patchedEntry = entrySrc.slice(0, prefSpan.valueEnd)
335
+ + `,\n${indent}"accountId": "${accountId}"`
336
+ + entrySrc.slice(prefSpan.valueEnd);
337
+ }
338
+ if (!patchedEntry || patchedEntry === entrySrc)
339
+ return false;
340
+ const patched = raw.slice(0, span.start) + patchedEntry + raw.slice(span.end);
341
+ try {
342
+ const reparsed = parseJsonWithComments(patched);
343
+ const checkEntries = Array.isArray(reparsed?.bots) ? reparsed.bots : [];
344
+ if (checkEntries[entryIndex]?.accountId !== accountId)
345
+ return false;
346
+ }
347
+ catch (_) {
348
+ return false;
349
+ }
350
+ const tmpPath = `${filePath}.tmp-persist-${process.pid}-${Date.now()}`;
351
+ try {
352
+ fs.writeFileSync(tmpPath, patched, 'utf8');
353
+ fs.renameSync(tmpPath, filePath);
354
+ return true;
355
+ }
356
+ catch (_) {
357
+ try {
358
+ fs.unlinkSync(tmpPath);
359
+ }
360
+ catch (_) { /* best-effort cleanup */ }
361
+ return false;
362
+ }
363
+ }
364
+ /**
365
+ * Persist a resolved account name → ID mapping onto the bot entry in
366
+ * profiles/bots.json (`accountId` next to `preferredAccount`), so analysis
367
+ * tools can skip the chain lookup on subsequent runs. No-op when the stored
368
+ * value already matches. Prefers a byte-preserving textual patch (comments,
369
+ * key order and formatting survive); falls back to a full rewrite using the
370
+ * same atomic writeJSON serialization the bot editor uses. Returns true when
371
+ * the file was updated.
372
+ */
373
+ function persistBotAccountId(botKey, accountId, filePath = PATHS.PROFILES.BOTS_JSON) {
374
+ if (!botKey || !/^1\.2\.\d+$/.test(String(accountId)))
375
+ return false;
376
+ let settings = null;
377
+ try {
378
+ settings = loadBotSettings(filePath);
379
+ }
380
+ catch (_) {
381
+ return false;
382
+ }
383
+ const entries = Array.isArray(settings?.bots) ? settings.bots : [];
384
+ const normalizedKey = String(botKey).toLowerCase();
385
+ const index = entries.findIndex((bot, i) => computeBotKey(bot, i) === normalizedKey);
386
+ if (index < 0 || entries[index]?.accountId === accountId)
387
+ return false;
388
+ try {
389
+ if (patchAccountIdInRaw(filePath, index, String(accountId)))
390
+ return true;
391
+ }
392
+ catch (_) {
393
+ // Fall through to the full rewrite below.
394
+ }
395
+ entries[index].accountId = String(accountId);
396
+ try {
397
+ writeJSON(filePath, settings);
398
+ return true;
399
+ }
400
+ catch (_) {
401
+ return false;
402
+ }
403
+ }
404
+ /**
405
+ * Return the stored chain account ID for a bot key, or null when none is
406
+ * stamped yet. When expectedRef is given, the stored ID is only returned if
407
+ * the entry's current preferredAccount still matches it — a rename must
408
+ * never silently reuse a stale ID.
409
+ */
410
+ function getStoredBotAccountId(botKey, expectedRef, filePath = PATHS.PROFILES.BOTS_JSON) {
411
+ if (!botKey)
412
+ return null;
413
+ let meta = null;
414
+ try {
415
+ meta = loadBotMeta(botKey, filePath);
416
+ }
417
+ catch (_) {
418
+ return null;
419
+ }
420
+ const stored = meta && /^1\.2\.\d+$/.test(String(meta.accountId ?? '')) ? String(meta.accountId) : null;
421
+ if (!stored)
422
+ return null;
423
+ if (expectedRef != null && String(meta.preferredAccount ?? '').toLowerCase() !== String(expectedRef).toLowerCase())
424
+ return null;
425
+ return stored;
426
+ }
427
+ /**
428
+ * Find the bot entry whose preferredAccount matches a raw account reference
429
+ * (case-insensitive). Used by tools that accept a bare account name to locate
430
+ * the stored accountId and the persist target. Returns null for 1.2.x input
431
+ * or when no bot claims the name.
432
+ */
433
+ function findBotKeyByAccountRef(ref, filePath = PATHS.PROFILES.BOTS_JSON) {
434
+ if (!ref || /^1\.2\.\d+$/.test(String(ref)))
435
+ return null;
436
+ let settings = null;
437
+ try {
438
+ settings = loadBotSettings(filePath);
439
+ }
440
+ catch (_) {
441
+ return null;
442
+ }
443
+ const entries = Array.isArray(settings?.bots) ? settings.bots : [];
444
+ const want = String(ref).toLowerCase();
445
+ for (let i = 0; i < entries.length; i++) {
446
+ const entry = entries[i];
447
+ if (entry && String(entry.preferredAccount ?? '').toLowerCase() === want) {
448
+ return { botKey: computeBotKey(entry, i), meta: entry };
449
+ }
450
+ }
451
+ return null;
452
+ }
71
453
  function resolveAmaConfig(botKey) {
72
454
  const botMeta = loadBotMeta(botKey);
73
455
  // Unknown bot key: fall back to the global erSmoothPeriod default (same
@@ -152,5 +534,5 @@ function resolveAmaKey(botKey) {
152
534
  }
153
535
  return 'AMA3';
154
536
  }
155
- export { loadBotSettings, sanitizeKey, computeBotKey, resolveBotKey, candleFileForBot, resolveCandleFile, loadBotMeta, resolveAmaConfig, resolveAmaKey };
537
+ export { loadBotSettings, sanitizeKey, computeBotKey, resolveBotKey, candleFileForBot, resolveCandleFile, loadBotMeta, getStoredBotAccountId, findBotKeyByAccountRef, persistBotAccountId, resolveAmaConfig, resolveAmaKey };
156
538
  //# sourceMappingURL=bot_key_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bot_key_utils.js","sourceRoot":"","sources":["../../analysis/bot_key_utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot_key_utils.js","sourceRoot":"","sources":["../../analysis/bot_key_utils.ts"],"names":[],"mappings":"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"}
@@ -15,12 +15,16 @@ const { writeJSON } = getStorage();
15
15
  * Q1 — top 100 accounts by limit_order_create count
16
16
  * Q2 — top 100 accounts by limit_order_cancel count
17
17
  * Q3 — top 100 accounts by fill_order count
18
+ * Q4 — top 200 accounts by limit_order_update count (op 77, DEXBot2 fingerprint)
18
19
  * 2. Merge & pre-filter:
19
20
  * creates ≥ MIN_CREATES (grid analysis determines DEXBot candidacy)
20
21
  * 3. Grid analysis (parallel, batches of 5):
21
22
  * Fetch 200 raw orders per candidate → per-session geometric spacing test
22
23
  * 4. BitShares: resolve account IDs → names (batch db.get_objects call)
23
- * 5. Rank by DEX score and print table
24
+ * 5. Rank by DEX score and print table.
25
+ * HIGH tier (80+) is split by op-77 usage:
26
+ * updates ≥ 1 → DEXBot2 (native limit_order_update in-place re-price)
27
+ * updates = 0 → DEXBot1-style (cancel-only, cancel + recreate)
24
28
  *
25
29
  * Usage:
26
30
  * node dist/analysis/bot_usage/discover_bot_accounts.js
@@ -41,7 +45,7 @@ const { writeJSON } = getStorage();
41
45
  * --verbose Print extra debug/diagnostic info
42
46
  * --help, -h Show this help
43
47
  */
44
- import { kibanaSearch, buildOrderPriceQuery, buildTopSellerAccountsQuery, buildTopCancellerAccountsQuery, buildTopFilledAccountsQuery, DEFAULT_CONFIG, } from './kibana_bot_queries.js';
48
+ import { kibanaSearch, buildOrderPriceQuery, buildTopSellerAccountsQuery, buildTopCancellerAccountsQuery, buildTopFilledAccountsQuery, buildTopUpdaterAccountsQuery, DEFAULT_CONFIG, } from './kibana_bot_queries.js';
45
49
  import { NODE_MANAGEMENT } from '../../modules/constants.js';
46
50
  // ─── Configuration ────────────────────────────────────────────────────────────
47
51
  // Node pool from central node management (failover-capable) instead of a
@@ -287,14 +291,16 @@ async function run() {
287
291
  console.log('');
288
292
  // ── Phase 1: Discovery queries ─────────────────────────────────────────────
289
293
  console.log('Phase 1: Querying Kibana for top active accounts...');
290
- const [createRes, cancelRes, fillRes] = await Promise.all([
294
+ const [createRes, cancelRes, fillRes, updateRes] = await Promise.all([
291
295
  withRetry(() => kibanaSearch(KIBANA_CFG, buildTopSellerAccountsQuery(lookbackH, 200, opts.minCreates)), 'top-seller query'),
292
296
  withRetry(() => kibanaSearch(KIBANA_CFG, buildTopCancellerAccountsQuery(lookbackH, 200, 5)), 'top-canceller query'),
293
297
  withRetry(() => kibanaSearch(KIBANA_CFG, buildTopFilledAccountsQuery(lookbackH, 200, 3)), 'top-fills query'),
298
+ withRetry(() => kibanaSearch(KIBANA_CFG, buildTopUpdaterAccountsQuery(lookbackH, 200, 1)), 'top-updater query'),
294
299
  ]);
295
300
  const createBuckets = createRes?.aggregations?.by_account?.buckets ?? [];
296
301
  const cancelBuckets = cancelRes?.aggregations?.by_account?.buckets ?? [];
297
302
  const fillBuckets = fillRes?.aggregations?.by_account?.buckets ?? [];
303
+ const updateBuckets = updateRes?.aggregations?.by_account?.buckets ?? [];
298
304
  if (opts.verbose) {
299
305
  console.log(` [verbose] createRes keys: ${Object.keys(createRes ?? {}).join(', ')}`);
300
306
  console.log(` [verbose] createRes took: ${createRes?.took ?? '?'}ms`);
@@ -302,6 +308,7 @@ async function run() {
302
308
  console.log(` Creates: ${createBuckets.length} accounts with ≥${opts.minCreates} creates`);
303
309
  console.log(` Cancels: ${cancelBuckets.length} accounts with ≥5 cancels`);
304
310
  console.log(` Fills: ${fillBuckets.length} accounts with ≥3 fills`);
311
+ console.log(` Updates: ${updateBuckets.length} accounts with ≥1 limit_order_update (op 77)`);
305
312
  if (createBuckets.length === 0) {
306
313
  console.log('');
307
314
  console.log(' No accounts found. Try a larger --days window or lower --min-creates.');
@@ -315,18 +322,25 @@ async function run() {
315
322
  console.log('\nPhase 2: Merging and filtering candidates...');
316
323
  const accounts = {};
317
324
  for (const b of createBuckets)
318
- accounts[b.key] = { creates: b.doc_count, cancels: 0, fills: 0 };
325
+ accounts[b.key] = { creates: b.doc_count, cancels: 0, fills: 0, updates: 0 };
319
326
  for (const b of cancelBuckets) {
320
327
  if (!accounts[b.key])
321
- accounts[b.key] = { creates: 0, cancels: 0, fills: 0 };
328
+ accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
322
329
  accounts[b.key].cancels = b.doc_count;
323
330
  }
324
331
  for (const b of fillBuckets) {
325
332
  if (!accounts[b.key])
326
- accounts[b.key] = { creates: 0, cancels: 0, fills: 0 };
333
+ accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
327
334
  accounts[b.key].fills = b.doc_count;
328
335
  }
336
+ for (const b of updateBuckets) {
337
+ if (!accounts[b.key])
338
+ accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
339
+ accounts[b.key].updates = b.doc_count;
340
+ }
329
341
  // Pre-filter: must have creates ≥ minCreates (grid analysis determines DEXBot candidacy)
342
+ // Flavor: any limit_order_update (op 77) in-window → DEXBot2 (native in-place
343
+ // re-price); zero updates → DEXBot1-style (cancel-only: cancel + recreate).
330
344
  const candidates = Object.entries(accounts)
331
345
  .filter(([, s]) => s.creates >= opts.minCreates)
332
346
  .map(([id, s]) => ({
@@ -334,6 +348,8 @@ async function run() {
334
348
  creates: s.creates,
335
349
  cancels: s.cancels,
336
350
  fills: s.fills,
351
+ updates: s.updates,
352
+ flavor: (s.updates >= 1 ? 'DEXBot2' : 'DEXBot1'),
337
353
  cancelRatio: s.cancels / Math.max(s.creates, 1),
338
354
  fillRate: s.creates > 0 ? (s.fills / s.creates * 100) : 0,
339
355
  }))
@@ -419,9 +435,40 @@ async function run() {
419
435
  console.log(' Discovery Results — Ranked by DEX Score');
420
436
  console.log('════════════════════════════════════════════════════════════════════════════════════');
421
437
  console.log('');
422
- // Print by DEX score tier
438
+ // Print by DEX score tier. HIGH tier (80+) splits by update-order usage:
439
+ // DEXBot2 — broadcast limit_order_update (op 77) in-window (in-place re-price)
440
+ // DEXBot1-style — cancel-only, no op 77 (cancel + recreate)
441
+ const highV2 = results.filter(r => r.dexScore >= 80 && r.updates >= 1);
442
+ const highV1 = results.filter(r => r.dexScore >= 80 && r.updates < 1);
443
+ const hdrHigh = ' # Name ID Creates Fills Cancel Fill% C/C MaxBatch Incr% Grid DEX Updates';
444
+ function printHighGroup(label, rows) {
445
+ if (!rows.length)
446
+ return;
447
+ console.log(` ── ${label}`);
448
+ console.log('');
449
+ console.log(hdrHigh);
450
+ console.log(' ' + '─'.repeat(hdrHigh.length - 1));
451
+ for (const r of rows) {
452
+ const rank = String(results.indexOf(r) + 1).padStart(2);
453
+ const name = r.name.padEnd(22).slice(0, 22);
454
+ const id = r.id.padEnd(14);
455
+ const creates = String(r.creates).padStart(7);
456
+ const fills = String(r.fills).padStart(6);
457
+ const cancels = String(r.cancels).padStart(7);
458
+ const fr = (r.fillRate.toFixed(1) + '%').padStart(5);
459
+ const cr = r.cancelRatio.toFixed(2).padStart(4);
460
+ const batch = String(r.maxBatch || '-').padStart(9);
461
+ const inc = (r.impliedInc != null ? r.impliedInc.toFixed(2) + '%' : 'n/a').padStart(6);
462
+ const grid = String(r.gridScore).padStart(5);
463
+ const dex = String(r.dexScore).padStart(4);
464
+ const upd = String(r.updates).padStart(7);
465
+ console.log(` ${rank} ${name} ${id} ${creates} ${fills} ${cancels} ${fr} ${cr} ${batch} ${inc} ${grid} ${dex} ${upd}`);
466
+ }
467
+ console.log('');
468
+ }
469
+ printHighGroup('HIGH confidence — DEXBot2 (80+, uses limit_order_update op 77)', highV2);
470
+ printHighGroup('HIGH confidence — DEXBot1-style (80+, cancel-only, no op 77)', highV1);
423
471
  const tiers = [
424
- { label: 'HIGH confidence (80+) — almost certainly DEXBot/DEXBot2', min: 80, max: 101 },
425
472
  { label: 'MEDIUM confidence (50–79) — likely a grid bot', min: 50, max: 80 },
426
473
  { label: 'LOW confidence (25–49) — some automation detected', min: 25, max: 50 },
427
474
  { label: 'WEAK signal (<25) — create/cancel pattern, no grid', min: 0, max: 25 },
@@ -453,12 +500,12 @@ async function run() {
453
500
  console.log('');
454
501
  }
455
502
  // ── Summary ───────────────────────────────────────────────────────────────
456
- const high = results.filter(r => r.dexScore >= 80).length;
503
+ const high = highV2.length + highV1.length;
457
504
  const medium = results.filter(r => r.dexScore >= 50 && r.dexScore < 80).length;
458
505
  const low = results.filter(r => r.dexScore >= 25 && r.dexScore < 50).length;
459
506
  console.log('════════════════════════════════════════════════════════════════════════════════════');
460
507
  console.log(` Total candidates scanned: ${results.length}`);
461
- console.log(` HIGH (80+): ${high} accounts — almost certainly DEXBot/DEXBot2`);
508
+ console.log(` HIGH (80+): ${high} accounts — DEXBot2: ${highV2.length} (op 77 updates) / DEXBot1-style: ${highV1.length} (cancel-only)`);
462
509
  console.log(` MEDIUM (50+): ${medium} accounts — likely grid bots`);
463
510
  console.log(` LOW (25+): ${low} accounts — weak signal`);
464
511
  console.log('');
@@ -466,15 +513,18 @@ async function run() {
466
513
  console.log(' C/C = cancel/create ratio (grid bots: ~1.0)');
467
514
  console.log(' Incr% = implied grid increment from price spacing');
468
515
  console.log(' Grid = grid quality 0-100 | DEX = DEXBot confidence 0-100');
516
+ console.log(' Updates = limit_order_update (op 77) count — DEXBot2 only; 0 = cancel-only (DEXBot1-style)');
469
517
  console.log('');
470
518
  // ── Export JSON ────────────────────────────────────────────────────────────
471
519
  if (opts.outputJson) {
472
520
  const exportData = results.map(r => ({
473
521
  id: r.id,
474
522
  name: r.name,
523
+ flavor: r.flavor,
475
524
  creates: r.creates,
476
525
  fills: r.fills,
477
526
  cancels: r.cancels,
527
+ updates: r.updates,
478
528
  fillPct: r.fillRate,
479
529
  cancelRatio: r.cancelRatio,
480
530
  maxBatch: r.maxBatch,