@xyo-network/xl1-cli-lib 1.8.4 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/index.mjs +402 -423
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/orchestration/initServices.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/chain/index.d.ts.map +1 -1
- package/dist/node/orchestration/status/RuntimeStatusMonitor.d.ts +3 -3
- package/dist/node/orchestration/status/RuntimeStatusMonitor.d.ts.map +1 -1
- package/dist/node/orchestration/status/ServiceStatus.d.ts +1 -1
- package/dist/node/orchestration/status/ServiceStatus.d.ts.map +1 -1
- package/dist/node/xl1.mjs +400 -418
- package/dist/node/xl1.mjs.map +1 -1
- package/package.json +50 -48
- package/src/orchestration/initServices.ts +10 -9
- package/src/orchestration/services/implementation/chain/index.ts +4 -3
- package/src/orchestration/status/RuntimeStatusMonitor.ts +3 -3
- package/src/orchestration/status/ServiceStatus.ts +1 -1
package/dist/node/index.mjs
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
3
11
|
|
|
4
12
|
// src/orchestration/actor/implementation/BalanceActor.ts
|
|
5
13
|
import { assertEx } from "@xylabs/assert";
|
|
@@ -12,19 +20,13 @@ import { forget } from "@xylabs/forget";
|
|
|
12
20
|
import { IdLogger } from "@xylabs/logger";
|
|
13
21
|
import { span, spanAsync } from "@xylabs/telemetry";
|
|
14
22
|
var Actor = class extends Base {
|
|
15
|
-
static {
|
|
16
|
-
__name(this, "Actor");
|
|
17
|
-
}
|
|
18
23
|
_timers = /* @__PURE__ */ new Map();
|
|
19
24
|
_active = false;
|
|
20
25
|
_displayName;
|
|
21
26
|
_id;
|
|
22
27
|
constructor(id, displayName = "Actor", params) {
|
|
23
28
|
const logger = params.logger ?? new IdLogger(Base.defaultLogger ?? console, () => `[${displayName} (${id})] `);
|
|
24
|
-
super({
|
|
25
|
-
...params,
|
|
26
|
-
logger
|
|
27
|
-
});
|
|
29
|
+
super({ ...params, logger });
|
|
28
30
|
this._displayName = displayName;
|
|
29
31
|
this._id = id;
|
|
30
32
|
}
|
|
@@ -41,29 +43,29 @@ var Actor = class extends Base {
|
|
|
41
43
|
return `[${this.displayName} (${this.id})] `;
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
* The timer runs until the actor is deactivated (or you manually stop it).
|
|
47
|
+
*/
|
|
46
48
|
registerTimer(timerName, callback, dueTimeMs, periodMs) {
|
|
47
49
|
if (!this._active) {
|
|
48
|
-
this.logger?.warn(
|
|
50
|
+
this.logger?.warn(
|
|
51
|
+
`Cannot register timer '${timerName}' because actor is not active.`
|
|
52
|
+
);
|
|
49
53
|
return;
|
|
50
54
|
}
|
|
51
|
-
const schedulePeriodicRun =
|
|
55
|
+
const schedulePeriodicRun = async () => {
|
|
52
56
|
if (!this._active || !this._timers.has(timerName)) return;
|
|
53
57
|
try {
|
|
54
58
|
await callback();
|
|
55
59
|
} catch (error) {
|
|
56
60
|
this.logger?.error(`Error in timer '${this.name}:${timerName}': ${error}`);
|
|
57
61
|
} finally {
|
|
58
|
-
this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), {
|
|
59
|
-
name: `schedulePeriodicRun:${this.name}:${timerName}`
|
|
60
|
-
}), periodMs));
|
|
62
|
+
this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), { name: `schedulePeriodicRun:${this.name}:${timerName}` }), periodMs));
|
|
61
63
|
}
|
|
62
|
-
}
|
|
63
|
-
this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
};
|
|
65
|
+
this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), { name: `schedulePeriodicRun(initial):${this.name}:${timerName}` }), dueTimeMs));
|
|
66
|
+
this.logger?.log(
|
|
67
|
+
`Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`
|
|
68
|
+
);
|
|
67
69
|
}
|
|
68
70
|
span(name, fn) {
|
|
69
71
|
return span(`${this.name}:${name}`, fn, this.tracer);
|
|
@@ -72,17 +74,17 @@ var Actor = class extends Base {
|
|
|
72
74
|
return await spanAsync(`${this.name}:${name}`, fn, this.tracer);
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
* Called by the Orchestrator when the actor is activated.
|
|
78
|
+
*/
|
|
77
79
|
async start() {
|
|
78
80
|
await Promise.resolve();
|
|
79
81
|
this._active = true;
|
|
80
82
|
this.logger?.log("Started.");
|
|
81
83
|
}
|
|
82
84
|
/**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
* Called by the Orchestrator when the actor is deactivated.
|
|
86
|
+
* Stop all running timers.
|
|
87
|
+
*/
|
|
86
88
|
async stop() {
|
|
87
89
|
await Promise.resolve();
|
|
88
90
|
this._active = false;
|
|
@@ -97,9 +99,6 @@ var Actor = class extends Base {
|
|
|
97
99
|
|
|
98
100
|
// src/orchestration/actor/model/Orchestrator.ts
|
|
99
101
|
var Orchestrator = class {
|
|
100
|
-
static {
|
|
101
|
-
__name(this, "Orchestrator");
|
|
102
|
-
}
|
|
103
102
|
actors = [];
|
|
104
103
|
keepAliveHandle = null;
|
|
105
104
|
logger;
|
|
@@ -108,9 +107,9 @@ var Orchestrator = class {
|
|
|
108
107
|
this.logger = logger;
|
|
109
108
|
}
|
|
110
109
|
/**
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
* Registers an actor.
|
|
111
|
+
* (We won't activate the actor until `start()` is called.)
|
|
112
|
+
*/
|
|
114
113
|
async registerActor(actor) {
|
|
115
114
|
if (this.running) {
|
|
116
115
|
await actor.start();
|
|
@@ -118,8 +117,8 @@ var Orchestrator = class {
|
|
|
118
117
|
this.actors.push(actor);
|
|
119
118
|
}
|
|
120
119
|
/**
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
* Starts the orchestrator: activates all actors.
|
|
121
|
+
*/
|
|
123
122
|
async start() {
|
|
124
123
|
await Promise.resolve();
|
|
125
124
|
if (this.running) {
|
|
@@ -135,8 +134,8 @@ var Orchestrator = class {
|
|
|
135
134
|
}, 2147483647);
|
|
136
135
|
}
|
|
137
136
|
/**
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
* Stops the orchestrator: deactivates all actors.
|
|
138
|
+
*/
|
|
140
139
|
async stop() {
|
|
141
140
|
await Promise.resolve();
|
|
142
141
|
if (!this.running) {
|
|
@@ -155,9 +154,6 @@ var Orchestrator = class {
|
|
|
155
154
|
|
|
156
155
|
// src/orchestration/actor/implementation/BalanceActor.ts
|
|
157
156
|
var BalanceActor = class _BalanceActor extends Actor {
|
|
158
|
-
static {
|
|
159
|
-
__name(this, "BalanceActor");
|
|
160
|
-
}
|
|
161
157
|
_updateMutex = new Mutex();
|
|
162
158
|
constructor(params) {
|
|
163
159
|
super("BalanceActor", "Balance", params);
|
|
@@ -196,9 +192,6 @@ import { toHex } from "@xylabs/hex";
|
|
|
196
192
|
import { findMostRecentBlock, sortBlocks } from "@xyo-network/chain-protocol";
|
|
197
193
|
import { asBlockBoundWitness } from "@xyo-network/xl1-protocol";
|
|
198
194
|
var ChainHeadUpdateActor = class _ChainHeadUpdateActor extends Actor {
|
|
199
|
-
static {
|
|
200
|
-
__name(this, "ChainHeadUpdateActor");
|
|
201
|
-
}
|
|
202
195
|
constructor(params) {
|
|
203
196
|
super("ChainHeadUpdate", "ChainHeadUpdate", params);
|
|
204
197
|
}
|
|
@@ -248,13 +241,14 @@ import { createDeclarationIntent } from "@xyo-network/chain-protocol";
|
|
|
248
241
|
import { BaseBlockProducerService } from "@xyo-network/chain-services";
|
|
249
242
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
250
243
|
import { PayloadBundleSchema } from "@xyo-network/payload-model";
|
|
251
|
-
import {
|
|
244
|
+
import {
|
|
245
|
+
buildTransaction,
|
|
246
|
+
flattenHydratedBlock,
|
|
247
|
+
flattenHydratedTransaction
|
|
248
|
+
} from "@xyo-network/xl1-protocol-sdk";
|
|
252
249
|
var SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true;
|
|
253
250
|
var TEN_MINUTES = 10 * 60 * 1e3;
|
|
254
251
|
var ProducerActor = class _ProducerActor extends Actor {
|
|
255
|
-
static {
|
|
256
|
-
__name(this, "ProducerActor");
|
|
257
|
-
}
|
|
258
252
|
_lastProducedBlock;
|
|
259
253
|
_lastRedeclarationIntent;
|
|
260
254
|
constructor(params) {
|
|
@@ -324,15 +318,24 @@ var ProducerActor = class _ProducerActor extends Actor {
|
|
|
324
318
|
this._lastRedeclarationIntent = void 0;
|
|
325
319
|
}
|
|
326
320
|
if (!await this.validateCurrentBalance()) {
|
|
327
|
-
this.logger?.error(
|
|
321
|
+
this.logger?.error(
|
|
322
|
+
`Add balance to address ${this.account.address} for the producer to declare it's intent.`
|
|
323
|
+
);
|
|
328
324
|
return;
|
|
329
325
|
}
|
|
330
326
|
if (!await this.validateCurrentStake()) {
|
|
331
|
-
this.logger?.error(
|
|
327
|
+
this.logger?.error(
|
|
328
|
+
`Add stake to contract address ${this.params.config.chain.id} for the producer to declare it's intent.`
|
|
329
|
+
);
|
|
332
330
|
return;
|
|
333
331
|
}
|
|
334
332
|
this.logger?.log("Creating redeclaration intent for producer:", this.account.address);
|
|
335
|
-
const redeclarationIntent = createDeclarationIntent(
|
|
333
|
+
const redeclarationIntent = createDeclarationIntent(
|
|
334
|
+
this.account.address,
|
|
335
|
+
"producer",
|
|
336
|
+
currentBlock,
|
|
337
|
+
currentBlock + BaseBlockProducerService.RedeclarationDuration
|
|
338
|
+
);
|
|
336
339
|
await this.submitRedeclarationIntent(currentBlock, redeclarationIntent);
|
|
337
340
|
this._lastRedeclarationIntent = redeclarationIntent;
|
|
338
341
|
});
|
|
@@ -342,37 +345,30 @@ var ProducerActor = class _ProducerActor extends Actor {
|
|
|
342
345
|
async calculateBlocksUntilProducerDeclarationExpiration(currentBlock) {
|
|
343
346
|
const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.account.address, "producer");
|
|
344
347
|
const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
|
|
345
|
-
const [, currentDeclarationEnd] = lastRange || [
|
|
346
|
-
void 0,
|
|
347
|
-
currentBlock
|
|
348
|
-
];
|
|
348
|
+
const [, currentDeclarationEnd] = lastRange || [void 0, currentBlock];
|
|
349
349
|
const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
|
|
350
350
|
return timeToProducerExpiration;
|
|
351
351
|
}
|
|
352
352
|
async submitRedeclarationIntent(currentBlock, redeclarationIntent) {
|
|
353
353
|
this.logger?.log("Submitting redeclaration intent for producer:", this.account.address);
|
|
354
|
-
const tx = await buildTransaction(
|
|
355
|
-
|
|
356
|
-
|
|
354
|
+
const tx = await buildTransaction(
|
|
355
|
+
this.chainIterator.chainId,
|
|
356
|
+
[redeclarationIntent],
|
|
357
|
+
[],
|
|
358
|
+
this.account,
|
|
359
|
+
currentBlock,
|
|
360
|
+
currentBlock + 1e3
|
|
361
|
+
);
|
|
357
362
|
const payloads = flattenHydratedTransaction(tx);
|
|
358
363
|
const root = tx[0]._hash;
|
|
359
|
-
const payloadBundle = new PayloadBuilder2({
|
|
360
|
-
|
|
361
|
-
}).fields({
|
|
362
|
-
payloads,
|
|
363
|
-
root
|
|
364
|
-
}).build();
|
|
365
|
-
await this.pendingBundledTransactionsArchivistWrite.insert([
|
|
366
|
-
payloadBundle
|
|
367
|
-
]);
|
|
364
|
+
const payloadBundle = new PayloadBuilder2({ schema: PayloadBundleSchema }).fields({ payloads, root }).build();
|
|
365
|
+
await this.pendingBundledTransactionsArchivistWrite.insert([payloadBundle]);
|
|
368
366
|
this.logger?.log("Submitted redeclaration intent for producer:", this.account.address);
|
|
369
367
|
}
|
|
370
368
|
async validateCurrentBalance() {
|
|
371
369
|
const head = this._lastProducedBlock?.[0]._hash;
|
|
372
370
|
if (isDefined(head)) {
|
|
373
|
-
const balances = await this.balanceService.balances(head, [
|
|
374
|
-
this.account.address
|
|
375
|
-
]);
|
|
371
|
+
const balances = await this.balanceService.balances(head, [this.account.address]);
|
|
376
372
|
const currentBalance = balances[this.account.address] ?? 0n;
|
|
377
373
|
if (currentBalance <= 0n) {
|
|
378
374
|
this.logger?.error(`Producer ${this.account.address} has no balance.`);
|
|
@@ -399,9 +395,6 @@ import { toHex as toHex3 } from "@xylabs/hex";
|
|
|
399
395
|
import { isDefined as isDefined2, isUndefined as isUndefined2 } from "@xylabs/typeof";
|
|
400
396
|
import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
|
|
401
397
|
var ValidatorActor = class _ValidatorActor extends Actor {
|
|
402
|
-
static {
|
|
403
|
-
__name(this, "ValidatorActor");
|
|
404
|
-
}
|
|
405
398
|
_lastValidatedBlock;
|
|
406
399
|
_lastValidatedBlockHash;
|
|
407
400
|
constructor(params) {
|
|
@@ -471,24 +464,16 @@ var ValidatorActor = class _ValidatorActor extends Actor {
|
|
|
471
464
|
// src/orchestration/health/initHealthEndpoints.ts
|
|
472
465
|
import http from "http";
|
|
473
466
|
import { isDefined as isDefined3 } from "@xylabs/typeof";
|
|
474
|
-
var sendStatus =
|
|
467
|
+
var sendStatus = (res, status, errorCode) => {
|
|
475
468
|
const statusCode = status === "started" ? 200 : errorCode;
|
|
476
|
-
res.writeHead(statusCode, {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
}));
|
|
482
|
-
}
|
|
483
|
-
var
|
|
484
|
-
res.writeHead(404, {
|
|
485
|
-
"Content-Type": "application/json"
|
|
486
|
-
});
|
|
487
|
-
res.end(JSON.stringify({
|
|
488
|
-
status: "not found"
|
|
489
|
-
}));
|
|
490
|
-
}, "notFound");
|
|
491
|
-
var createHealthServer = /* @__PURE__ */ __name((port, statusMonitor, logger) => {
|
|
469
|
+
res.writeHead(statusCode, { "Content-Type": "application/json" });
|
|
470
|
+
res.end(JSON.stringify({ status }));
|
|
471
|
+
};
|
|
472
|
+
var notFound = (res) => {
|
|
473
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
474
|
+
res.end(JSON.stringify({ status: "not found" }));
|
|
475
|
+
};
|
|
476
|
+
var createHealthServer = (port, statusMonitor, logger) => {
|
|
492
477
|
const server = http.createServer((req, res) => {
|
|
493
478
|
const url = req.url ?? "";
|
|
494
479
|
const status = statusMonitor.getGlobalStatus();
|
|
@@ -517,12 +502,16 @@ var createHealthServer = /* @__PURE__ */ __name((port, statusMonitor, logger) =>
|
|
|
517
502
|
logger.log(" - /readyz");
|
|
518
503
|
});
|
|
519
504
|
return server;
|
|
520
|
-
}
|
|
521
|
-
var initHealthEndpoints =
|
|
522
|
-
const {
|
|
505
|
+
};
|
|
506
|
+
var initHealthEndpoints = (params) => {
|
|
507
|
+
const {
|
|
508
|
+
config: config3,
|
|
509
|
+
logger,
|
|
510
|
+
statusReporter
|
|
511
|
+
} = params;
|
|
523
512
|
const { healthCheckPort } = config3.producer;
|
|
524
513
|
return isDefined3(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : void 0;
|
|
525
|
-
}
|
|
514
|
+
};
|
|
526
515
|
|
|
527
516
|
// src/orchestration/initServices.ts
|
|
528
517
|
import { assertEx as assertEx17 } from "@xylabs/assert";
|
|
@@ -548,13 +537,13 @@ import { LmdbArchivist, LmdbArchivistConfigSchema } from "@xyo-network/archivist
|
|
|
548
537
|
|
|
549
538
|
// src/orchestration/store/getStoreDirectory.ts
|
|
550
539
|
import Path from "path";
|
|
551
|
-
var getStoreDirectory =
|
|
540
|
+
var getStoreDirectory = (name, storageRoot, kind) => {
|
|
552
541
|
return kind === void 0 ? Path.join(storageRoot, name) : Path.join(storageRoot, kind, name);
|
|
553
|
-
}
|
|
542
|
+
};
|
|
554
543
|
|
|
555
544
|
// src/orchestration/archivists/lib/localPersistentArchivist.ts
|
|
556
545
|
var DEFAULT_STORAGE_ROOT = Path2.join(process.cwd(), ".store");
|
|
557
|
-
var getLocalPersistentArchivist =
|
|
546
|
+
var getLocalPersistentArchivist = (dbName, storeName, storageRoot, kind = "lmdb") => {
|
|
558
547
|
switch (kind) {
|
|
559
548
|
case "lmdb": {
|
|
560
549
|
const root = storageRoot ?? DEFAULT_STORAGE_ROOT;
|
|
@@ -570,19 +559,19 @@ var getLocalPersistentArchivist = /* @__PURE__ */ __name((dbName, storeName, sto
|
|
|
570
559
|
});
|
|
571
560
|
}
|
|
572
561
|
}
|
|
573
|
-
}
|
|
562
|
+
};
|
|
574
563
|
|
|
575
564
|
// src/orchestration/archivists/ChainFinalized/local.ts
|
|
576
565
|
var mutex = new Mutex2();
|
|
577
566
|
var singleton;
|
|
578
|
-
var initLocalChainFinalizedArchivist =
|
|
567
|
+
var initLocalChainFinalizedArchivist = async ({ config: config3 }) => {
|
|
579
568
|
return await mutex.runExclusive(async () => {
|
|
580
569
|
if (singleton) return singleton;
|
|
581
570
|
const { root } = config3.storage;
|
|
582
571
|
singleton = await getLocalPersistentArchivist("chain", "finalized", root);
|
|
583
572
|
return singleton;
|
|
584
573
|
});
|
|
585
|
-
}
|
|
574
|
+
};
|
|
586
575
|
|
|
587
576
|
// src/orchestration/archivists/ChainFinalized/remote.ts
|
|
588
577
|
import { assertEx as assertEx5 } from "@xylabs/assert";
|
|
@@ -591,42 +580,39 @@ import { getUrl } from "@xyo-network/xl1-protocol-sdk";
|
|
|
591
580
|
import { Mutex as Mutex3 } from "async-mutex";
|
|
592
581
|
var mutex2 = new Mutex3();
|
|
593
582
|
var singleton2;
|
|
594
|
-
var initRemoteChainFinalizedArchivist =
|
|
583
|
+
var initRemoteChainFinalizedArchivist = async ({ config: config3 }) => {
|
|
595
584
|
return await mutex2.runExclusive(async () => {
|
|
596
585
|
if (singleton2) return singleton2;
|
|
597
586
|
const { host, port } = config3.api;
|
|
598
587
|
const nodeUrl = getUrl(host, port);
|
|
599
588
|
const bridge = await initBridge(nodeUrl);
|
|
600
|
-
singleton2 = await initBridgedArchivistModule({
|
|
601
|
-
bridge,
|
|
602
|
-
moduleName: "XYOChain:Chain:Finalized"
|
|
603
|
-
});
|
|
589
|
+
singleton2 = await initBridgedArchivistModule({ bridge, moduleName: "XYOChain:Chain:Finalized" });
|
|
604
590
|
return assertEx5(singleton2, () => "Error: RemoteChainFinalizedArchivist failed to initialize");
|
|
605
591
|
});
|
|
606
|
-
}
|
|
592
|
+
};
|
|
607
593
|
|
|
608
594
|
// src/orchestration/archivists/ChainFinalized/archivist.ts
|
|
609
595
|
var mutex3 = new Mutex4();
|
|
610
596
|
var singleton3;
|
|
611
|
-
async function initChainFinalizedArchivist({
|
|
597
|
+
async function initChainFinalizedArchivist({
|
|
598
|
+
config: config3,
|
|
599
|
+
logger,
|
|
600
|
+
traceProvider
|
|
601
|
+
}) {
|
|
612
602
|
return await mutex3.runExclusive(async () => {
|
|
613
603
|
if (singleton3) return singleton3;
|
|
614
604
|
const [remote, local] = await Promise.all([
|
|
615
|
-
startupSpanAsync("ChainFinalizedArchivist:initRemote", () => initRemoteChainFinalizedArchivist({
|
|
616
|
-
|
|
617
|
-
logger
|
|
618
|
-
})),
|
|
619
|
-
startupSpanAsync("ChainFinalizedArchivist:initLocal", () => initLocalChainFinalizedArchivist({
|
|
620
|
-
config: config3,
|
|
621
|
-
logger
|
|
622
|
-
}))
|
|
605
|
+
startupSpanAsync("ChainFinalizedArchivist:initRemote", () => initRemoteChainFinalizedArchivist({ config: config3, logger })),
|
|
606
|
+
startupSpanAsync("ChainFinalizedArchivist:initLocal", () => initLocalChainFinalizedArchivist({ config: config3, logger }))
|
|
623
607
|
]);
|
|
624
|
-
await startupSpanAsync(
|
|
608
|
+
await startupSpanAsync(
|
|
609
|
+
"ChainFinalizedArchivist:initArchivistSync",
|
|
610
|
+
() => initArchivistSync("ChainFinalizedArchivist", remote, local, 200, Number.MAX_SAFE_INTEGER, traceProvider)
|
|
611
|
+
);
|
|
625
612
|
singleton3 = local;
|
|
626
613
|
return singleton3;
|
|
627
614
|
});
|
|
628
615
|
}
|
|
629
|
-
__name(initChainFinalizedArchivist, "initChainFinalizedArchivist");
|
|
630
616
|
|
|
631
617
|
// src/orchestration/archivists/ChainSubmissions/archivist.ts
|
|
632
618
|
import { assertEx as assertEx7 } from "@xylabs/assert";
|
|
@@ -640,31 +626,28 @@ import { getUrl as getUrl2 } from "@xyo-network/xl1-protocol-sdk";
|
|
|
640
626
|
import { Mutex as Mutex5 } from "async-mutex";
|
|
641
627
|
var mutex4 = new Mutex5();
|
|
642
628
|
var singleton4;
|
|
643
|
-
var initRemoteChainSubmissionsArchivist =
|
|
629
|
+
var initRemoteChainSubmissionsArchivist = async ({ config: config3 }) => {
|
|
644
630
|
return await mutex4.runExclusive(async () => {
|
|
645
631
|
if (singleton4) return singleton4;
|
|
646
632
|
const { host, port } = config3.api;
|
|
647
633
|
const nodeUrl = getUrl2(host, port);
|
|
648
634
|
const bridge = await initBridge2(nodeUrl);
|
|
649
|
-
singleton4 = await initBridgedArchivistModule2({
|
|
650
|
-
bridge,
|
|
651
|
-
moduleName: "XYOChain:Chain:Submissions"
|
|
652
|
-
});
|
|
635
|
+
singleton4 = await initBridgedArchivistModule2({ bridge, moduleName: "XYOChain:Chain:Submissions" });
|
|
653
636
|
return assertEx6(singleton4, () => new Error("Failed to initialize RemoteChainSubmissionsArchivist"));
|
|
654
637
|
});
|
|
655
|
-
}
|
|
638
|
+
};
|
|
656
639
|
|
|
657
640
|
// src/orchestration/archivists/ChainSubmissions/archivist.ts
|
|
658
641
|
var mutex5 = new Mutex6();
|
|
659
642
|
var singleton5;
|
|
660
|
-
var initChainSubmissionsArchivist =
|
|
643
|
+
var initChainSubmissionsArchivist = async (params) => {
|
|
661
644
|
return await mutex5.runExclusive(async () => {
|
|
662
645
|
if (singleton5) return singleton5;
|
|
663
646
|
const remote = await startupSpanAsync2("ChainSubmissionsArchivist:initRemote", () => initRemoteChainSubmissionsArchivist(params));
|
|
664
647
|
singleton5 = remote;
|
|
665
648
|
return assertEx7(singleton5, () => new Error("Failed to initialize ChainSubmissionsArchivist"));
|
|
666
649
|
});
|
|
667
|
-
}
|
|
650
|
+
};
|
|
668
651
|
|
|
669
652
|
// src/orchestration/archivists/PendingTransactions/archivist.ts
|
|
670
653
|
import { initArchivistSync as initArchivistSync2 } from "@xyo-network/chain-orchestration";
|
|
@@ -676,7 +659,7 @@ import { MemoryArchivist, MemoryArchivistConfigSchema } from "@xyo-network/archi
|
|
|
676
659
|
import { Mutex as Mutex7 } from "async-mutex";
|
|
677
660
|
var mutex6 = new Mutex7();
|
|
678
661
|
var singleton6;
|
|
679
|
-
var initLocalPendingTransactionsArchivist =
|
|
662
|
+
var initLocalPendingTransactionsArchivist = async () => {
|
|
680
663
|
return await mutex6.runExclusive(async () => {
|
|
681
664
|
if (singleton6) return singleton6;
|
|
682
665
|
singleton6 = await MemoryArchivist.create({
|
|
@@ -689,7 +672,7 @@ var initLocalPendingTransactionsArchivist = /* @__PURE__ */ __name(async () => {
|
|
|
689
672
|
});
|
|
690
673
|
return singleton6;
|
|
691
674
|
});
|
|
692
|
-
}
|
|
675
|
+
};
|
|
693
676
|
|
|
694
677
|
// src/orchestration/archivists/PendingTransactions/remote.ts
|
|
695
678
|
import { assertEx as assertEx8 } from "@xylabs/assert";
|
|
@@ -698,41 +681,35 @@ import { getUrl as getUrl3 } from "@xyo-network/xl1-protocol-sdk";
|
|
|
698
681
|
import { Mutex as Mutex8 } from "async-mutex";
|
|
699
682
|
var mutex7 = new Mutex8();
|
|
700
683
|
var singleton7;
|
|
701
|
-
var initRemotePendingTransactionsArchivist =
|
|
684
|
+
var initRemotePendingTransactionsArchivist = async ({ config: config3 }) => {
|
|
702
685
|
return await mutex7.runExclusive(async () => {
|
|
703
686
|
if (singleton7) return singleton7;
|
|
704
687
|
const { host, port } = config3.api;
|
|
705
688
|
const nodeUrl = getUrl3(host, port);
|
|
706
689
|
const bridge = await initBridge3(nodeUrl);
|
|
707
|
-
singleton7 = await initBridgedArchivistModule3({
|
|
708
|
-
bridge,
|
|
709
|
-
moduleName: "XYOChain:Pending:PendingTransactions"
|
|
710
|
-
});
|
|
690
|
+
singleton7 = await initBridgedArchivistModule3({ bridge, moduleName: "XYOChain:Pending:PendingTransactions" });
|
|
711
691
|
return assertEx8(singleton7, () => "Error: RemotePendingBundledTransactionsArchivist is undefined");
|
|
712
692
|
});
|
|
713
|
-
}
|
|
693
|
+
};
|
|
714
694
|
|
|
715
695
|
// src/orchestration/archivists/PendingTransactions/archivist.ts
|
|
716
696
|
var mutex8 = new Mutex9();
|
|
717
697
|
var singleton8;
|
|
718
|
-
var initPendingBundledTransactionsArchivist =
|
|
698
|
+
var initPendingBundledTransactionsArchivist = async (params) => {
|
|
719
699
|
return await mutex8.runExclusive(async () => {
|
|
720
700
|
if (singleton8) return singleton8;
|
|
721
701
|
const remote = await startupSpanAsync3("PendingBundledTransactionsArchivist:initRemote", () => initRemotePendingTransactionsArchivist(params));
|
|
722
702
|
const local = await startupSpanAsync3("PendingBundledTransactionsArchivist:initLocal", () => initLocalPendingTransactionsArchivist(params));
|
|
723
|
-
const start2 = await remote.next({
|
|
724
|
-
limit: 1,
|
|
725
|
-
order: "desc"
|
|
726
|
-
});
|
|
703
|
+
const start2 = await remote.next({ limit: 1, order: "desc" });
|
|
727
704
|
await local.insert(start2);
|
|
728
|
-
await startupSpanAsync3(
|
|
729
|
-
|
|
730
|
-
local
|
|
731
|
-
|
|
732
|
-
];
|
|
705
|
+
await startupSpanAsync3(
|
|
706
|
+
"PendingBundledTransactionsArchivist:initArchivistSync",
|
|
707
|
+
() => initArchivistSync2("PendingBundledTransactionsArchivist", remote, local)
|
|
708
|
+
);
|
|
709
|
+
singleton8 = [local, remote];
|
|
733
710
|
return singleton8;
|
|
734
711
|
});
|
|
735
|
-
}
|
|
712
|
+
};
|
|
736
713
|
|
|
737
714
|
// src/orchestration/archivists/RejectedTransactions/archivist.ts
|
|
738
715
|
import { startupSpanAsync as startupSpanAsync4 } from "@xyo-network/chain-utils";
|
|
@@ -743,7 +720,7 @@ import { MemoryArchivist as MemoryArchivist2, MemoryArchivistConfigSchema as Mem
|
|
|
743
720
|
import { Mutex as Mutex10 } from "async-mutex";
|
|
744
721
|
var mutex9 = new Mutex10();
|
|
745
722
|
var singleton9;
|
|
746
|
-
var initLocalRejectedTransactionsArchivist =
|
|
723
|
+
var initLocalRejectedTransactionsArchivist = async () => {
|
|
747
724
|
return await mutex9.runExclusive(async () => {
|
|
748
725
|
if (singleton9) return singleton9;
|
|
749
726
|
singleton9 = await MemoryArchivist2.create({
|
|
@@ -756,7 +733,7 @@ var initLocalRejectedTransactionsArchivist = /* @__PURE__ */ __name(async () =>
|
|
|
756
733
|
});
|
|
757
734
|
return singleton9;
|
|
758
735
|
});
|
|
759
|
-
}
|
|
736
|
+
};
|
|
760
737
|
|
|
761
738
|
// src/orchestration/archivists/RejectedTransactions/archivist.ts
|
|
762
739
|
var mutex10 = new Mutex11();
|
|
@@ -769,7 +746,6 @@ async function initRejectedTransactionsArchivist(params) {
|
|
|
769
746
|
return singleton10;
|
|
770
747
|
});
|
|
771
748
|
}
|
|
772
|
-
__name(initRejectedTransactionsArchivist, "initRejectedTransactionsArchivist");
|
|
773
749
|
|
|
774
750
|
// src/orchestration/archivists/StakeIntentState/archivist.ts
|
|
775
751
|
import { assertEx as assertEx10 } from "@xylabs/assert";
|
|
@@ -781,26 +757,26 @@ import { assertEx as assertEx9 } from "@xylabs/assert";
|
|
|
781
757
|
import { Mutex as Mutex12 } from "async-mutex";
|
|
782
758
|
var mutex11 = new Mutex12();
|
|
783
759
|
var singleton11;
|
|
784
|
-
var initLocalStakeIntentStateArchivist =
|
|
760
|
+
var initLocalStakeIntentStateArchivist = async ({ config: config3 }) => {
|
|
785
761
|
return await mutex11.runExclusive(async () => {
|
|
786
762
|
if (singleton11) return singleton11;
|
|
787
763
|
const { root } = config3.storage;
|
|
788
764
|
singleton11 = await getLocalPersistentArchivist("stakeIntent", "state", root);
|
|
789
765
|
return assertEx9(singleton11, () => new Error("Failed to initialize stake intent state archivist"));
|
|
790
766
|
});
|
|
791
|
-
}
|
|
767
|
+
};
|
|
792
768
|
|
|
793
769
|
// src/orchestration/archivists/StakeIntentState/archivist.ts
|
|
794
770
|
var mutex12 = new Mutex13();
|
|
795
771
|
var singleton12;
|
|
796
|
-
var initStakeIntentStateArchivist =
|
|
772
|
+
var initStakeIntentStateArchivist = async (params) => {
|
|
797
773
|
return await mutex12.runExclusive(async () => {
|
|
798
774
|
if (singleton12) return singleton12;
|
|
799
775
|
const local = await startupSpanAsync5("StakeIntentStateArchivist:initLocal", () => initLocalStakeIntentStateArchivist(params));
|
|
800
776
|
singleton12 = local;
|
|
801
777
|
return assertEx10(singleton12, () => "Error: StakeIntentStateArchivist is undefined");
|
|
802
778
|
});
|
|
803
|
-
}
|
|
779
|
+
};
|
|
804
780
|
|
|
805
781
|
// src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
|
|
806
782
|
import { isDefined as isDefined5 } from "@xylabs/typeof";
|
|
@@ -817,34 +793,24 @@ import Path3 from "path";
|
|
|
817
793
|
|
|
818
794
|
// src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts
|
|
819
795
|
import { AbstractCreatable, creatable } from "@xylabs/creatable";
|
|
820
|
-
import {
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
824
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
825
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
826
|
-
}
|
|
827
|
-
__name(_ts_decorate, "_ts_decorate");
|
|
796
|
+
import {
|
|
797
|
+
open
|
|
798
|
+
} from "lmdb";
|
|
828
799
|
var SynchronousLmdbMap = class extends AbstractCreatable {
|
|
829
|
-
static {
|
|
830
|
-
__name(this, "SynchronousLmdbMap");
|
|
831
|
-
}
|
|
832
800
|
db;
|
|
833
801
|
rootDatabase;
|
|
834
802
|
/**
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
803
|
+
* The path to the LMDB folder where the database is stored.
|
|
804
|
+
* This is constructed from the location and dbName parameters
|
|
805
|
+
* allowing for multiple DBs within the root (by specifying a
|
|
806
|
+
* different storeName).
|
|
807
|
+
* @returns The folder path for the LMDB database.
|
|
808
|
+
*/
|
|
841
809
|
get folderPath() {
|
|
842
810
|
return `${this.params.location}/${this.params.dbName}`;
|
|
843
811
|
}
|
|
844
812
|
all() {
|
|
845
|
-
return [
|
|
846
|
-
...this.db.getRange({})
|
|
847
|
-
].map((entry) => entry.value);
|
|
813
|
+
return [...this.db.getRange({})].map((entry) => entry.value);
|
|
848
814
|
}
|
|
849
815
|
clear() {
|
|
850
816
|
this.db.clearSync();
|
|
@@ -864,21 +830,17 @@ var SynchronousLmdbMap = class extends AbstractCreatable {
|
|
|
864
830
|
}
|
|
865
831
|
async startHandler() {
|
|
866
832
|
await super.startHandler();
|
|
867
|
-
this.rootDatabase = open({
|
|
868
|
-
|
|
869
|
-
});
|
|
870
|
-
this.db = this.rootDatabase.openDB({
|
|
871
|
-
name: this.params.storeName
|
|
872
|
-
});
|
|
833
|
+
this.rootDatabase = open({ path: this.folderPath });
|
|
834
|
+
this.db = this.rootDatabase.openDB({ name: this.params.storeName });
|
|
873
835
|
}
|
|
874
836
|
};
|
|
875
|
-
SynchronousLmdbMap =
|
|
837
|
+
SynchronousLmdbMap = __decorateClass([
|
|
876
838
|
creatable()
|
|
877
839
|
], SynchronousLmdbMap);
|
|
878
840
|
|
|
879
841
|
// src/orchestration/map/localPersistentMap.ts
|
|
880
842
|
var DEFAULT_STORAGE_ROOT2 = Path3.join(process.cwd(), ".store");
|
|
881
|
-
var getLocalPersistentMap =
|
|
843
|
+
var getLocalPersistentMap = async (dbName, storeName, storageRoot, kind = "lmdb") => {
|
|
882
844
|
switch (kind) {
|
|
883
845
|
case "lmdb": {
|
|
884
846
|
const root = storageRoot ?? DEFAULT_STORAGE_ROOT2;
|
|
@@ -891,19 +853,19 @@ var getLocalPersistentMap = /* @__PURE__ */ __name(async (dbName, storeName, sto
|
|
|
891
853
|
return store;
|
|
892
854
|
}
|
|
893
855
|
}
|
|
894
|
-
}
|
|
856
|
+
};
|
|
895
857
|
|
|
896
858
|
// src/orchestration/map/BalanceSummary/local.ts
|
|
897
859
|
var mutex13 = new Mutex14();
|
|
898
860
|
var singleton13;
|
|
899
|
-
var initLocalBalanceSummaryMap =
|
|
861
|
+
var initLocalBalanceSummaryMap = async (params) => {
|
|
900
862
|
return await mutex13.runExclusive(async () => {
|
|
901
863
|
if (isDefined4(singleton13)) return singleton13;
|
|
902
864
|
const { root } = params.config.storage;
|
|
903
865
|
singleton13 = await getLocalPersistentMap("balance", "summary", root);
|
|
904
866
|
return singleton13;
|
|
905
867
|
});
|
|
906
|
-
}
|
|
868
|
+
};
|
|
907
869
|
|
|
908
870
|
// src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
|
|
909
871
|
var mutex14 = new Mutex15();
|
|
@@ -916,14 +878,13 @@ async function initBalanceSummaryMap(params) {
|
|
|
916
878
|
return singleton14;
|
|
917
879
|
});
|
|
918
880
|
}
|
|
919
|
-
__name(initBalanceSummaryMap, "initBalanceSummaryMap");
|
|
920
881
|
|
|
921
882
|
// src/orchestration/services/implementation/account.ts
|
|
922
883
|
import { isUndefined as isUndefined3 } from "@xylabs/typeof";
|
|
923
884
|
import { HDWallet } from "@xyo-network/wallet";
|
|
924
885
|
import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/xl1-protocol-sdk";
|
|
925
886
|
var accountServiceSingleton;
|
|
926
|
-
var initAccount =
|
|
887
|
+
var initAccount = async ({ config: config3, logger }) => {
|
|
927
888
|
if (accountServiceSingleton) return accountServiceSingleton;
|
|
928
889
|
let walletPhrase = config3.producer.mnemonic;
|
|
929
890
|
if (isUndefined3(walletPhrase)) {
|
|
@@ -940,16 +901,16 @@ ${randomMnemonic}
|
|
|
940
901
|
const account = await wallet.derivePath(ADDRESS_INDEX.XYO);
|
|
941
902
|
accountServiceSingleton = account;
|
|
942
903
|
return accountServiceSingleton;
|
|
943
|
-
}
|
|
904
|
+
};
|
|
944
905
|
|
|
945
906
|
// src/orchestration/services/implementation/balance.ts
|
|
946
907
|
import { BaseAccountBalanceService } from "@xyo-network/chain-services";
|
|
947
908
|
var balanceServiceSingleton;
|
|
948
|
-
var initBalanceService =
|
|
909
|
+
var initBalanceService = async (params) => {
|
|
949
910
|
if (balanceServiceSingleton) return balanceServiceSingleton;
|
|
950
911
|
balanceServiceSingleton = await BaseAccountBalanceService.create(params);
|
|
951
912
|
return balanceServiceSingleton;
|
|
952
|
-
}
|
|
913
|
+
};
|
|
953
914
|
|
|
954
915
|
// src/orchestration/services/implementation/chain/index.ts
|
|
955
916
|
import { MemoryChainService } from "@xyo-network/chain-services";
|
|
@@ -973,14 +934,12 @@ import { InfuraProvider } from "ethers/providers";
|
|
|
973
934
|
import { assertEx as assertEx11 } from "@xylabs/assert";
|
|
974
935
|
import { hexFrom, isHex } from "@xylabs/hex";
|
|
975
936
|
import { isDefined as isDefined6 } from "@xylabs/typeof";
|
|
976
|
-
var canUseChainId =
|
|
937
|
+
var canUseChainId = (config3) => {
|
|
977
938
|
return isDefined6(config3.evm.chainId);
|
|
978
|
-
}
|
|
979
|
-
var getChainId =
|
|
939
|
+
};
|
|
940
|
+
var getChainId = (config3) => {
|
|
980
941
|
const chainId = assertEx11(config3.evm.chainId, () => "Missing config.evm.chainId");
|
|
981
|
-
if (isHex(chainId, {
|
|
982
|
-
prefix: true
|
|
983
|
-
})) {
|
|
942
|
+
if (isHex(chainId, { prefix: true })) {
|
|
984
943
|
const hex = hexFrom(chainId);
|
|
985
944
|
const parsed = Number.parseInt(hex, 16);
|
|
986
945
|
return parsed;
|
|
@@ -988,51 +947,44 @@ var getChainId = /* @__PURE__ */ __name((config3) => {
|
|
|
988
947
|
const parsed = Number.parseInt(chainId, 10);
|
|
989
948
|
return parsed;
|
|
990
949
|
}
|
|
991
|
-
}
|
|
950
|
+
};
|
|
992
951
|
|
|
993
952
|
// src/orchestration/services/implementation/evm/initInfuraProvider.ts
|
|
994
953
|
var instance;
|
|
995
|
-
var initInfuraProvider =
|
|
954
|
+
var initInfuraProvider = (config3) => {
|
|
996
955
|
if (instance) return instance;
|
|
997
956
|
const providerConfig = getInfuraProviderConfig(config3);
|
|
998
957
|
instance = Promise.resolve(new InfuraProvider(...providerConfig));
|
|
999
958
|
return instance;
|
|
1000
|
-
}
|
|
1001
|
-
var canUseInfuraProvider =
|
|
959
|
+
};
|
|
960
|
+
var canUseInfuraProvider = (config3) => {
|
|
1002
961
|
return canUseChainId(config3) && isDefined7(config3.evm?.infura?.projectId) && isDefined7(config3.evm?.infura?.projectSecret);
|
|
1003
|
-
}
|
|
1004
|
-
var getInfuraProviderConfig =
|
|
962
|
+
};
|
|
963
|
+
var getInfuraProviderConfig = (config3) => {
|
|
1005
964
|
const projectId = assertEx12(config3.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
|
|
1006
965
|
const projectSecret = assertEx12(config3.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
|
|
1007
|
-
return [
|
|
1008
|
-
|
|
1009
|
-
projectId,
|
|
1010
|
-
projectSecret
|
|
1011
|
-
];
|
|
1012
|
-
}, "getInfuraProviderConfig");
|
|
966
|
+
return [getChainId(config3), projectId, projectSecret];
|
|
967
|
+
};
|
|
1013
968
|
|
|
1014
969
|
// src/orchestration/services/implementation/evm/initJsonRpcProvider.ts
|
|
1015
970
|
import { assertEx as assertEx13 } from "@xylabs/assert";
|
|
1016
971
|
import { isDefined as isDefined8 } from "@xylabs/typeof";
|
|
1017
972
|
import { JsonRpcProvider } from "ethers/providers";
|
|
1018
|
-
var initJsonRpcProvider =
|
|
973
|
+
var initJsonRpcProvider = (config3) => {
|
|
1019
974
|
const providerConfig = getJsonRpcProviderConfig(config3);
|
|
1020
975
|
return Promise.resolve(new JsonRpcProvider(...providerConfig));
|
|
1021
|
-
}
|
|
1022
|
-
var canUseJsonRpcProvider =
|
|
976
|
+
};
|
|
977
|
+
var canUseJsonRpcProvider = (config3) => {
|
|
1023
978
|
return canUseChainId(config3) && isDefined8(config3.evm.jsonRpc?.url);
|
|
1024
|
-
}
|
|
1025
|
-
var getJsonRpcProviderConfig =
|
|
979
|
+
};
|
|
980
|
+
var getJsonRpcProviderConfig = (config3) => {
|
|
1026
981
|
const jsonRpcUrl = assertEx13(config3.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
|
|
1027
|
-
return [
|
|
1028
|
-
|
|
1029
|
-
getChainId(config3)
|
|
1030
|
-
];
|
|
1031
|
-
}, "getJsonRpcProviderConfig");
|
|
982
|
+
return [jsonRpcUrl, getChainId(config3)];
|
|
983
|
+
};
|
|
1032
984
|
|
|
1033
985
|
// src/orchestration/services/implementation/evm/initEvmProvider.ts
|
|
1034
986
|
var provider;
|
|
1035
|
-
var initEvmProvider =
|
|
987
|
+
var initEvmProvider = async ({ config: config3 }) => {
|
|
1036
988
|
if (provider) return provider;
|
|
1037
989
|
if (canUseInfuraProvider(config3)) {
|
|
1038
990
|
provider = initInfuraProvider(config3);
|
|
@@ -1040,26 +992,28 @@ var initEvmProvider = /* @__PURE__ */ __name(async ({ config: config3 }) => {
|
|
|
1040
992
|
provider = initJsonRpcProvider(config3);
|
|
1041
993
|
}
|
|
1042
994
|
return assertEx14(await provider, () => "Error: No provider available");
|
|
1043
|
-
}
|
|
1044
|
-
var canUseEvmProvider =
|
|
995
|
+
};
|
|
996
|
+
var canUseEvmProvider = ({ config: config3 }) => {
|
|
1045
997
|
return canUseInfuraProvider(config3) || canUseJsonRpcProvider(config3);
|
|
1046
|
-
}
|
|
998
|
+
};
|
|
1047
999
|
|
|
1048
1000
|
// src/orchestration/services/implementation/chain/evm.ts
|
|
1049
1001
|
var chainStakeServiceSingleton;
|
|
1050
|
-
var canUseEvmContractChainService =
|
|
1002
|
+
var canUseEvmContractChainService = (config3) => {
|
|
1051
1003
|
const { id } = config3.chain;
|
|
1052
|
-
return isDefined9(id) && id !== ZERO_ADDRESS && canUseEvmProvider({
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1004
|
+
return isDefined9(id) && id !== ZERO_ADDRESS && canUseEvmProvider({ config: config3 });
|
|
1005
|
+
};
|
|
1006
|
+
var initEvmContractChainService = async ({
|
|
1007
|
+
account,
|
|
1008
|
+
config: config3,
|
|
1009
|
+
traceProvider,
|
|
1010
|
+
meterProvider,
|
|
1011
|
+
logger
|
|
1012
|
+
}) => {
|
|
1057
1013
|
if (chainStakeServiceSingleton) return chainStakeServiceSingleton;
|
|
1058
1014
|
const emvStakingContractAddress = assertEx15(config3.chain.id, () => "Error: config.chain.id is required");
|
|
1059
1015
|
const id = assertEx15(asAddress(emvStakingContractAddress), () => "Error: config.chain.id is not a valid address");
|
|
1060
|
-
const provider2 = assertEx15(await initEvmProvider({
|
|
1061
|
-
config: config3
|
|
1062
|
-
}));
|
|
1016
|
+
const provider2 = assertEx15(await initEvmProvider({ config: config3 }));
|
|
1063
1017
|
const privateKey = assertEx15(account.private?.hex, () => "Error: Account does not have a private key");
|
|
1064
1018
|
const runner = new Wallet(privateKey, provider2);
|
|
1065
1019
|
chainStakeServiceSingleton = EvmChainService.create({
|
|
@@ -1070,27 +1024,21 @@ var initEvmContractChainService = /* @__PURE__ */ __name(async ({ account, confi
|
|
|
1070
1024
|
logger
|
|
1071
1025
|
});
|
|
1072
1026
|
return await chainStakeServiceSingleton;
|
|
1073
|
-
}
|
|
1027
|
+
};
|
|
1074
1028
|
|
|
1075
1029
|
// src/orchestration/services/implementation/chain/index.ts
|
|
1076
1030
|
var chainStakeServiceSingleton2;
|
|
1077
|
-
var initChainService =
|
|
1031
|
+
var initChainService = ({ account, config: config3 }) => init({
|
|
1078
1032
|
config: config3,
|
|
1079
1033
|
name: "ChainService",
|
|
1080
1034
|
account
|
|
1081
|
-
})
|
|
1082
|
-
var init =
|
|
1035
|
+
});
|
|
1036
|
+
var init = (params) => {
|
|
1083
1037
|
if (chainStakeServiceSingleton2) return chainStakeServiceSingleton2;
|
|
1084
1038
|
const { config: config3 } = params;
|
|
1085
|
-
chainStakeServiceSingleton2 = canUseEvmContractChainService(config3) ? initEvmContractChainService({
|
|
1086
|
-
...params,
|
|
1087
|
-
name: "ChainStakeService"
|
|
1088
|
-
}) : MemoryChainService.create({
|
|
1089
|
-
...params,
|
|
1090
|
-
name: "ChainStakeService"
|
|
1091
|
-
});
|
|
1039
|
+
chainStakeServiceSingleton2 = canUseEvmContractChainService(config3) ? initEvmContractChainService({ ...params, name: "ChainStakeService" }) : MemoryChainService.create({ ...params, name: "ChainStakeService" });
|
|
1092
1040
|
return chainStakeServiceSingleton2;
|
|
1093
|
-
}
|
|
1041
|
+
};
|
|
1094
1042
|
|
|
1095
1043
|
// src/orchestration/services/implementation/head.ts
|
|
1096
1044
|
import { delay } from "@xylabs/delay";
|
|
@@ -1098,88 +1046,90 @@ import { ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/hex";
|
|
|
1098
1046
|
import { createGenesisBlock, findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/chain-protocol";
|
|
1099
1047
|
import { flattenHydratedBlock as flattenHydratedBlock2 } from "@xyo-network/xl1-protocol-sdk";
|
|
1100
1048
|
var headSingleton;
|
|
1101
|
-
var createBootstrapHead =
|
|
1049
|
+
var createBootstrapHead = async (chainSubmissionsArchivistWrite, chainArchivist, account) => {
|
|
1102
1050
|
const block = await createGenesisBlock(account, ZERO_ADDRESS2, 10000000n, account.address);
|
|
1103
1051
|
const [bw] = block;
|
|
1104
1052
|
await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
|
|
1105
1053
|
while (true) {
|
|
1106
|
-
const result = await chainArchivist.get([
|
|
1107
|
-
bw._hash
|
|
1108
|
-
]);
|
|
1054
|
+
const result = await chainArchivist.get([bw._hash]);
|
|
1109
1055
|
if (result.length > 0) break;
|
|
1110
1056
|
await delay(1e3);
|
|
1111
1057
|
}
|
|
1112
1058
|
return bw;
|
|
1113
|
-
}
|
|
1114
|
-
var initHead =
|
|
1115
|
-
const {
|
|
1059
|
+
};
|
|
1060
|
+
var initHead = async (params) => {
|
|
1061
|
+
const {
|
|
1062
|
+
account,
|
|
1063
|
+
chainArchivist,
|
|
1064
|
+
chainSubmissionsArchivistWrite
|
|
1065
|
+
} = params;
|
|
1116
1066
|
if (headSingleton) return headSingleton;
|
|
1117
1067
|
let head = await findMostRecentBlock2(chainArchivist);
|
|
1118
1068
|
if (!head) head = await createBootstrapHead(chainSubmissionsArchivistWrite, chainArchivist, account);
|
|
1119
1069
|
headSingleton = head;
|
|
1120
1070
|
return headSingleton;
|
|
1121
|
-
}
|
|
1071
|
+
};
|
|
1122
1072
|
|
|
1123
1073
|
// src/orchestration/services/implementation/iterator.ts
|
|
1124
|
-
import {
|
|
1074
|
+
import {
|
|
1075
|
+
BaseElectionService,
|
|
1076
|
+
ChainBlockNumberIterationService,
|
|
1077
|
+
XyoStakeIntentService
|
|
1078
|
+
} from "@xyo-network/chain-services";
|
|
1125
1079
|
var chainIteratorServiceSingleton;
|
|
1126
1080
|
var stakeIntentServiceSingleton;
|
|
1127
1081
|
var electionServiceSingleton;
|
|
1128
|
-
var initChainIterator =
|
|
1082
|
+
var initChainIterator = (params) => {
|
|
1129
1083
|
if (chainIteratorServiceSingleton) return chainIteratorServiceSingleton;
|
|
1130
1084
|
chainIteratorServiceSingleton = ChainBlockNumberIterationService.create(params);
|
|
1131
1085
|
return chainIteratorServiceSingleton;
|
|
1132
|
-
}
|
|
1133
|
-
var initStakeIntentService =
|
|
1086
|
+
};
|
|
1087
|
+
var initStakeIntentService = (params) => {
|
|
1134
1088
|
if (stakeIntentServiceSingleton) return stakeIntentServiceSingleton;
|
|
1135
1089
|
stakeIntentServiceSingleton = XyoStakeIntentService.create(params);
|
|
1136
1090
|
return stakeIntentServiceSingleton;
|
|
1137
|
-
}
|
|
1138
|
-
var initElectionService =
|
|
1091
|
+
};
|
|
1092
|
+
var initElectionService = (params) => {
|
|
1139
1093
|
if (electionServiceSingleton) return electionServiceSingleton;
|
|
1140
1094
|
electionServiceSingleton = BaseElectionService.create(params);
|
|
1141
1095
|
return electionServiceSingleton;
|
|
1142
|
-
}
|
|
1096
|
+
};
|
|
1143
1097
|
|
|
1144
1098
|
// src/orchestration/services/implementation/pendingTransactions.ts
|
|
1145
1099
|
import { BasePendingTransactionsService } from "@xyo-network/chain-services";
|
|
1146
1100
|
var serviceSingleton;
|
|
1147
|
-
var initPendingTransactions =
|
|
1101
|
+
var initPendingTransactions = async (params) => {
|
|
1148
1102
|
if (serviceSingleton) return serviceSingleton;
|
|
1149
1103
|
serviceSingleton = await BasePendingTransactionsService.create(params);
|
|
1150
1104
|
return serviceSingleton;
|
|
1151
|
-
}
|
|
1105
|
+
};
|
|
1152
1106
|
|
|
1153
1107
|
// src/orchestration/services/implementation/producer.ts
|
|
1154
1108
|
import { BaseBlockProducerService as BaseBlockProducerService2 } from "@xyo-network/chain-services";
|
|
1155
1109
|
var serviceSingleton2;
|
|
1156
|
-
var initBlockProducer =
|
|
1110
|
+
var initBlockProducer = async (params) => {
|
|
1157
1111
|
if (serviceSingleton2) return serviceSingleton2;
|
|
1158
1112
|
serviceSingleton2 = await BaseBlockProducerService2.create(params);
|
|
1159
1113
|
return serviceSingleton2;
|
|
1160
|
-
}
|
|
1114
|
+
};
|
|
1161
1115
|
|
|
1162
1116
|
// src/orchestration/services/implementation/reward.ts
|
|
1163
1117
|
import { assertEx as assertEx16 } from "@xylabs/assert";
|
|
1164
1118
|
import { EvmBlockRewardService, MemoryBlockRewardService } from "@xyo-network/chain-services";
|
|
1165
1119
|
var rewardServiceSingleton;
|
|
1166
|
-
var initBlockRewardService =
|
|
1120
|
+
var initBlockRewardService = (params) => {
|
|
1167
1121
|
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1168
1122
|
const { config: config3 } = params;
|
|
1169
|
-
rewardServiceSingleton = canUseEvmBlockRewardService({
|
|
1170
|
-
config: config3
|
|
1171
|
-
}) ? initEvmBlockRewardService(params) : initXyoBlockRewardService(params);
|
|
1123
|
+
rewardServiceSingleton = canUseEvmBlockRewardService({ config: config3 }) ? initEvmBlockRewardService(params) : initXyoBlockRewardService(params);
|
|
1172
1124
|
return rewardServiceSingleton;
|
|
1173
|
-
}
|
|
1174
|
-
var initXyoBlockRewardService =
|
|
1125
|
+
};
|
|
1126
|
+
var initXyoBlockRewardService = (params) => {
|
|
1175
1127
|
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1176
1128
|
rewardServiceSingleton = MemoryBlockRewardService.create(params);
|
|
1177
1129
|
return rewardServiceSingleton;
|
|
1178
|
-
}
|
|
1179
|
-
var canUseEvmBlockRewardService =
|
|
1180
|
-
|
|
1181
|
-
}), "canUseEvmBlockRewardService");
|
|
1182
|
-
var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
|
|
1130
|
+
};
|
|
1131
|
+
var canUseEvmBlockRewardService = (params) => canUseEvmProvider({ config: params.config });
|
|
1132
|
+
var initEvmBlockRewardService = async (params) => {
|
|
1183
1133
|
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1184
1134
|
const { account: paramsAccount } = params;
|
|
1185
1135
|
const account = assertEx16(paramsAccount, () => "Error: Account is required");
|
|
@@ -1191,21 +1141,18 @@ var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
|
|
|
1191
1141
|
};
|
|
1192
1142
|
rewardServiceSingleton = EvmBlockRewardService.create(evmBlockRewardServiceParams);
|
|
1193
1143
|
return rewardServiceSingleton;
|
|
1194
|
-
}
|
|
1144
|
+
};
|
|
1195
1145
|
|
|
1196
1146
|
// src/orchestration/services/implementation/validator.ts
|
|
1197
1147
|
var serviceSingleton3;
|
|
1198
|
-
var initValidator =
|
|
1148
|
+
var initValidator = (params) => {
|
|
1199
1149
|
if (serviceSingleton3) return serviceSingleton3;
|
|
1200
1150
|
serviceSingleton3 = initBlockProducer(params);
|
|
1201
1151
|
return serviceSingleton3;
|
|
1202
|
-
}
|
|
1152
|
+
};
|
|
1203
1153
|
|
|
1204
1154
|
// src/orchestration/status/ServiceStatus.ts
|
|
1205
1155
|
var LoggerStatusReporter = class {
|
|
1206
|
-
static {
|
|
1207
|
-
__name(this, "LoggerStatusReporter");
|
|
1208
|
-
}
|
|
1209
1156
|
logger;
|
|
1210
1157
|
statusMap = {};
|
|
1211
1158
|
constructor(logger) {
|
|
@@ -1215,9 +1162,7 @@ var LoggerStatusReporter = class {
|
|
|
1215
1162
|
this.statusMap[name] = status;
|
|
1216
1163
|
const starting = Object.entries(this.statusMap).map(([, value]) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
1217
1164
|
const started = Object.entries(this.statusMap).map(([, value]) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
1218
|
-
this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, {
|
|
1219
|
-
progress
|
|
1220
|
-
});
|
|
1165
|
+
this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, { progress });
|
|
1221
1166
|
}
|
|
1222
1167
|
};
|
|
1223
1168
|
|
|
@@ -1232,7 +1177,7 @@ var statusPriority = {
|
|
|
1232
1177
|
started: 6
|
|
1233
1178
|
};
|
|
1234
1179
|
var SENTINEL_STATUS = "starting";
|
|
1235
|
-
var reduceToMinimumStatus =
|
|
1180
|
+
var reduceToMinimumStatus = (statuses) => {
|
|
1236
1181
|
let minStatus = SENTINEL_STATUS;
|
|
1237
1182
|
let minPriority = Infinity;
|
|
1238
1183
|
for (const status of statuses) {
|
|
@@ -1243,11 +1188,8 @@ var reduceToMinimumStatus = /* @__PURE__ */ __name((statuses) => {
|
|
|
1243
1188
|
}
|
|
1244
1189
|
}
|
|
1245
1190
|
return minStatus;
|
|
1246
|
-
}
|
|
1191
|
+
};
|
|
1247
1192
|
var RuntimeStatusMonitor = class extends LoggerStatusReporter {
|
|
1248
|
-
static {
|
|
1249
|
-
__name(this, "RuntimeStatusMonitor");
|
|
1250
|
-
}
|
|
1251
1193
|
globalTransitions = [];
|
|
1252
1194
|
transitions = [];
|
|
1253
1195
|
getGlobalStatus() {
|
|
@@ -1258,19 +1200,13 @@ var RuntimeStatusMonitor = class extends LoggerStatusReporter {
|
|
|
1258
1200
|
return this.statusMap[name];
|
|
1259
1201
|
}
|
|
1260
1202
|
onGlobalTransition(match, handler) {
|
|
1261
|
-
this.globalTransitions.push({
|
|
1262
|
-
...match,
|
|
1263
|
-
handler
|
|
1264
|
-
});
|
|
1203
|
+
this.globalTransitions.push({ ...match, handler });
|
|
1265
1204
|
}
|
|
1266
1205
|
/**
|
|
1267
|
-
|
|
1268
|
-
|
|
1206
|
+
* Register a callback to be called on a specific transition.
|
|
1207
|
+
*/
|
|
1269
1208
|
onTransition(match, handler) {
|
|
1270
|
-
this.transitions.push({
|
|
1271
|
-
...match,
|
|
1272
|
-
handler
|
|
1273
|
-
});
|
|
1209
|
+
this.transitions.push({ ...match, handler });
|
|
1274
1210
|
}
|
|
1275
1211
|
report(name, status, progress) {
|
|
1276
1212
|
const previous = this.statusMap[name];
|
|
@@ -1283,7 +1219,12 @@ var RuntimeStatusMonitor = class extends LoggerStatusReporter {
|
|
|
1283
1219
|
this.runTransitions(this.globalTransitions, previousGlobal, globalStatus);
|
|
1284
1220
|
}
|
|
1285
1221
|
runTransitions(transitions, prev, next, name) {
|
|
1286
|
-
for (const {
|
|
1222
|
+
for (const {
|
|
1223
|
+
from,
|
|
1224
|
+
to,
|
|
1225
|
+
name: matchName,
|
|
1226
|
+
handler
|
|
1227
|
+
} of transitions) {
|
|
1287
1228
|
if ((matchName === void 0 || matchName === name) && (from === void 0 || from === prev) && (to === void 0 || to === next)) {
|
|
1288
1229
|
handler(prev, next);
|
|
1289
1230
|
}
|
|
@@ -1302,28 +1243,24 @@ var telemetryConfig = {
|
|
|
1302
1243
|
port: 9464
|
|
1303
1244
|
}
|
|
1304
1245
|
};
|
|
1305
|
-
var isStartable =
|
|
1246
|
+
var isStartable = (value) => {
|
|
1306
1247
|
return isDefined10(value.start) && typeof value.start === "function";
|
|
1307
|
-
}
|
|
1308
|
-
var initServices =
|
|
1248
|
+
};
|
|
1249
|
+
var initServices = async (context) => {
|
|
1309
1250
|
const { config: config3, logger } = context;
|
|
1310
1251
|
const statusReporter = new RuntimeStatusMonitor(logger);
|
|
1311
|
-
statusReporter.onGlobalTransition({
|
|
1312
|
-
to: "started"
|
|
1313
|
-
}, () => {
|
|
1252
|
+
statusReporter.onGlobalTransition({ to: "started" }, () => {
|
|
1314
1253
|
logger.log("All services started.");
|
|
1315
1254
|
});
|
|
1316
|
-
statusReporter.onGlobalTransition({
|
|
1317
|
-
to: "error"
|
|
1318
|
-
}, () => {
|
|
1255
|
+
statusReporter.onGlobalTransition({ to: "error" }, () => {
|
|
1319
1256
|
logger.error("Producer encountered an unhandled error!");
|
|
1320
1257
|
process.exit(1);
|
|
1321
1258
|
});
|
|
1322
|
-
await startupSpanAsync7("initHealthEndpoints", () => initHealthEndpoints({
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1259
|
+
await startupSpanAsync7("initHealthEndpoints", () => initHealthEndpoints({ ...context, statusReporter }));
|
|
1260
|
+
const [
|
|
1261
|
+
{ traceProvider, meterProvider },
|
|
1262
|
+
account
|
|
1263
|
+
] = await Promise.all([
|
|
1327
1264
|
startupSpanAsync7("initTelemetry", () => initTelemetry(telemetryConfig)),
|
|
1328
1265
|
startupSpanAsync7("initAccount", () => initAccount(context))
|
|
1329
1266
|
]);
|
|
@@ -1334,18 +1271,47 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1334
1271
|
statusReporter,
|
|
1335
1272
|
traceProvider
|
|
1336
1273
|
};
|
|
1337
|
-
const [
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1274
|
+
const [
|
|
1275
|
+
chainArchivist,
|
|
1276
|
+
[pendingBundledTransactionsArchivist, pendingBundledTransactionsArchivistWrite],
|
|
1277
|
+
rejectedTransactionsArchivist,
|
|
1278
|
+
chainSubmissionsArchivistWrite,
|
|
1279
|
+
stakeIntentStateArchivist,
|
|
1280
|
+
chainService,
|
|
1281
|
+
balanceSummaryMap
|
|
1282
|
+
] = await Promise.all([
|
|
1283
|
+
startupSpanAsync7(
|
|
1284
|
+
"ChainFinalizedArchivist",
|
|
1285
|
+
() => initChainFinalizedArchivist(initParams)
|
|
1286
|
+
),
|
|
1287
|
+
startupSpanAsync7(
|
|
1288
|
+
"PendingBundledTransactionsArchivist",
|
|
1289
|
+
() => initPendingBundledTransactionsArchivist(initParams)
|
|
1290
|
+
),
|
|
1291
|
+
startupSpanAsync7(
|
|
1292
|
+
"RejectedTransactionsArchivist",
|
|
1293
|
+
() => initRejectedTransactionsArchivist(initParams)
|
|
1294
|
+
),
|
|
1295
|
+
startupSpanAsync7(
|
|
1296
|
+
"ChainSubmissionsArchivist",
|
|
1297
|
+
() => initChainSubmissionsArchivist(initParams)
|
|
1298
|
+
),
|
|
1299
|
+
startupSpanAsync7(
|
|
1300
|
+
"StakeIntentStateArchivist",
|
|
1301
|
+
() => initStakeIntentStateArchivist(initParams)
|
|
1302
|
+
),
|
|
1303
|
+
startupSpanAsync7(
|
|
1304
|
+
"ChainService",
|
|
1305
|
+
() => initChainService({
|
|
1306
|
+
...initParams,
|
|
1307
|
+
account,
|
|
1308
|
+
name: "ChainService"
|
|
1309
|
+
})
|
|
1310
|
+
),
|
|
1311
|
+
startupSpanAsync7(
|
|
1312
|
+
"BalanceSummaryMap",
|
|
1313
|
+
() => initBalanceSummaryMap(initParams)
|
|
1314
|
+
)
|
|
1349
1315
|
]);
|
|
1350
1316
|
const chainId = chainService.chainId;
|
|
1351
1317
|
const chainContractViewer = chainService;
|
|
@@ -1357,7 +1323,12 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1357
1323
|
chainArchivist,
|
|
1358
1324
|
chainSubmissionsArchivistWrite
|
|
1359
1325
|
}));
|
|
1360
|
-
const [
|
|
1326
|
+
const [
|
|
1327
|
+
pendingTransactionsService,
|
|
1328
|
+
rewardService,
|
|
1329
|
+
chainIterator,
|
|
1330
|
+
balanceService
|
|
1331
|
+
] = await Promise.all([
|
|
1361
1332
|
startupSpanAsync7("PendingTransactions", () => initPendingTransactions({
|
|
1362
1333
|
name: "PendingTransactionsService",
|
|
1363
1334
|
chainArchivist,
|
|
@@ -1366,40 +1337,55 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1366
1337
|
rejectedTransactionsArchivist,
|
|
1367
1338
|
...initParams
|
|
1368
1339
|
})),
|
|
1369
|
-
startupSpanAsync7(
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1340
|
+
startupSpanAsync7(
|
|
1341
|
+
"RewardService",
|
|
1342
|
+
() => initBlockRewardService({
|
|
1343
|
+
name: "RewardService",
|
|
1344
|
+
account,
|
|
1345
|
+
chainService,
|
|
1346
|
+
...initParams
|
|
1347
|
+
})
|
|
1348
|
+
),
|
|
1349
|
+
startupSpanAsync7(
|
|
1350
|
+
"ChainIterator",
|
|
1351
|
+
() => initChainIterator({
|
|
1352
|
+
name: "ChainIterator",
|
|
1353
|
+
chainArchivist,
|
|
1354
|
+
head,
|
|
1355
|
+
...initParams
|
|
1356
|
+
})
|
|
1357
|
+
),
|
|
1358
|
+
startupSpanAsync7(
|
|
1359
|
+
"BalanceService",
|
|
1360
|
+
() => initBalanceService({
|
|
1361
|
+
name: "BalanceService",
|
|
1362
|
+
chainArchivist,
|
|
1363
|
+
summaryRepository: balanceSummaryRepositoryFromMap(balanceSummaryMap),
|
|
1364
|
+
...initParams
|
|
1365
|
+
})
|
|
1366
|
+
)
|
|
1367
|
+
]);
|
|
1368
|
+
const stakeIntentService = await startupSpanAsync7(
|
|
1369
|
+
"StakeIntentService",
|
|
1370
|
+
() => initStakeIntentService({
|
|
1371
|
+
name: "StakeIntentService",
|
|
1377
1372
|
chainArchivist,
|
|
1378
|
-
|
|
1373
|
+
chainIterator,
|
|
1374
|
+
chainStakeViewer,
|
|
1375
|
+
stakeIntentStateArchivist,
|
|
1379
1376
|
...initParams
|
|
1380
|
-
})
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1377
|
+
})
|
|
1378
|
+
);
|
|
1379
|
+
const electionService = await startupSpanAsync7(
|
|
1380
|
+
"ElectionService",
|
|
1381
|
+
() => initElectionService({
|
|
1382
|
+
name: "ElectionService",
|
|
1383
|
+
chainIterator,
|
|
1384
|
+
chainStakeViewer,
|
|
1385
|
+
stakeIntentService,
|
|
1385
1386
|
...initParams
|
|
1386
|
-
})
|
|
1387
|
-
|
|
1388
|
-
const stakeIntentService = await startupSpanAsync7("StakeIntentService", () => initStakeIntentService({
|
|
1389
|
-
name: "StakeIntentService",
|
|
1390
|
-
chainArchivist,
|
|
1391
|
-
chainIterator,
|
|
1392
|
-
chainStakeViewer,
|
|
1393
|
-
stakeIntentStateArchivist,
|
|
1394
|
-
...initParams
|
|
1395
|
-
}));
|
|
1396
|
-
const electionService = await startupSpanAsync7("ElectionService", () => initElectionService({
|
|
1397
|
-
name: "ElectionService",
|
|
1398
|
-
chainIterator,
|
|
1399
|
-
chainStakeViewer,
|
|
1400
|
-
stakeIntentService,
|
|
1401
|
-
...initParams
|
|
1402
|
-
}));
|
|
1387
|
+
})
|
|
1388
|
+
);
|
|
1403
1389
|
const validatorParams = {
|
|
1404
1390
|
name: "Validator",
|
|
1405
1391
|
account,
|
|
@@ -1442,13 +1428,10 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1442
1428
|
stakeIntentService
|
|
1443
1429
|
};
|
|
1444
1430
|
logger?.log("All services created. Starting...");
|
|
1445
|
-
const startableServices = [
|
|
1446
|
-
balanceSummaryMap,
|
|
1447
|
-
...Object.values(result)
|
|
1448
|
-
].filter(isStartable);
|
|
1431
|
+
const startableServices = [balanceSummaryMap, ...Object.values(result)].filter(isStartable);
|
|
1449
1432
|
await Promise.all(startableServices.map((service) => service.start()));
|
|
1450
1433
|
return result;
|
|
1451
|
-
}
|
|
1434
|
+
};
|
|
1452
1435
|
|
|
1453
1436
|
// src/runCLI.ts
|
|
1454
1437
|
import { deepMerge } from "@xylabs/object";
|
|
@@ -1463,31 +1446,27 @@ import { getServer } from "@xyo-network/chain-api";
|
|
|
1463
1446
|
function runApi(context) {
|
|
1464
1447
|
void getServer(context);
|
|
1465
1448
|
}
|
|
1466
|
-
__name(runApi, "runApi");
|
|
1467
1449
|
|
|
1468
1450
|
// src/commands/producer/runProducer.ts
|
|
1469
|
-
var runProducer =
|
|
1470
|
-
const {
|
|
1451
|
+
var runProducer = async (context) => {
|
|
1452
|
+
const {
|
|
1453
|
+
config: config3,
|
|
1454
|
+
logger,
|
|
1455
|
+
orchestrator
|
|
1456
|
+
} = context;
|
|
1471
1457
|
logger?.log("Services: Initializing...");
|
|
1472
1458
|
const services = await initServices(context);
|
|
1473
1459
|
logger?.log("Services: Initialized");
|
|
1474
|
-
const params = {
|
|
1475
|
-
...services,
|
|
1476
|
-
config: config3
|
|
1477
|
-
};
|
|
1460
|
+
const params = { ...services, config: config3 };
|
|
1478
1461
|
const chainHeadUpdate = await ChainHeadUpdateActor.create(params);
|
|
1479
1462
|
const balances = await BalanceActor.create(params);
|
|
1480
1463
|
const producer = await ProducerActor.create(params);
|
|
1481
|
-
const actors = [
|
|
1482
|
-
chainHeadUpdate,
|
|
1483
|
-
balances,
|
|
1484
|
-
producer
|
|
1485
|
-
];
|
|
1464
|
+
const actors = [chainHeadUpdate, balances, producer];
|
|
1486
1465
|
for (const actor of actors) {
|
|
1487
1466
|
await orchestrator.registerActor(actor);
|
|
1488
1467
|
}
|
|
1489
1468
|
await orchestrator.start();
|
|
1490
|
-
}
|
|
1469
|
+
};
|
|
1491
1470
|
|
|
1492
1471
|
// src/images.ts
|
|
1493
1472
|
var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;118;111;144m_\x1B[0m
|
|
@@ -1511,9 +1490,13 @@ var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\
|
|
|
1511
1490
|
|
|
1512
1491
|
// src/initLogger.ts
|
|
1513
1492
|
import { Base as Base2 } from "@xylabs/base";
|
|
1514
|
-
import {
|
|
1493
|
+
import {
|
|
1494
|
+
ConsoleLogger,
|
|
1495
|
+
LogLevel,
|
|
1496
|
+
SilentLogger
|
|
1497
|
+
} from "@xylabs/logger";
|
|
1515
1498
|
import { isDefined as isDefined11 } from "@xylabs/typeof";
|
|
1516
|
-
var initLogger =
|
|
1499
|
+
var initLogger = (config3) => {
|
|
1517
1500
|
let logger;
|
|
1518
1501
|
if (config3.silent) {
|
|
1519
1502
|
logger = new SilentLogger();
|
|
@@ -1527,18 +1510,22 @@ var initLogger = /* @__PURE__ */ __name((config3) => {
|
|
|
1527
1510
|
}
|
|
1528
1511
|
Base2.defaultLogger = logger;
|
|
1529
1512
|
return logger;
|
|
1530
|
-
}
|
|
1513
|
+
};
|
|
1531
1514
|
|
|
1532
1515
|
// src/optionsFromZodSchema.ts
|
|
1533
|
-
import {
|
|
1534
|
-
|
|
1516
|
+
import {
|
|
1517
|
+
ZodBoolean,
|
|
1518
|
+
ZodDefault,
|
|
1519
|
+
ZodEnum,
|
|
1520
|
+
ZodNumber,
|
|
1521
|
+
ZodObject,
|
|
1522
|
+
ZodOptional
|
|
1523
|
+
} from "zod";
|
|
1524
|
+
var collectOptions = (zodType, path = [], out = {}) => {
|
|
1535
1525
|
if (zodType instanceof ZodObject) {
|
|
1536
1526
|
const shape = zodType.shape;
|
|
1537
1527
|
for (const [k, v] of Object.entries(shape)) {
|
|
1538
|
-
collectOptions(v, [
|
|
1539
|
-
...path,
|
|
1540
|
-
k
|
|
1541
|
-
], out);
|
|
1528
|
+
collectOptions(v, [...path, k], out);
|
|
1542
1529
|
}
|
|
1543
1530
|
return out;
|
|
1544
1531
|
}
|
|
@@ -1546,10 +1533,7 @@ var collectOptions = /* @__PURE__ */ __name((zodType, path = [], out = {}) => {
|
|
|
1546
1533
|
if (def?.innerType instanceof ZodObject) {
|
|
1547
1534
|
const shape = def.innerType.shape;
|
|
1548
1535
|
for (const [k, v] of Object.entries(shape)) {
|
|
1549
|
-
collectOptions(v, [
|
|
1550
|
-
...path,
|
|
1551
|
-
k
|
|
1552
|
-
], out);
|
|
1536
|
+
collectOptions(v, [...path, k], out);
|
|
1553
1537
|
}
|
|
1554
1538
|
return out;
|
|
1555
1539
|
}
|
|
@@ -1567,24 +1551,35 @@ var collectOptions = /* @__PURE__ */ __name((zodType, path = [], out = {}) => {
|
|
|
1567
1551
|
const key = path.join(".");
|
|
1568
1552
|
out[key] = options;
|
|
1569
1553
|
return out;
|
|
1570
|
-
}
|
|
1571
|
-
var optionsFromZodSchema =
|
|
1554
|
+
};
|
|
1555
|
+
var optionsFromZodSchema = (schema) => {
|
|
1572
1556
|
const opts = {};
|
|
1573
1557
|
for (const [rootKey, zodType] of Object.entries(schema)) {
|
|
1574
|
-
collectOptions(zodType, [
|
|
1575
|
-
rootKey
|
|
1576
|
-
], opts);
|
|
1558
|
+
collectOptions(zodType, [rootKey], opts);
|
|
1577
1559
|
}
|
|
1578
1560
|
return opts;
|
|
1579
|
-
}
|
|
1561
|
+
};
|
|
1580
1562
|
|
|
1581
1563
|
// src/tryParseConfig.ts
|
|
1582
1564
|
import { isDefined as isDefined12, isNull } from "@xylabs/typeof";
|
|
1583
1565
|
import { cosmiconfigSync } from "cosmiconfig";
|
|
1584
1566
|
var configName = "xyo";
|
|
1585
1567
|
var configSection = "xl1";
|
|
1586
|
-
var tryParseConfig =
|
|
1587
|
-
const explorer = cosmiconfigSync(
|
|
1568
|
+
var tryParseConfig = () => {
|
|
1569
|
+
const explorer = cosmiconfigSync(
|
|
1570
|
+
configName
|
|
1571
|
+
/* {
|
|
1572
|
+
searchPlaces: [
|
|
1573
|
+
'package.json', // Looks under `xyo` key in package.json
|
|
1574
|
+
'.xyorc.json', // Supports common dotfile format
|
|
1575
|
+
'xyo.config.json', // Supports custom-named config file
|
|
1576
|
+
],
|
|
1577
|
+
loaders: {
|
|
1578
|
+
'.json': defaultLoaders['.json'],
|
|
1579
|
+
'noExt': defaultLoaders['.json'],
|
|
1580
|
+
},
|
|
1581
|
+
}, */
|
|
1582
|
+
);
|
|
1588
1583
|
const result = explorer.search();
|
|
1589
1584
|
if (!isNull(result)) {
|
|
1590
1585
|
const section = result?.config?.[configSection];
|
|
@@ -1593,13 +1588,13 @@ var tryParseConfig = /* @__PURE__ */ __name(() => {
|
|
|
1593
1588
|
}
|
|
1594
1589
|
}
|
|
1595
1590
|
return {};
|
|
1596
|
-
}
|
|
1591
|
+
};
|
|
1597
1592
|
|
|
1598
1593
|
// src/waitForHostPort.ts
|
|
1599
1594
|
import net from "net";
|
|
1600
|
-
var waitForHostPort =
|
|
1595
|
+
var waitForHostPort = (host, port) => {
|
|
1601
1596
|
return new Promise((resolve) => {
|
|
1602
|
-
const tryConnect =
|
|
1597
|
+
const tryConnect = () => {
|
|
1603
1598
|
const socket = new net.Socket();
|
|
1604
1599
|
socket.setTimeout(1e3).once("error", () => {
|
|
1605
1600
|
socket.destroy();
|
|
@@ -1611,15 +1606,15 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
|
|
|
1611
1606
|
socket.end();
|
|
1612
1607
|
resolve();
|
|
1613
1608
|
});
|
|
1614
|
-
}
|
|
1609
|
+
};
|
|
1615
1610
|
tryConnect();
|
|
1616
1611
|
});
|
|
1617
|
-
}
|
|
1612
|
+
};
|
|
1618
1613
|
|
|
1619
1614
|
// src/runCLI.ts
|
|
1620
1615
|
var config;
|
|
1621
|
-
var version = isDefined13("1.
|
|
1622
|
-
var getContextFromConfig =
|
|
1616
|
+
var version = isDefined13("1.9.0") ? "1.9.0" : "unknown";
|
|
1617
|
+
var getContextFromConfig = (config3) => {
|
|
1623
1618
|
const logger = initLogger(config3);
|
|
1624
1619
|
const orchestrator = new Orchestrator(logger);
|
|
1625
1620
|
process.on("SIGINT", () => {
|
|
@@ -1635,11 +1630,8 @@ var getContextFromConfig = /* @__PURE__ */ __name((config3) => {
|
|
|
1635
1630
|
}
|
|
1636
1631
|
})();
|
|
1637
1632
|
});
|
|
1638
|
-
return {
|
|
1639
|
-
|
|
1640
|
-
orchestrator
|
|
1641
|
-
};
|
|
1642
|
-
}, "getContextFromConfig");
|
|
1633
|
+
return { logger, orchestrator };
|
|
1634
|
+
};
|
|
1643
1635
|
async function runCLI() {
|
|
1644
1636
|
const y = yargs(hideBin(process.argv));
|
|
1645
1637
|
const argv = y.usage(`
|
|
@@ -1650,7 +1642,9 @@ Run various components of the XL1 ecosystem.
|
|
|
1650
1642
|
Usage:
|
|
1651
1643
|
$0 <command> [options]`).parserConfiguration({
|
|
1652
1644
|
"dot-notation": true,
|
|
1645
|
+
// foo.bar → { foo: { bar } }
|
|
1653
1646
|
"populate--": true
|
|
1647
|
+
// Populate -- with all options so we can detected user-supplied vs defaults
|
|
1654
1648
|
}).env("XL1").scriptName("xl1").version(version).middleware((argv2) => {
|
|
1655
1649
|
try {
|
|
1656
1650
|
const parsedConfigFile = tryParseConfig();
|
|
@@ -1669,45 +1663,30 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1669
1663
|
return yargs2.command("$0", "Run a XL1 API Node", () => {
|
|
1670
1664
|
}, () => {
|
|
1671
1665
|
const context = getContextFromConfig(config);
|
|
1672
|
-
runApi({
|
|
1673
|
-
...context,
|
|
1674
|
-
config
|
|
1675
|
-
});
|
|
1666
|
+
runApi({ ...context, config });
|
|
1676
1667
|
});
|
|
1677
1668
|
}).command("producer", "Run a XL1 Producer Node", (yargs2) => {
|
|
1678
1669
|
return yargs2.command("$0", "Run a XL1 Producer Node", () => {
|
|
1679
1670
|
}, async () => {
|
|
1680
1671
|
const context = getContextFromConfig(config);
|
|
1681
|
-
await runProducer({
|
|
1682
|
-
...context,
|
|
1683
|
-
config
|
|
1684
|
-
});
|
|
1672
|
+
await runProducer({ ...context, config });
|
|
1685
1673
|
});
|
|
1686
1674
|
}).command("$0", "Run a full XL1 Node", () => {
|
|
1687
1675
|
}, async () => {
|
|
1688
1676
|
const context = getContextFromConfig(config);
|
|
1689
|
-
runApi({
|
|
1690
|
-
...context,
|
|
1691
|
-
config
|
|
1692
|
-
});
|
|
1677
|
+
runApi({ ...context, config });
|
|
1693
1678
|
await waitForHostPort("localhost", config.api.port);
|
|
1694
|
-
await runProducer({
|
|
1695
|
-
...context,
|
|
1696
|
-
config
|
|
1697
|
-
});
|
|
1679
|
+
await runProducer({ ...context, config });
|
|
1698
1680
|
}).help().alias("help", "h").argv;
|
|
1699
1681
|
await argv;
|
|
1700
1682
|
}
|
|
1701
|
-
__name(runCLI, "runCLI");
|
|
1702
1683
|
|
|
1703
1684
|
// src/start.ts
|
|
1704
1685
|
import { config as config2 } from "dotenv";
|
|
1705
|
-
var start =
|
|
1706
|
-
config2({
|
|
1707
|
-
quiet: true
|
|
1708
|
-
});
|
|
1686
|
+
var start = async () => {
|
|
1687
|
+
config2({ quiet: true });
|
|
1709
1688
|
await runCLI();
|
|
1710
|
-
}
|
|
1689
|
+
};
|
|
1711
1690
|
export {
|
|
1712
1691
|
Actor,
|
|
1713
1692
|
BalanceActor,
|