dexbot 1.1.12 → 1.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/credential-daemon.d.ts.map +1 -1
- package/dist/credential-daemon.js +13 -4
- package/dist/credential-daemon.js.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.js +6 -0
- package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
- package/dist/market_adapter/market_adapter.d.ts.map +1 -1
- package/dist/market_adapter/market_adapter.js +6 -3
- package/dist/market_adapter/market_adapter.js.map +1 -1
- package/dist/modules/chain_orders.d.ts +5 -1
- package/dist/modules/chain_orders.d.ts.map +1 -1
- package/dist/modules/chain_orders.js +8 -4
- package/dist/modules/chain_orders.js.map +1 -1
- package/dist/modules/constants.d.ts +5 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +28 -12
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +38 -0
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +449 -91
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_credential_client.d.ts +3 -0
- package/dist/modules/dexbot_credential_client.d.ts.map +1 -1
- package/dist/modules/dexbot_credential_client.js +78 -43
- package/dist/modules/dexbot_credential_client.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +100 -4
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/key_store.d.ts +2 -2
- package/dist/modules/key_store.d.ts.map +1 -1
- package/dist/modules/key_store.js +6 -1
- package/dist/modules/key_store.js.map +1 -1
- package/dist/modules/node_manager.d.ts +9 -0
- package/dist/modules/node_manager.d.ts.map +1 -1
- package/dist/modules/node_manager.js +35 -17
- package/dist/modules/node_manager.js.map +1 -1
- package/dist/modules/order/accounting.d.ts.map +1 -1
- package/dist/modules/order/accounting.js +36 -5
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/async_lock.d.ts +21 -0
- package/dist/modules/order/async_lock.d.ts.map +1 -1
- package/dist/modules/order/async_lock.js +43 -3
- package/dist/modules/order/async_lock.js.map +1 -1
- package/dist/modules/order/grid.d.ts +26 -0
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +53 -0
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile.js +6 -3
- package/dist/modules/order/grid_reconcile.js.map +1 -1
- package/dist/modules/order/manager.d.ts +1 -3
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +15 -30
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts +9 -2
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +79 -5
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +17 -1
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +1 -0
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +90 -38
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/paths.d.ts +1 -0
- package/dist/modules/paths.d.ts.map +1 -1
- package/dist/modules/paths.js +1 -0
- package/dist/modules/paths.js.map +1 -1
- package/package.json +14 -4
|
@@ -15,6 +15,9 @@ interface CredentialClientOptions {
|
|
|
15
15
|
sessionId?: string | null;
|
|
16
16
|
botHmacSecret?: string | null;
|
|
17
17
|
batchId?: string | null;
|
|
18
|
+
nodeUrl?: string;
|
|
19
|
+
fallbackNodes?: string[];
|
|
20
|
+
onNodeFailed?: (nodeUrl: string) => void;
|
|
18
21
|
}
|
|
19
22
|
interface CredentialDaemonMeta {
|
|
20
23
|
uncertainOnTimeout?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dexbot_credential_client.d.ts","sourceRoot":"","sources":["../../modules/dexbot_credential_client.ts"],"names":[],"mappings":"AAmBA,UAAU,8BAA8B;IACpC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,uBAAuB;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"dexbot_credential_client.d.ts","sourceRoot":"","sources":["../../modules/dexbot_credential_client.ts"],"names":[],"mappings":"AAmBA,UAAU,8BAA8B;IACpC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,uBAAuB;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,UAAU,oBAAoB;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,UAAU,wBAAwB;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC;CAC7B;AAkBD;;;;;;;;;;;;;;GAcG;AACH,cAAM,uBAAwB,SAAQ,KAAK;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,8BAAmC;CAU5E;AAMD,iBAAS,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAmE5J;AAMD,iBAAS,uBAAuB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAW/E;AAED,iBAAe,uBAAuB,CAAC,SAAS,GAAE,MAAgC,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxI;AAMD,iBAAe,oCAAoC,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgGpK;;;;;;;;;;;AAED,kBASE"}
|
|
@@ -150,12 +150,20 @@ async function waitForCredentialDaemon(timeoutMs = DEFAULT_WAIT_TIMEOUT_MS, opti
|
|
|
150
150
|
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
|
-
function
|
|
153
|
+
function extractHostname(url) {
|
|
154
|
+
try {
|
|
155
|
+
return new URL(url).hostname;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return url;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function executeOperationsViaCredentialDaemon(accountName, operations, options = {}) {
|
|
154
162
|
if (!accountName) {
|
|
155
|
-
|
|
163
|
+
throw new Error('accountName is required to execute operations');
|
|
156
164
|
}
|
|
157
165
|
if (!Array.isArray(operations)) {
|
|
158
|
-
|
|
166
|
+
throw new Error('operations must be an array');
|
|
159
167
|
}
|
|
160
168
|
const socketPath = getSocketPath(options);
|
|
161
169
|
// Broadcast requests have their own (longer) outer timeout. Non-broadcast
|
|
@@ -165,51 +173,78 @@ function executeOperationsViaCredentialDaemon(accountName, operations, options =
|
|
|
165
173
|
const timeoutMs = Number.isFinite(Number(options.timeoutMs))
|
|
166
174
|
? Number(options.timeoutMs)
|
|
167
175
|
: defaultTimeout;
|
|
168
|
-
const
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (response.success) {
|
|
188
|
-
return response;
|
|
176
|
+
const fallbackNodes = Array.isArray(options.fallbackNodes) ? options.fallbackNodes : [];
|
|
177
|
+
const maxAttempts = 1 + fallbackNodes.length;
|
|
178
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
179
|
+
// attempt 0 uses options.nodeUrl (typically undefined, meaning the daemon's
|
|
180
|
+
// default node list); subsequent attempts cycle through fallbackNodes[].
|
|
181
|
+
// onNodeFailed is only invoked when nodeUrl is truthy, so the primary
|
|
182
|
+
// node is never reported through this callback — only the named fallbacks.
|
|
183
|
+
const nodeUrl = attempt === 0 ? (options.nodeUrl || undefined) : fallbackNodes[attempt - 1];
|
|
184
|
+
const payload = { type: 'execute-operations', accountName, operations };
|
|
185
|
+
const sessionId = options.sessionId || null;
|
|
186
|
+
if (sessionId)
|
|
187
|
+
payload.sessionId = sessionId;
|
|
188
|
+
if (nodeUrl)
|
|
189
|
+
payload.nodeUrl = nodeUrl;
|
|
190
|
+
const botHmacSecret = options.botHmacSecret || null;
|
|
191
|
+
if (botHmacSecret && sessionId) {
|
|
192
|
+
payload.hmac = createHmac('sha256', Buffer.from(botHmacSecret, 'hex'))
|
|
193
|
+
.update(JSON.stringify({ sessionId, operations }))
|
|
194
|
+
.digest('hex');
|
|
189
195
|
}
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// state is uncertain. Convert this typed failure back to a
|
|
194
|
-
// BroadcastUncertainError so the recovery path picks it up. Only
|
|
195
|
-
// relevant for broadcast requests — non-broadcast callers don't carry
|
|
196
|
-
// the uncertainOnTimeout flag.
|
|
197
|
-
if (isBroadcast &&
|
|
198
|
-
(errCode === DAEMON_CODES.BROADCAST_DEADLINE ||
|
|
199
|
-
(typeof errMsg === 'string' && errMsg.startsWith(DAEMON_CODES.BROADCAST_DEADLINE)))) {
|
|
200
|
-
throw new BroadcastUncertainError(`Credential daemon broadcast uncertain: ${errCode || errMsg}`, {
|
|
196
|
+
const meta = isBroadcast
|
|
197
|
+
? {
|
|
198
|
+
uncertainOnTimeout: true,
|
|
201
199
|
operations,
|
|
202
200
|
accountName,
|
|
203
201
|
batchId: options.batchId || null,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
202
|
+
}
|
|
203
|
+
: {};
|
|
204
|
+
try {
|
|
205
|
+
const response = await sendCredentialDaemonRequest(socketPath, payload, timeoutMs, meta);
|
|
206
|
+
if (response.success) {
|
|
207
|
+
return response;
|
|
208
|
+
}
|
|
209
|
+
const errMsg = response.error || 'Unknown credential daemon error';
|
|
210
|
+
const errCode = response.code || null;
|
|
211
|
+
// The daemon hit its inner deadline (BROADCAST_DEADLINE) and the chain
|
|
212
|
+
// state is uncertain. Convert this typed failure back to a
|
|
213
|
+
// BroadcastUncertainError so the recovery path picks it up. Only
|
|
214
|
+
// relevant for broadcast requests — non-broadcast callers don't carry
|
|
215
|
+
// the uncertainOnTimeout flag.
|
|
216
|
+
if (isBroadcast &&
|
|
217
|
+
(errCode === DAEMON_CODES.BROADCAST_DEADLINE ||
|
|
218
|
+
(typeof errMsg === 'string' && errMsg.startsWith(DAEMON_CODES.BROADCAST_DEADLINE)))) {
|
|
219
|
+
throw new BroadcastUncertainError(`Credential daemon broadcast uncertain: ${errCode || errMsg}`, {
|
|
220
|
+
operations,
|
|
221
|
+
accountName,
|
|
222
|
+
batchId: options.batchId || null,
|
|
223
|
+
payload,
|
|
224
|
+
timeoutMs,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Typed failure reply from the daemon (e.g. policy denied, bad op) —
|
|
228
|
+
// the chain state is known (chain NOT touched), so a plain Error is
|
|
229
|
+
// fine.
|
|
230
|
+
throw new Error(errMsg);
|
|
207
231
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
232
|
+
catch (err) {
|
|
233
|
+
if (err instanceof BroadcastUncertainError) {
|
|
234
|
+
if (typeof options.onNodeFailed === 'function' && nodeUrl) {
|
|
235
|
+
options.onNodeFailed(nodeUrl);
|
|
236
|
+
}
|
|
237
|
+
if (attempt < maxAttempts - 1) {
|
|
238
|
+
const label = extractHostname(nodeUrl || '') || 'primary';
|
|
239
|
+
const nextHost = extractHostname(fallbackNodes[attempt]);
|
|
240
|
+
console.warn(`[cred-daemon-client] BROADCAST_DEADLINE on ${label}, retrying fallback ${nextHost}...`);
|
|
241
|
+
await new Promise((resolve) => setTimeout(resolve, TIMING.BLOCKCHAIN_SETTLE_DELAY_MS));
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
throw err;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
213
248
|
}
|
|
214
249
|
module.exports = {
|
|
215
250
|
DEFAULT_READY_FILE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dexbot_credential_client.js","sourceRoot":"","sources":["../../modules/dexbot_credential_client.ts"],"names":[],"mappings":";AAAA,kFAAkF;AAClF,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAClC,IAAI,GAAG,CAAC;AACR,IAAI,CAAC;IACD,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAAC,MAAM,CAAC;IACL,uEAAuE;AAC3E,CAAC;AACD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAChD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACxD,MAAM,EACF,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,GACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dexbot_credential_client.js","sourceRoot":"","sources":["../../modules/dexbot_credential_client.ts"],"names":[],"mappings":";AAAA,kFAAkF;AAClF,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAClC,IAAI,GAAG,CAAC;AACR,IAAI,CAAC;IACD,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAAC,MAAM,CAAC;IACL,uEAAuE;AAC3E,CAAC;AACD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAChD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACxD,MAAM,EACF,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,GACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAiDpC,MAAM,mBAAmB,GAAG,uBAAuB,EAAE,CAAC;AACtD,MAAM,kBAAkB,GAAG,0BAA0B,EAAE,CAAC;AACxD,MAAM,0BAA0B,GAAG,IAAI,CAAC;AACxC,MAAM,4BAA4B,GAAG,MAAM,CAAC,+BAA+B,CAAC;AAC5E,MAAM,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACjE,MAAM,wBAAwB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,uBAAwB,SAAQ,KAAK;IACvC,IAAI,CAAS;IACb,UAAU,CAAe;IACzB,WAAW,CAAgB;IAC3B,OAAO,CAAgB;IACvB,OAAO,CAAM;IACb,SAAS,CAAgB;IAEzB,YAAY,OAAe,EAAE,UAA0C,EAAE;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC/C,CAAC;CACJ;AAED,SAAS,aAAa,CAAC,UAAmC,EAAE;IACxD,OAAO,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;AACrD,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAkB,EAAE,OAAY,EAAE,SAAiB,EAAE,OAA6B,EAAE;IACrH,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,CAAC;gBACf,iEAAiE;gBACjE,+DAA+D;gBAC/D,+DAA+D;gBAC/D,yCAAyC;gBACzC,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,uBAAuB,CAC9B,uDAAuD,SAAS,IAAI,EACpE;wBACI,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;wBACnC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;wBACrC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;wBAC7B,OAAO;wBACP,SAAS;qBACZ,CACJ,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,SAAS,IAAI,CAAC,CAAC,CAAC;gBAClF,CAAC;YACL,CAAC;QACL,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,cAAc,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,cAAc,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,GAAG,IAAI,CAAC;oBACf,IAAI,CAAC;wBACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC9B,CAAC;oBAAC,MAAM,CAAC;wBACL,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;oBAC5D,CAAC;gBACL,CAAC;gBACD,OAAO;YACX,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;QACjH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC9E,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAmC,EAAE;IAC3D,OAAO,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAmC,EAAE;IAClE,IAAI,CAAC;QACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;YAC1B,mBAAmB,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;YACjF,mBAAmB,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,YAAoB,uBAAuB,EAAE,UAAmC,EAAE;IACrH,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAClE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QAChC,CAAC,CAAC,wBAAwB,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yDAAyD,SAAS,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IACxE,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAChC,IAAI,CAAC;QAAC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,CAAC;IAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,oCAAoC,CAAC,WAAmB,EAAE,UAAiB,EAAE,UAAmC,EAAE;IAC7H,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC;IACxF,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,0BAA0B,CAAC;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3B,CAAC,CAAC,cAAc,CAAC;IAErB,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;IAE7C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,4EAA4E;QAC5E,yEAAyE;QACzE,sEAAsE;QACtE,2EAA2E;QAC3E,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAE5F,MAAM,OAAO,GAAmB,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QACxF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACpD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;iBACjE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;iBACjD,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,GAAG,WAAW;YACpB,CAAC,CAAC;gBACE,kBAAkB,EAAE,IAAI;gBACxB,UAAU;gBACV,WAAW;gBACX,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;aACnC;YACD,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACzF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,QAAQ,CAAC;YACpB,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAI,iCAAiC,CAAC;YACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;YACtC,uEAAuE;YACvE,2DAA2D;YAC3D,iEAAiE;YACjE,sEAAsE;YACtE,+BAA+B;YAC/B,IACI,WAAW;gBACX,CAAC,OAAO,KAAK,YAAY,CAAC,kBAAkB;oBACxC,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,EACzF,CAAC;gBACC,MAAM,IAAI,uBAAuB,CAC7B,0CAA0C,OAAO,IAAI,MAAM,EAAE,EAC7D;oBACI,UAAU;oBACV,WAAW;oBACX,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;oBAChC,OAAO;oBACP,SAAS;iBACZ,CACJ,CAAC;YACN,CAAC;YACD,qEAAqE;YACrE,oEAAoE;YACpE,QAAQ;YACR,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;gBACzC,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,IAAI,OAAO,EAAE,CAAC;oBACxD,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC;oBAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,8CAA8C,KAAK,uBAAuB,QAAQ,KAAK,CAAC,CAAC;oBACtG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBACvF,SAAS;gBACb,CAAC;YACL,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;AACL,CAAC;AAED,iBAAS;IACL,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,2BAA2B;IAC3B,oCAAoC;IACpC,uBAAuB;IACvB,uBAAuB;IACvB,uBAAuB;CAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dexbot_maintenance_runtime.d.ts","sourceRoot":"","sources":["../../modules/dexbot_maintenance_runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dexbot_maintenance_runtime.d.ts","sourceRoot":"","sources":["../../modules/dexbot_maintenance_runtime.ts"],"names":[],"mappings":"AAyEA;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,GAAG,KAAA,WAG5B;AAED;;;;;;GAMG;AACH,iBAAS,+BAA+B,CAAC,QAAQ,KAAA,EAAE,MAAM,KAAA,OAaxD;AAED;;;;;GAKG;AACH,iBAAS,+BAA+B,CAAC,QAAQ,KAAA,EAAE,MAAM,KAAA,WAMxD;AA8HD;;;GAGG;AACH,iBAAS,sBAAsB;;;;;;;;;;;;EAgC9B;AAuGD;;;GAGG;AACH,iBAAe,oBAAoB,kBAElC;AAED;;;;;;GAMG;AACH,iBAAe,sCAAsC,CAAC,GAAG,KAAA,EAAE,OAAO,SAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4I9E;AAED;;;;;;GAMG;AACH,iBAAS,gCAAgC,CAAC,GAAG,KAAA,EAAE,OAAO,SAAY;;;;;;;;;;EA+DjE;AAyHD;;;;;;;GAOG;AACH,iBAAS,0BAA0B,CAAC,MAAM,KAAA,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,OA0BnG;AAED;;;;;;GAMG;AACH,iBAAS,iBAAiB,CAAC,GAAG,KAAA,EAAE,OAAO,GAAE;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACnB,oBAsGL;AAED;;;;;GAKG;AACH,iBAAe,yBAAyB,CAAC,GAAG,KAAA,oBAkB3C;AAED;;;;;GAKG;AACH,iBAAe,yBAAyB,CAAC,GAAG,KAAA,iBAkD3C;AAED;;;;;GAKG;AACH,iBAAe,yBAAyB,CAAC,GAAG,KAAA,iBAM3C;AAED;;;;GAIG;AACH,iBAAS,2BAA2B,CAAC,GAAG,KAAA,WAKvC;AAED;;;;GAIG;AACH,iBAAS,uBAAuB,CAAC,GAAG,KAAA,QA0DnC;AAED;;;;GAIG;AACH,iBAAe,sBAAsB,CAAC,GAAG,KAAA,iBAKxC;AAED;;;;GAIG;AACH,iBAAS,4BAA4B,CAAC,GAAG,KAAA,QAsHxC;AAED;;;GAGG;AACH,iBAAS,2BAA2B,CAAC,GAAG,KAAA,QAMvC;AAED;;;;;;;GAOG;AACH,iBAAe,2BAA2B,CAAC,GAAG,KAAA,EAAE,KAAK,KAAA,EAAE,OAAO,SAAa,gBAiB1E;AAID;;;;;GAKG;AACH,iBAAS,wBAAwB,CAAC,OAAO,KAAA,EAAE,OAAO,KAAA,WAYjD;AAyGD;;;;;;;GAOG;AACH,iBAAe,uBAAuB,CAAC,GAAG,KAAA,EAAE,OAAO,KAAA,iBAuMlD;AA2CD;;;;;;;;;;;GAWG;AACH,iBAAe,gBAAgB,CAAC,GAAG,KAAA,EAAE,EAAE,GAAG,EAAE,OAAY,EAAE,IAAI,EAAE,QAAa,EAAE,mBAA2B,EAAE;;;;CAAK;;;;;GAyChH;AAED;;;;;;;;;GASG;AACH,iBAAe,kBAAkB,CAC7B,GAAG,KAAA,EACH,OAAO,SAAa,EACpB,OAAO,GAAE;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,iBAkDtE;AAID;;;;;;GAMG;AACH,iBAAe,yBAAyB,CAAC,GAAG,KAAA,iBAoD3C;AAED;;;;;;GAMG;AACH,iBAAe,UAAU,CAAC,GAAG,KAAA,EAAE,OAAO,KAAA,iBAmFrC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,kBAyBE"}
|
|
@@ -4,8 +4,9 @@ const { createHash } = require('./crypto/sync');
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const { path } = require('./path_api');
|
|
6
6
|
const { spawn } = require('child_process');
|
|
7
|
-
const { BitShares } = require('./bitshares_client');
|
|
7
|
+
const { BitShares, getNodeManager } = require('./bitshares_client');
|
|
8
8
|
const chainOrders = require('./chain_orders');
|
|
9
|
+
const { BroadcastUncertainError } = require('./dexbot_credential_client');
|
|
9
10
|
const { Config, hasOpenOrdersSyncLoopMsSet, getOpenOrdersSyncLoopMs } = require('./config');
|
|
10
11
|
const Grid = require('./order/grid');
|
|
11
12
|
const { ORDER_STATES, ORDER_TYPES, TIMING, BTS_PRECISION, NATIVE_CLIENT } = require('./constants');
|
|
@@ -20,7 +21,7 @@ const { parseJsonWithComments } = require('./order/utils/system');
|
|
|
20
21
|
const { cloneWeightDistribution, calculateOrderCreationFees, calculateSwapInAmount, floatToBlockchainInt, blockchainToFloat } = require('./order/utils/math');
|
|
21
22
|
const { updateDynamicGridSnapshotSync } = require('../market_adapter/utils/dynamic_grid_snapshot');
|
|
22
23
|
const { reconcileGridOrders } = require('./order/grid_reconcile');
|
|
23
|
-
const { formatUnmatchedChainOrder, getSideBudget, correctAllPriceMismatches } = require('./order/utils/order');
|
|
24
|
+
const { formatUnmatchedChainOrder, getSideBudget, correctAllPriceMismatches, isOrderOnChain } = require('./order/utils/order');
|
|
24
25
|
const { getStorage } = require('./storage');
|
|
25
26
|
const storage = getStorage();
|
|
26
27
|
const { ensureDir, safeUnlink } = require('./utils/fs_utils');
|
|
@@ -1253,6 +1254,63 @@ async function executeMaintenanceLogic(bot, context) {
|
|
|
1253
1254
|
bot._log(`[MAINT-COOLDOWN] Skipping ${context} maintenance after hard-abort recovery sync (remaining=${bot._maintenanceCooldownCycles})`, 'warn');
|
|
1254
1255
|
return;
|
|
1255
1256
|
}
|
|
1257
|
+
// Grid bloat re-check: if a previous Grid.loadGrid detected bloat and set
|
|
1258
|
+
// _gridBloatDetectedAt, verify the grid is still oversized after a grace
|
|
1259
|
+
// period. If it hasn't resolved and no structural resync is in flight,
|
|
1260
|
+
// trigger one. This catches bloat that occurred during startup (before
|
|
1261
|
+
// requestStructuralGridResync was wired) or bloat that survived a prior
|
|
1262
|
+
// resync attempt.
|
|
1263
|
+
if (bot.manager._gridBloatDetectedAt && typeof bot.manager.requestStructuralGridResync === 'function') {
|
|
1264
|
+
const graceMs = TIMING.GRID_BLOAT_RESYNC_GRACE_MS || 300000;
|
|
1265
|
+
if (Date.now() - bot.manager._gridBloatDetectedAt >= graceMs) {
|
|
1266
|
+
const bloatResult = Grid.isGridBloated(bot.manager, bot.manager.orders);
|
|
1267
|
+
if (bloatResult.bloated) {
|
|
1268
|
+
const d = bloatResult.details;
|
|
1269
|
+
bot._log(`[GRID-BLOAT] Grid size ${d.gridSize} still exceeds expected maximum ${d.maxAllowed} ` +
|
|
1270
|
+
`after grace period. Triggering structural resync.`, 'warn');
|
|
1271
|
+
bot.manager.requestStructuralGridResync('grid-bloat-persistent', { reason: `Grid size ${d.gridSize} still exceeds max ${d.maxAllowed} after grace` }).catch((err) => {
|
|
1272
|
+
bot.manager?.logger?.log?.(`[GRID-BLOAT] Structural resync request failed: ${err.message}`, 'error');
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
else {
|
|
1276
|
+
delete bot.manager._gridBloatDetectedAt;
|
|
1277
|
+
bot._log('[GRID-BLOAT] Grid size returned to normal. Clearing bloat flag.', 'info');
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
// Gap 4: Periodic lightweight consistency check. Fetches open order count
|
|
1282
|
+
// from chain and compares to grid active order count. Triggers a targeted
|
|
1283
|
+
// sync when significant divergence is detected. Runs at most once per
|
|
1284
|
+
// LIGHTWEIGHT_SYNC_CHECK_INTERVAL_MS to limit blockchain query load.
|
|
1285
|
+
// Skip if the COW pipeline has active CREATEs in flight to avoid racing
|
|
1286
|
+
// with batch broadcasts — transient mismatches are expected during a COW cycle.
|
|
1287
|
+
if (!bot._batchInFlight &&
|
|
1288
|
+
!(bot.manager?._pendingBroadcasts?.size > 0) &&
|
|
1289
|
+
(bot._lightweightSyncCheckAt == null || Date.now() - bot._lightweightSyncCheckAt >= TIMING.LIGHTWEIGHT_SYNC_CHECK_INTERVAL_MS)) {
|
|
1290
|
+
bot._lightweightSyncCheckAt = Date.now();
|
|
1291
|
+
try {
|
|
1292
|
+
const chainOpenOrdersResult = await chainOrders.readOpenOrders(bot.accountId);
|
|
1293
|
+
const chainOrdersCount = chainOpenOrdersResult.length;
|
|
1294
|
+
const gridActive = Array.from(bot.manager.orders.values()).filter((o) => isOrderOnChain(o)).length;
|
|
1295
|
+
const diff = Math.abs(chainOrdersCount - gridActive);
|
|
1296
|
+
if (diff > 2) {
|
|
1297
|
+
bot._log(`[LIGHTWEIGHT-SYNC] Order count mismatch: chain=${chainOrdersCount}, grid=${gridActive} ` +
|
|
1298
|
+
`(diff=${diff}). Triggering targeted sync to reconcile.`, 'warn');
|
|
1299
|
+
if (bot.manager?.synchronizeWithChain) {
|
|
1300
|
+
await bot.manager.synchronizeWithChain(chainOpenOrdersResult, 'readOpenOrders', {
|
|
1301
|
+
fillLockAlreadyHeld: true
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
else if (diff > 0) {
|
|
1306
|
+
bot._log(`[LIGHTWEIGHT-SYNC] Order count mismatch: chain=${chainOrdersCount}, grid=${gridActive} ` +
|
|
1307
|
+
`(diff=${diff}). Minor divergence — expected during normal operation.`, 'debug');
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
catch (e) {
|
|
1311
|
+
bot._log(`[LIGHTWEIGHT-SYNC] Check failed: ${e.message}`, 'debug');
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1256
1314
|
// Process any price corrections queued by prior sync operations before
|
|
1257
1315
|
// the pipeline gate. Pending corrections block isPipelineEmpty, and no
|
|
1258
1316
|
// other code path clears them outside of _consumeFillQueue (which only
|
|
@@ -1339,6 +1397,44 @@ async function executeMaintenanceLogic(bot, context) {
|
|
|
1339
1397
|
}
|
|
1340
1398
|
}
|
|
1341
1399
|
}
|
|
1400
|
+
/**
|
|
1401
|
+
* Cancel a single order, retrying on alternate BitShares nodes when the
|
|
1402
|
+
* credential daemon reports BROADCAST_DEADLINE. The daemon already retries
|
|
1403
|
+
* 3× internally against its own node list; if it still hits the deadline
|
|
1404
|
+
* the node itself may be unhealthy. We hand the full healthy-node list
|
|
1405
|
+
* (excluding the primary) to the credential client, which cycles through
|
|
1406
|
+
* the fallbacks with a 1 s gap and raises the last BroadcastUncertainError
|
|
1407
|
+
* only when all nodes are exhausted.
|
|
1408
|
+
*
|
|
1409
|
+
* The daemon's session is validated early in processRequest (before the
|
|
1410
|
+
* broadcast), so a BROADCAST_DEADLINE reply cannot be caused by an expired
|
|
1411
|
+
* session — re-using the original signing token is correct.
|
|
1412
|
+
*
|
|
1413
|
+
* @param {import('./dexbot_class').DEXBot} bot
|
|
1414
|
+
* @param {import('./types').Order} order
|
|
1415
|
+
* @returns {Promise<*>} Result from chainOrders.cancelOrder
|
|
1416
|
+
*/
|
|
1417
|
+
async function cancelOrderWithNodeFallback(bot, order) {
|
|
1418
|
+
try {
|
|
1419
|
+
const nodeManager = getNodeManager();
|
|
1420
|
+
const nodes = nodeManager.getHealthyNodes();
|
|
1421
|
+
const fallbackNodes = nodes.length > 1 ? nodes.slice(1) : undefined;
|
|
1422
|
+
return await chainOrders.cancelOrder(bot.account, bot.privateKey, order.orderId, fallbackNodes
|
|
1423
|
+
? {
|
|
1424
|
+
fallbackNodes,
|
|
1425
|
+
onNodeFailed: (nodeUrl) => {
|
|
1426
|
+
nodeManager.reportNodeFailure(nodeUrl, 'BROADCAST_DEADLINE', 'broadcast');
|
|
1427
|
+
},
|
|
1428
|
+
}
|
|
1429
|
+
: {});
|
|
1430
|
+
}
|
|
1431
|
+
catch (err) {
|
|
1432
|
+
if (err instanceof BroadcastUncertainError) {
|
|
1433
|
+
bot._warn(`[DUST] All nodes exhausted for ${order.id} (${order.orderId})`);
|
|
1434
|
+
}
|
|
1435
|
+
throw err;
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1342
1438
|
/**
|
|
1343
1439
|
* Cancel dust orders immediately — no delay, no timer, no maps.
|
|
1344
1440
|
* Each dust order is cancelled on chain and its slot is rotated through
|
|
@@ -1360,12 +1456,12 @@ async function cancelDustOrders(bot, { buy: buyDust = [], sell: sellDust = [], f
|
|
|
1360
1456
|
if (!order.orderId)
|
|
1361
1457
|
continue;
|
|
1362
1458
|
try {
|
|
1363
|
-
const cancelResult = await
|
|
1459
|
+
const cancelResult = await cancelOrderWithNodeFallback(bot, order);
|
|
1364
1460
|
try {
|
|
1365
1461
|
if (cancelResult?.verifiedAfterFailure) {
|
|
1366
1462
|
const accountRef = bot.accountId || bot.account;
|
|
1367
1463
|
const chainOpenOrders = await chainOrders.readOpenOrders(accountRef);
|
|
1368
|
-
await bot.manager.synchronizeWithChain(chainOpenOrders, 'readOpenOrders', { fillLockAlreadyHeld: true });
|
|
1464
|
+
await bot.manager.synchronizeWithChain(chainOpenOrders, 'readOpenOrders', { fillLockAlreadyHeld: true, protectCommittedOrders: true });
|
|
1369
1465
|
}
|
|
1370
1466
|
else {
|
|
1371
1467
|
await bot.manager.synchronizeWithChain({ orderId: order.orderId, clearSize: true }, 'cancelOrder', { fillLockAlreadyHeld });
|