dexbot 1.3.2 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/credential-daemon.d.ts.map +1 -1
- package/dist/credential-daemon.js +53 -13
- package/dist/credential-daemon.js.map +1 -1
- package/dist/modules/bitshares-native/serial/types.js +1 -1
- package/dist/modules/bitshares-native/serial/types.js.map +1 -1
- package/dist/modules/chain_keys.js +1 -1
- package/dist/modules/chain_keys.js.map +1 -1
- package/dist/modules/constants.d.ts +2 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +10 -0
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/credential_policy.js +1 -1
- package/dist/modules/credential_policy.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +45 -175
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +84 -3496
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +319 -0
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_cow_runtime.js +1764 -0
- package/dist/modules/dexbot_cow_runtime.js.map +1 -0
- package/dist/modules/dexbot_fill_runtime.d.ts +47 -0
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_fill_runtime.js +607 -3
- package/dist/modules/dexbot_fill_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts +69 -0
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +244 -15
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts +30 -0
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_startup_runtime.js +539 -0
- package/dist/modules/dexbot_startup_runtime.js.map +1 -0
- package/dist/modules/dexbot_state_recovery.d.ts +128 -0
- package/dist/modules/dexbot_state_recovery.d.ts.map +1 -0
- package/dist/modules/dexbot_state_recovery.js +397 -0
- package/dist/modules/dexbot_state_recovery.js.map +1 -0
- package/dist/modules/fund_registry.d.ts.map +1 -1
- package/dist/modules/fund_registry.js +0 -1
- package/dist/modules/fund_registry.js.map +1 -1
- package/dist/modules/general_settings.d.ts.map +1 -1
- package/dist/modules/general_settings.js +0 -1
- package/dist/modules/general_settings.js.map +1 -1
- package/dist/modules/key_store.d.ts.map +1 -1
- package/dist/modules/key_store.js +1 -2
- package/dist/modules/key_store.js.map +1 -1
- package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -1
- package/dist/modules/launcher/market_adapter_runtime.js +0 -1
- package/dist/modules/launcher/market_adapter_runtime.js.map +1 -1
- package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -1
- package/dist/modules/launcher/market_adapter_watchdog.js +1 -2
- package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -1
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile.js +0 -1
- package/dist/modules/order/grid_reconcile.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +2 -2
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/utils/math.js +1 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/system.js +1 -1
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.d.ts.map +1 -1
- package/dist/modules/order/utils/validate.js +0 -1
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/modules/paths.d.ts +2 -0
- package/dist/modules/paths.d.ts.map +1 -1
- package/dist/modules/paths.js +13 -2
- package/dist/modules/paths.js.map +1 -1
- package/dist/scripts/verify-browser-bundle.js +25 -1
- package/dist/scripts/verify-browser-bundle.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Startup runtime - bot initialization, grid placement, and startup sequence */
|
|
3
|
+
const { path } = require('./path_api');
|
|
4
|
+
const { BitShares, onReconnect: registerReconnectHook } = require('./bitshares_client');
|
|
5
|
+
const chainOrders = require('./chain_orders');
|
|
6
|
+
const { OrderManager, grid: Grid } = require('./order');
|
|
7
|
+
function initializeFeeCache(...args) { return require('./order/utils/system').initializeFeeCache(...args); }
|
|
8
|
+
function parseJsonWithComments(...args) { return require('./order/utils/system').parseJsonWithComments(...args); }
|
|
9
|
+
function buildFillKey(...args) { return require('./order/utils/order').buildFillKey(...args); }
|
|
10
|
+
function correctAllPriceMismatches(...args) { return require('./order/utils/order').correctAllPriceMismatches(...args); }
|
|
11
|
+
function parseChainOrder(...args) { return require('./order/utils/order').parseChainOrder(...args); }
|
|
12
|
+
const { ORDER_STATES } = require('./constants');
|
|
13
|
+
const { PATHS } = require('./paths');
|
|
14
|
+
const { getStorage } = require('./storage');
|
|
15
|
+
const storage = getStorage();
|
|
16
|
+
const { normalizeBotEntry } = require('./bot_settings');
|
|
17
|
+
const Format = require('./order/format');
|
|
18
|
+
function attemptResumePersistedGridByPriceMatch(...args) { return require('./order/grid_reconcile').attemptResumePersistedGridByPriceMatch(...args); }
|
|
19
|
+
function decideStartupGridAction(...args) { return require('./order/grid_reconcile').decideStartupGridAction(...args); }
|
|
20
|
+
function reconcileGridOrders(...args) { return require('./order/grid_reconcile').reconcileGridOrders(...args); }
|
|
21
|
+
const { AccountOrders } = require('./account_orders');
|
|
22
|
+
const PROFILES_BOTS_FILE = PATHS.PROFILES.BOTS_JSON;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the startup state: account orders, manager, persisted data.
|
|
25
|
+
* @param {import('./dexbot_class').DEXBot} bot
|
|
26
|
+
* @returns {Promise<Object>} startupState
|
|
27
|
+
*/
|
|
28
|
+
async function initializeStartupState(bot) {
|
|
29
|
+
bot.accountOrders = new AccountOrders({ botKey: bot.config.botKey });
|
|
30
|
+
bot._processedFillStore.configure({
|
|
31
|
+
accountOrders: bot.accountOrders
|
|
32
|
+
});
|
|
33
|
+
const loadedPersistedFills = bot._processedFillStore.loadPersisted({
|
|
34
|
+
minTimestamp: Date.now() - bot._fillRecordRetentionMs
|
|
35
|
+
});
|
|
36
|
+
if (loadedPersistedFills > 0) {
|
|
37
|
+
bot._log(`Loaded ${loadedPersistedFills} persisted fill records to prevent reprocessing`);
|
|
38
|
+
}
|
|
39
|
+
const raw = storage.readFile(PROFILES_BOTS_FILE);
|
|
40
|
+
const allBotsConfig = parseJsonWithComments(raw).bots || [];
|
|
41
|
+
const myBotConfig = allBotsConfig
|
|
42
|
+
.map((b, originalIdx) => b.active !== false ? normalizeBotEntry(b, originalIdx) : null)
|
|
43
|
+
.find(b => b && b.botKey === bot.config.botKey);
|
|
44
|
+
if (myBotConfig) {
|
|
45
|
+
await bot.accountOrders.syncMeta(myBotConfig);
|
|
46
|
+
}
|
|
47
|
+
if (!bot.manager) {
|
|
48
|
+
const mgrLogFile = bot.config?.name ? path.join(PATHS.LOGS_DIR, `${bot.config.name}.log`) : undefined;
|
|
49
|
+
bot.manager = new OrderManager({ ...bot.config, logFile: mgrLogFile });
|
|
50
|
+
bot.manager.account = bot.account;
|
|
51
|
+
bot.manager.accountId = bot.accountId;
|
|
52
|
+
bot.manager.accountOrders = bot.accountOrders;
|
|
53
|
+
}
|
|
54
|
+
bot._wireStructuralGridResyncRequest();
|
|
55
|
+
bot._wireProcessedFillTracking();
|
|
56
|
+
bot.manager.startBootstrap();
|
|
57
|
+
try {
|
|
58
|
+
try {
|
|
59
|
+
if (bot.accountId && bot.config.assetA && bot.config.assetB) {
|
|
60
|
+
await bot.manager._initializeAssets();
|
|
61
|
+
await bot.manager.fetchAccountTotals(bot.accountId);
|
|
62
|
+
bot._log('Fetched blockchain account balances at startup');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
bot._log(`Startup balance fetch FAILED: ${err.message}. Order sizing may be incorrect until next successful sync.`, 'error');
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
await initializeFeeCache([bot.config || {}], BitShares);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
bot._log(`Fee cache initialization FAILED: ${err.message}. Fee calculations will use defaults until cache is refreshed.`, 'error');
|
|
73
|
+
}
|
|
74
|
+
const persistedGrid = bot.accountOrders.loadGrid();
|
|
75
|
+
let repairedGrid = persistedGrid;
|
|
76
|
+
if (persistedGrid && persistedGrid.length > 0) {
|
|
77
|
+
let repairCount = 0;
|
|
78
|
+
repairedGrid = persistedGrid.map(order => {
|
|
79
|
+
if (order && order.orderId && order.orderId === order.id) {
|
|
80
|
+
repairCount++;
|
|
81
|
+
const repairedOrder = { ...order, orderId: '' };
|
|
82
|
+
if (repairedOrder.state === ORDER_STATES.ACTIVE || repairedOrder.state === ORDER_STATES.PARTIAL) {
|
|
83
|
+
repairedOrder.state = ORDER_STATES.VIRTUAL;
|
|
84
|
+
}
|
|
85
|
+
return repairedOrder;
|
|
86
|
+
}
|
|
87
|
+
return order;
|
|
88
|
+
});
|
|
89
|
+
if (repairCount > 0) {
|
|
90
|
+
bot._log(`[REPAIR] Stripped ${repairCount} fake orderId(s) from persisted grid to restore rebalancing logic.`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const persistedBtsFeesOwed = bot.accountOrders.loadBtsFeesOwed();
|
|
94
|
+
const persistedBoundaryIdx = bot.accountOrders.loadBoundaryIdx();
|
|
95
|
+
const persistedBtsBalance = bot.accountOrders.loadBtsBalance();
|
|
96
|
+
const persistedRecentFillKeys = bot.accountOrders.loadRecentFillKeys();
|
|
97
|
+
return {
|
|
98
|
+
persistedGrid: repairedGrid,
|
|
99
|
+
persistedBtsFeesOwed,
|
|
100
|
+
persistedBoundaryIdx,
|
|
101
|
+
persistedBtsBalance,
|
|
102
|
+
persistedRecentFillKeys,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
bot.manager.finishBootstrap();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Finish the startup sequence: activate fill listener, reconcile grid, place initial orders.
|
|
111
|
+
* @param {import('./dexbot_class').DEXBot} bot
|
|
112
|
+
* @param {Object} startupState
|
|
113
|
+
*/
|
|
114
|
+
async function finishStartupSequence(bot, startupState) {
|
|
115
|
+
let { persistedGrid, persistedBtsFeesOwed, persistedBoundaryIdx, persistedBtsBalance, persistedRecentFillKeys, } = startupState;
|
|
116
|
+
try {
|
|
117
|
+
if (typeof bot._fillsUnsubscribe === 'function') {
|
|
118
|
+
await bot._fillsUnsubscribe().catch(() => { });
|
|
119
|
+
}
|
|
120
|
+
bot._fillsUnsubscribe = await chainOrders.listenForFills(bot.account || undefined, bot._createFillCallback(chainOrders));
|
|
121
|
+
if (typeof bot._fillsUnsubscribe !== 'function') {
|
|
122
|
+
bot._warn('Fill listener did not provide an unsubscribe handler. Shutdown cleanup may be incomplete.');
|
|
123
|
+
bot._fillsUnsubscribe = null;
|
|
124
|
+
}
|
|
125
|
+
bot._log('Fill listener activated (ready to process fills during startup)');
|
|
126
|
+
if (!bot._reconnectUnregister) {
|
|
127
|
+
bot._reconnectUnregister = registerReconnectHook(() => {
|
|
128
|
+
bot._log('Blockchain connection re-established; scheduling safety-net sync');
|
|
129
|
+
const runSafetyNetSync = async () => {
|
|
130
|
+
if (bot.manager && bot.accountId && !bot._shuttingDown && !bot.config.dryRun) {
|
|
131
|
+
const safetyNetTimeoutMs = bot.config.timing?.SAFETY_NET_SYNC_TIMEOUT_MS;
|
|
132
|
+
let safetyNetTimer;
|
|
133
|
+
const workPromise = bot.manager._fillProcessingLock.acquire(async () => {
|
|
134
|
+
if (bot._shuttingDown)
|
|
135
|
+
return;
|
|
136
|
+
const chainOpenOrders = await chainOrders.readOpenOrders(bot.accountId);
|
|
137
|
+
if (bot._shuttingDown)
|
|
138
|
+
return;
|
|
139
|
+
const syncResult = await bot.manager.synchronizeWithChain(chainOpenOrders, 'readOpenOrders');
|
|
140
|
+
if (bot._shuttingDown)
|
|
141
|
+
return;
|
|
142
|
+
if (syncResult?.filledOrders?.length > 0) {
|
|
143
|
+
bot._refreshDynamicWeightDistribution('post-reconnect sync fill');
|
|
144
|
+
bot._log(`Post-reconnect sync: ${syncResult.filledOrders.length} grid order(s) found filled.`, 'info');
|
|
145
|
+
await bot._processFillsWithBatching(syncResult.filledOrders, new Set(), 'post-reconnect sync fill');
|
|
146
|
+
if (bot._shuttingDown)
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
bot.manager._recentFillKeysSnapshot = bot._getRecentFillKeysSnapshot();
|
|
150
|
+
await bot.manager.persistGrid();
|
|
151
|
+
if (!bot._shuttingDown) {
|
|
152
|
+
try {
|
|
153
|
+
const reconnectHealth = await bot.manager.checkGridHealth(bot.updateOrdersOnChainPlan.bind(bot));
|
|
154
|
+
await bot._cancelDustOrders({
|
|
155
|
+
buy: reconnectHealth.buyDustOrders,
|
|
156
|
+
sell: reconnectHealth.sellDustOrders,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (_dustErr) {
|
|
160
|
+
bot._warn(`[RECONNECT] Dust cancel failed: ${_dustErr.message}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
try {
|
|
165
|
+
await Promise.race([
|
|
166
|
+
workPromise,
|
|
167
|
+
new Promise((_, reject) => {
|
|
168
|
+
safetyNetTimer = setTimeout(() => reject(new Error(`Safety-net sync exceeded ${safetyNetTimeoutMs}ms cap`)), safetyNetTimeoutMs);
|
|
169
|
+
})
|
|
170
|
+
]);
|
|
171
|
+
}
|
|
172
|
+
catch (capErr) {
|
|
173
|
+
const fallback = await Promise.race([
|
|
174
|
+
workPromise.then(() => ({ ok: true })),
|
|
175
|
+
new Promise(resolve => setTimeout(() => resolve({ ok: false }), 0))
|
|
176
|
+
]);
|
|
177
|
+
if (fallback.ok) {
|
|
178
|
+
bot._log(`Safety-net sync completed despite timeout — ignoring spurious error.`, 'info');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
bot._warn(`Post-reconnect safety-net sync aborted: ${capErr?.message || capErr}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
if (safetyNetTimer)
|
|
186
|
+
clearTimeout(safetyNetTimer);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
setImmediate(() => {
|
|
191
|
+
runSafetyNetSync().catch(err => {
|
|
192
|
+
try {
|
|
193
|
+
bot._warn('Post-reconnect safety-net sync failed: ' + (err?.message || err));
|
|
194
|
+
}
|
|
195
|
+
catch (_warnErr) {
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const hadTriggerReset = await bot._handlePendingTriggerReset();
|
|
202
|
+
if (hadTriggerReset) {
|
|
203
|
+
bot._log('Trigger reset completed. Skipping normal startup grid initialization.');
|
|
204
|
+
await bot.manager._fillProcessingLock.acquire(async () => {
|
|
205
|
+
if (bot._incomingFillQueue.length > 0) {
|
|
206
|
+
bot._log(`[POST-RESET] ${bot._incomingFillQueue.length} fill(s) detected during trigger reset. Processing...`);
|
|
207
|
+
const fills = bot._incomingFillQueue.splice(0);
|
|
208
|
+
const processedFillKeys = new Set();
|
|
209
|
+
let requiresOpenOrdersSync = false;
|
|
210
|
+
for (const fill of fills) {
|
|
211
|
+
if (!fill || fill.op?.[0] !== 4)
|
|
212
|
+
continue;
|
|
213
|
+
const fillOp = fill.op[1];
|
|
214
|
+
const gridOrder = bot.manager.orders.get(fillOp.order_id) ||
|
|
215
|
+
Array.from(bot.manager.orders.values()).find((o) => o.orderId === fillOp.order_id);
|
|
216
|
+
if (!gridOrder) {
|
|
217
|
+
let orphanFillKey = buildFillKey(fill);
|
|
218
|
+
if (!orphanFillKey) {
|
|
219
|
+
orphanFillKey = bot._buildOrphanFillFallbackKey(fill);
|
|
220
|
+
}
|
|
221
|
+
if (orphanFillKey && !bot._isNewFillKey(orphanFillKey, processedFillKeys, '[POST-RESET]', fillOp.order_id)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
bot._log(`[POST-RESET] Processing funds for unknown order ${fillOp.order_id} (not in grid but crediting proceeds)`, 'warn');
|
|
225
|
+
const accountingResult = await bot._applyReplaySafeOrphanFillAccounting(fill, fillOp, {
|
|
226
|
+
context: 'POST-RESET',
|
|
227
|
+
logger: { log: bot._log.bind(bot) },
|
|
228
|
+
replayMessage: (op) => `[POST-RESET] Replay detected for orphan fill ${op.order_id}; skipping duplicate credit`
|
|
229
|
+
});
|
|
230
|
+
if (accountingResult.status === 'missing_key') {
|
|
231
|
+
requiresOpenOrdersSync = true;
|
|
232
|
+
}
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
bot._log(`[POST-RESET] Processing fill for ${gridOrder.type} order ${gridOrder.id} at price ${gridOrder.price}`);
|
|
236
|
+
const trackedFillKey = buildFillKey(fill);
|
|
237
|
+
if (trackedFillKey && !bot._isNewFillKey(trackedFillKey, processedFillKeys, '[POST-RESET]', fillOp.order_id)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
bot.manager.lockOrders([gridOrder.id]);
|
|
241
|
+
try {
|
|
242
|
+
const accountingResult = await bot._applyReplaySafeTrackedFillAccounting(fill, fillOp, {
|
|
243
|
+
context: 'POST-RESET',
|
|
244
|
+
logger: { log: bot._log.bind(bot) },
|
|
245
|
+
replayMessage: (op) => `[POST-RESET] Replay detected for ${op.order_id}; skipping duplicate rebalance`
|
|
246
|
+
});
|
|
247
|
+
if (accountingResult.status === 'missing_key') {
|
|
248
|
+
requiresOpenOrdersSync = true;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (accountingResult.status !== 'applied') {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const result = await bot._processFillsWithBatching([gridOrder], new Set(), `[POST-RESET] fill ${gridOrder.id}`);
|
|
255
|
+
if (result.aborted) {
|
|
256
|
+
bot._warn('[POST-RESET] Aborted batch due to illegal state; skipping grid persistence this cycle');
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
bot.manager.unlockOrders([gridOrder.id]);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (requiresOpenOrdersSync) {
|
|
265
|
+
bot._log('[POST-RESET] Falling back to open-orders sync for fill(s) missing replay-safe history identifiers', 'warn');
|
|
266
|
+
const postResetChainOpenOrders = await chainOrders.readOpenOrders(bot.accountId);
|
|
267
|
+
const syncResult = await bot.manager.syncFromOpenOrders(postResetChainOpenOrders);
|
|
268
|
+
if (syncResult.filledOrders?.length > 0) {
|
|
269
|
+
await bot._processFillsWithBatching(syncResult.filledOrders, new Set(), '[POST-RESET] open-orders fallback');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
await bot._flushProcessedFillPersistence('post-reset-batch');
|
|
273
|
+
bot.manager._recentFillKeysSnapshot = bot._getRecentFillKeysSnapshot();
|
|
274
|
+
await bot.manager.persistGrid();
|
|
275
|
+
}
|
|
276
|
+
const { aborted: postResetAborted, hasUnmatched: postResetUnmatched } = await bot._syncOpenOrdersAndProcessFills('[POST-RESET] pre-spread');
|
|
277
|
+
if (postResetUnmatched) {
|
|
278
|
+
bot._warn(`[POST-RESET] Skipping spread correction: ${postResetUnmatched} unmatched chain order(s) require maintenance reconciliation`);
|
|
279
|
+
}
|
|
280
|
+
await bot.manager.recalculateFunds();
|
|
281
|
+
if (!postResetAborted && !postResetUnmatched) {
|
|
282
|
+
const spreadResult = await bot.manager.checkSpreadCondition(BitShares, bot.updateOrdersOnChainPlan.bind(bot));
|
|
283
|
+
if (spreadResult && spreadResult.ordersPlaced > 0) {
|
|
284
|
+
bot._log(`✓ Spread correction after trigger reset: ${spreadResult.ordersPlaced} order(s) placed`);
|
|
285
|
+
await bot._persistAndRecoverIfNeeded();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (!bot._shuttingDown) {
|
|
289
|
+
try {
|
|
290
|
+
const postResetHealth = await bot.manager.checkGridHealth(bot.updateOrdersOnChainPlan.bind(bot));
|
|
291
|
+
await bot._cancelDustOrders({
|
|
292
|
+
buy: postResetHealth.buyDustOrders,
|
|
293
|
+
sell: postResetHealth.sellDustOrders,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
catch (_dustErr) {
|
|
297
|
+
bot._warn(`[POST-RESET] Dust cancel failed: ${_dustErr.message}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
bot._log('Bootstrap phase complete - fill processing resumed', 'info');
|
|
301
|
+
});
|
|
302
|
+
await bot._setupTriggerFileDetection();
|
|
303
|
+
await bot._setupCreditRuntime();
|
|
304
|
+
await bot._refreshAndSyncCreditRuntime();
|
|
305
|
+
bot._setupBlockchainFetchInterval();
|
|
306
|
+
bot._setupCreditWatchdogInterval();
|
|
307
|
+
bot._setupCredentialDaemonWatchdogInterval();
|
|
308
|
+
bot._setupDustHealthCheckInterval();
|
|
309
|
+
await bot._runDustHealthCheck();
|
|
310
|
+
bot._log('[DUST] Startup health check complete');
|
|
311
|
+
if (bot._isOpenOrdersSyncLoopEnabled()) {
|
|
312
|
+
bot._startOpenOrdersSyncLoop();
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
bot._log('Open-orders sync loop disabled by configuration');
|
|
316
|
+
}
|
|
317
|
+
bot._log(`DEXBot started. OrderManager running (dryRun=${!!bot.config.dryRun})`);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
bot.manager.resetFunds();
|
|
321
|
+
if (persistedBtsFeesOwed && persistedBtsFeesOwed > 0) {
|
|
322
|
+
bot.manager.funds.btsFeesOwed = Number(persistedBtsFeesOwed);
|
|
323
|
+
}
|
|
324
|
+
if (bot.config.assetA !== 'BTS' && bot.config.assetB !== 'BTS') {
|
|
325
|
+
if (persistedBtsBalance && typeof persistedBtsBalance === 'object') {
|
|
326
|
+
bot.manager.btsBalance = {
|
|
327
|
+
free: persistedBtsBalance.free || 0,
|
|
328
|
+
total: persistedBtsBalance.total || 0,
|
|
329
|
+
locked: persistedBtsBalance.locked || 0
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (persistedRecentFillKeys && typeof persistedRecentFillKeys === 'object') {
|
|
334
|
+
for (const [fillKey, timestamp] of Object.entries(persistedRecentFillKeys)) {
|
|
335
|
+
bot._recentlyQueuedFills.set(fillKey, Number(timestamp));
|
|
336
|
+
}
|
|
337
|
+
bot._log(`Restored ${Object.keys(persistedRecentFillKeys).length} recently queued fill key(s) from persisted snapshot`, 'debug');
|
|
338
|
+
}
|
|
339
|
+
if (!bot.config.dryRun && !bot.accountId) {
|
|
340
|
+
throw new Error('Cannot start bot without a resolved account ID');
|
|
341
|
+
}
|
|
342
|
+
const chainOpenOrders = bot.config.dryRun ? [] : await chainOrders.readOpenOrders(bot.accountId);
|
|
343
|
+
let shouldRegenerate = false;
|
|
344
|
+
if (!persistedGrid || persistedGrid.length === 0) {
|
|
345
|
+
shouldRegenerate = true;
|
|
346
|
+
bot._log('No persisted grid found. Generating new grid.');
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
await bot.manager._initializeAssets();
|
|
350
|
+
const decision = await decideStartupGridAction({
|
|
351
|
+
persistedGrid,
|
|
352
|
+
chainOpenOrders,
|
|
353
|
+
manager: bot.manager,
|
|
354
|
+
logger: { log: (msg) => bot._log(msg) },
|
|
355
|
+
storeGrid: async (orders) => {
|
|
356
|
+
await bot.manager.persistGrid(orders);
|
|
357
|
+
},
|
|
358
|
+
attemptResumeFn: attemptResumePersistedGridByPriceMatch,
|
|
359
|
+
});
|
|
360
|
+
shouldRegenerate = decision.shouldRegenerate;
|
|
361
|
+
if (shouldRegenerate && chainOpenOrders.length === 0) {
|
|
362
|
+
bot._log('Persisted grid found, but no matching active orders on-chain. Generating new grid.');
|
|
363
|
+
}
|
|
364
|
+
if (shouldRegenerate && chainOpenOrders.length > 0 && bot.manager?.assets) {
|
|
365
|
+
const orderCount = chainOpenOrders.filter(o => parseChainOrder(o, bot.manager.assets) !== null).length;
|
|
366
|
+
if (orderCount === 0) {
|
|
367
|
+
bot._log(`Persisted grid found with no matching orders (${chainOpenOrders.length} other-pair order(s) on account). Generating new grid.`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (!shouldRegenerate) {
|
|
372
|
+
if (persistedBtsFeesOwed > 0) {
|
|
373
|
+
bot.manager.funds.btsFeesOwed = persistedBtsFeesOwed;
|
|
374
|
+
bot._log(`✓ Restored BTS fees owed: ${Format.formatAmount8(persistedBtsFeesOwed)} BTS`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
bot._log(`ℹ Grid regenerating - resetting BTS fees to clean state`);
|
|
379
|
+
bot.manager.funds.btsFeesOwed = 0;
|
|
380
|
+
}
|
|
381
|
+
await bot.manager._fillProcessingLock.acquire(async () => {
|
|
382
|
+
try {
|
|
383
|
+
bot._refreshDynamicWeightDistribution('startup');
|
|
384
|
+
if (shouldRegenerate) {
|
|
385
|
+
await bot.manager._initializeAssets();
|
|
386
|
+
if (Array.isArray(chainOpenOrders) && chainOpenOrders.length > 0) {
|
|
387
|
+
bot._log('Generating new grid and syncing with existing on-chain orders...');
|
|
388
|
+
await Grid.initializeGrid(bot.manager);
|
|
389
|
+
await bot.manager.syncFromOpenOrders(chainOpenOrders, { skipAccounting: true });
|
|
390
|
+
const rebalanceResult = await reconcileGridOrders({
|
|
391
|
+
manager: bot.manager,
|
|
392
|
+
config: bot.config,
|
|
393
|
+
account: bot.account,
|
|
394
|
+
privateKey: bot.privateKey,
|
|
395
|
+
chainOrders,
|
|
396
|
+
chainOpenOrders,
|
|
397
|
+
});
|
|
398
|
+
await bot._executeBatchIfNeeded(rebalanceResult, 'startup reconcile (regenerated grid)');
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
bot._log('Generating new grid and placing initial orders on-chain...');
|
|
402
|
+
await bot.placeInitialOrders();
|
|
403
|
+
}
|
|
404
|
+
await bot._persistAndRecoverIfNeeded();
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
bot._log('Found active session. Loading and syncing existing grid.');
|
|
408
|
+
await Grid.loadGrid(bot.manager, persistedGrid, persistedBoundaryIdx);
|
|
409
|
+
let startupChainOpenOrders = chainOpenOrders;
|
|
410
|
+
const syncResult = await bot.manager.syncFromOpenOrders(startupChainOpenOrders, { skipAccounting: true });
|
|
411
|
+
if (syncResult.ordersNeedingCorrection?.length > 0) {
|
|
412
|
+
await correctAllPriceMismatches(bot.manager, bot.account, bot.privateKey, chainOrders);
|
|
413
|
+
}
|
|
414
|
+
if (syncResult.filledOrders && syncResult.filledOrders.length > 0) {
|
|
415
|
+
bot._log(`Startup sync: ${syncResult.filledOrders.length} grid order(s) found filled. Processing proceeds.`, 'info');
|
|
416
|
+
const batchResult = await bot._processFillsWithBatching(syncResult.filledOrders, new Set(), 'startup sync fill rebalance', { skipAccountTotalsUpdate: true });
|
|
417
|
+
if (!batchResult?.aborted) {
|
|
418
|
+
startupChainOpenOrders = await chainOrders.readOpenOrders(bot.accountId);
|
|
419
|
+
await bot.manager.synchronizeWithChain(startupChainOpenOrders, 'readOpenOrders');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const rebalanceResult = await reconcileGridOrders({
|
|
423
|
+
manager: bot.manager,
|
|
424
|
+
config: bot.config,
|
|
425
|
+
account: bot.account,
|
|
426
|
+
privateKey: bot.privateKey,
|
|
427
|
+
chainOrders,
|
|
428
|
+
chainOpenOrders: startupChainOpenOrders,
|
|
429
|
+
});
|
|
430
|
+
await bot._executeBatchIfNeeded(rebalanceResult, 'startup reconcile (loaded grid)');
|
|
431
|
+
await bot._persistAndRecoverIfNeeded();
|
|
432
|
+
await bot._rejectCorruptedGridSnapshot('startup');
|
|
433
|
+
}
|
|
434
|
+
if (bot._incomingFillQueue.length > 0) {
|
|
435
|
+
bot._log(`[STARTUP] Processing ${bot._incomingFillQueue.length} queued fill(s) before bootstrap ends`);
|
|
436
|
+
await bot._processFillsWithBootstrapMode(chainOrders);
|
|
437
|
+
}
|
|
438
|
+
bot.manager.finishBootstrap();
|
|
439
|
+
const FETCH_TIMEOUT_MS = 30000;
|
|
440
|
+
let _fetchTimeoutHandle;
|
|
441
|
+
try {
|
|
442
|
+
await Promise.race([
|
|
443
|
+
bot.manager.fetchAccountTotals(),
|
|
444
|
+
new Promise((_, reject) => {
|
|
445
|
+
_fetchTimeoutHandle = setTimeout(() => reject(new Error('timeout')), FETCH_TIMEOUT_MS);
|
|
446
|
+
})
|
|
447
|
+
]);
|
|
448
|
+
}
|
|
449
|
+
catch (fetchErr) {
|
|
450
|
+
bot._log(`[STARTUP] [${bot.config?.botKey || 'unknown'}] fetchAccountTotals ${fetchErr.message === 'timeout' ? 'timed out' : 'failed'} (${fetchErr.message}). Continuing with cached account totals.`, 'warn');
|
|
451
|
+
}
|
|
452
|
+
finally {
|
|
453
|
+
clearTimeout(_fetchTimeoutHandle);
|
|
454
|
+
}
|
|
455
|
+
await bot._runGridMaintenance('startup');
|
|
456
|
+
const startupHealth = await bot.manager.checkGridHealth(bot.updateOrdersOnChainPlan.bind(bot));
|
|
457
|
+
await bot._cancelDustOrders({
|
|
458
|
+
buy: startupHealth.buyDustOrders,
|
|
459
|
+
sell: startupHealth.sellDustOrders,
|
|
460
|
+
});
|
|
461
|
+
bot._log('Bootstrap phase complete - fill processing resumed', 'info');
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
bot.manager.finishBootstrap();
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
await bot._setupTriggerFileDetection();
|
|
468
|
+
await bot._setupCreditRuntime();
|
|
469
|
+
await bot._refreshAndSyncCreditRuntime();
|
|
470
|
+
await bot._runCreditRuntimeMaintenance('startup');
|
|
471
|
+
bot._setupBlockchainFetchInterval();
|
|
472
|
+
bot._setupCreditWatchdogInterval();
|
|
473
|
+
bot._setupCredentialDaemonWatchdogInterval();
|
|
474
|
+
bot._setupDustHealthCheckInterval();
|
|
475
|
+
await bot._runDustHealthCheck();
|
|
476
|
+
bot._log('[DUST] Startup health check complete');
|
|
477
|
+
if (bot._isOpenOrdersSyncLoopEnabled()) {
|
|
478
|
+
bot._startOpenOrdersSyncLoop();
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
bot._log('Open-orders sync loop disabled by configuration');
|
|
482
|
+
}
|
|
483
|
+
bot._log(`DEXBot started. OrderManager running (dryRun=${!!bot.config.dryRun})`);
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
bot._warn(`Error during grid initialization: ${err.message}`);
|
|
487
|
+
await bot.shutdown();
|
|
488
|
+
throw err;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Place initial orders on the blockchain (extracted logic from original placeInitialOrders).
|
|
493
|
+
* @param {import('./dexbot_class').DEXBot} bot
|
|
494
|
+
*/
|
|
495
|
+
async function placeInitialOrdersImpl(bot) {
|
|
496
|
+
if (!bot.manager) {
|
|
497
|
+
const mgrLogFile = bot.config?.name ? path.join(PATHS.LOGS_DIR, `${bot.config.name}.log`) : undefined;
|
|
498
|
+
bot.manager = new OrderManager({ ...bot.config, logFile: mgrLogFile });
|
|
499
|
+
bot.manager.accountOrders = bot.accountOrders;
|
|
500
|
+
}
|
|
501
|
+
bot._wireStructuralGridResyncRequest();
|
|
502
|
+
bot.manager.startBootstrap();
|
|
503
|
+
try {
|
|
504
|
+
try {
|
|
505
|
+
const botFunds = bot.config && bot.config.botFunds ? bot.config.botFunds : {};
|
|
506
|
+
const needsPercent = (v) => typeof v === 'string' && v.includes('%');
|
|
507
|
+
if ((needsPercent(botFunds.buy) || needsPercent(botFunds.sell)) && (bot.accountId || bot.account)) {
|
|
508
|
+
if (typeof bot.manager._fetchAccountBalancesAndSetTotals === 'function') {
|
|
509
|
+
await bot.manager._fetchAccountBalancesAndSetTotals();
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch (errFetch) {
|
|
514
|
+
bot._warn(`Could not fetch account totals before initializing grid: ${errFetch && errFetch.message ? errFetch.message : errFetch}`);
|
|
515
|
+
}
|
|
516
|
+
await Grid.initializeGrid(bot.manager);
|
|
517
|
+
if (bot.config.dryRun) {
|
|
518
|
+
bot.manager.logger.log('Dry run enabled, skipping on-chain order placement.', 'info');
|
|
519
|
+
await bot.manager.persistGrid();
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
bot.manager.logger.log('Placing initial orders on-chain...', 'info');
|
|
523
|
+
const ordersToActivate = bot.manager.getInitialOrdersToActivate();
|
|
524
|
+
const orderGroups = bot._buildOutsideInPairGroupsForOrders(ordersToActivate);
|
|
525
|
+
for (const group of orderGroups) {
|
|
526
|
+
await bot.updateOrdersOnChainPlan({ ordersToPlace: group });
|
|
527
|
+
}
|
|
528
|
+
await bot.manager.persistGrid();
|
|
529
|
+
}
|
|
530
|
+
finally {
|
|
531
|
+
bot.manager.finishBootstrap();
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
module.exports = {
|
|
535
|
+
initializeStartupState,
|
|
536
|
+
finishStartupSequence,
|
|
537
|
+
placeInitialOrdersImpl,
|
|
538
|
+
};
|
|
539
|
+
//# sourceMappingURL=dexbot_startup_runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dexbot_startup_runtime.js","sourceRoot":"","sources":["../../modules/dexbot_startup_runtime.ts"],"names":[],"mappings":"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"}
|