@xyo-network/xl1-cli-lib 1.17.0 → 1.17.2
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/commands/index.d.ts +0 -1
- package/dist/node/commands/index.d.ts.map +1 -1
- package/dist/node/commands/validator/runValidator.d.ts +2 -2
- package/dist/node/commands/validator/runValidator.d.ts.map +1 -1
- package/dist/node/index.mjs +190 -1356
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts +2 -6
- package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts.map +1 -1
- package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts +5 -10
- package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts.map +1 -1
- package/dist/node/orchestration/actor/implementation/index.d.ts +0 -1
- package/dist/node/orchestration/actor/implementation/index.d.ts.map +1 -1
- package/dist/node/orchestration/actor/index.d.ts +0 -1
- package/dist/node/orchestration/actor/index.d.ts.map +1 -1
- package/dist/node/orchestration/index.d.ts +0 -1
- package/dist/node/orchestration/index.d.ts.map +1 -1
- package/dist/node/orchestration/initServices.d.ts.map +1 -1
- package/dist/node/runCLI.d.ts.map +1 -1
- package/dist/node/xl1.mjs +24 -1386
- package/dist/node/xl1.mjs.map +1 -1
- package/package.json +30 -31
- package/src/commands/index.ts +0 -1
- package/src/commands/validator/runValidator.ts +6 -8
- package/src/orchestration/actor/implementation/BalanceActor.ts +4 -16
- package/src/orchestration/actor/implementation/ValidatorActor.ts +19 -27
- package/src/orchestration/actor/implementation/index.ts +0 -1
- package/src/orchestration/actor/index.ts +0 -1
- package/src/orchestration/index.ts +0 -1
- package/src/orchestration/initServices.ts +69 -112
- package/src/runCLI.ts +15 -14
- package/dist/node/commands/producer/index.d.ts +0 -2
- package/dist/node/commands/producer/index.d.ts.map +0 -1
- package/dist/node/commands/producer/runProducer.d.ts +0 -11
- package/dist/node/commands/producer/runProducer.d.ts.map +0 -1
- package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts +0 -35
- package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts.map +0 -1
- package/dist/node/orchestration/actor/model/Actor.d.ts +0 -41
- package/dist/node/orchestration/actor/model/Actor.d.ts.map +0 -1
- package/dist/node/orchestration/actor/model/Orchestrator.d.ts +0 -27
- package/dist/node/orchestration/actor/model/Orchestrator.d.ts.map +0 -1
- package/dist/node/orchestration/actor/model/index.d.ts +0 -3
- package/dist/node/orchestration/actor/model/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/accountBalance.d.ts +0 -7
- package/dist/node/orchestration/services/implementation/accountBalance.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/blockViewer.d.ts +0 -7
- package/dist/node/orchestration/services/implementation/blockViewer.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/chain/evm.d.ts +0 -7
- package/dist/node/orchestration/services/implementation/chain/evm.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/chain/index.d.ts +0 -7
- package/dist/node/orchestration/services/implementation/chain/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/evm/index.d.ts +0 -2
- package/dist/node/orchestration/services/implementation/evm/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/evm/initChainId.d.ts +0 -4
- package/dist/node/orchestration/services/implementation/evm/initChainId.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/evm/initEvmProvider.d.ts +0 -11
- package/dist/node/orchestration/services/implementation/evm/initEvmProvider.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/evm/initInfuraProvider.d.ts +0 -6
- package/dist/node/orchestration/services/implementation/evm/initInfuraProvider.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/evm/initJsonRpcProvider.d.ts +0 -6
- package/dist/node/orchestration/services/implementation/evm/initJsonRpcProvider.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/head/createBootstrapHead.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +0 -8
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +0 -9
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts +0 -4
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts +0 -4
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/head/createForkedHead/createForkedHead.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +0 -11
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts +0 -11
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +0 -11
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +0 -13
- package/dist/node/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts +0 -2
- package/dist/node/orchestration/services/implementation/head/createForkedHead/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts +0 -12
- package/dist/node/orchestration/services/implementation/head/getForkFromBlock.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/head.d.ts +0 -11
- package/dist/node/orchestration/services/implementation/head/head.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/index.d.ts +0 -2
- package/dist/node/orchestration/services/implementation/head/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts +0 -10
- package/dist/node/orchestration/services/implementation/head/submitNewChain.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/index.d.ts +0 -12
- package/dist/node/orchestration/services/implementation/index.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/pendingTransactions.d.ts +0 -9
- package/dist/node/orchestration/services/implementation/pendingTransactions.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/producer.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/producer.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/reward.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/reward.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/time.d.ts +0 -6
- package/dist/node/orchestration/services/implementation/time.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/transfer.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/transfer.d.ts.map +0 -1
- package/dist/node/orchestration/services/implementation/validator.d.ts +0 -5
- package/dist/node/orchestration/services/implementation/validator.d.ts.map +0 -1
- package/dist/node/orchestration/services/index.d.ts +0 -2
- package/dist/node/orchestration/services/index.d.ts.map +0 -1
- package/src/commands/producer/index.ts +0 -1
- package/src/commands/producer/runProducer.ts +0 -40
- package/src/orchestration/actor/implementation/ProducerActor.ts +0 -302
- package/src/orchestration/actor/model/Actor.ts +0 -167
- package/src/orchestration/actor/model/Orchestrator.ts +0 -71
- package/src/orchestration/actor/model/index.ts +0 -2
- package/src/orchestration/services/implementation/accountBalance.ts +0 -29
- package/src/orchestration/services/implementation/blockViewer.ts +0 -29
- package/src/orchestration/services/implementation/chain/evm.ts +0 -39
- package/src/orchestration/services/implementation/chain/index.ts +0 -45
- package/src/orchestration/services/implementation/evm/index.ts +0 -1
- package/src/orchestration/services/implementation/evm/initChainId.ts +0 -20
- package/src/orchestration/services/implementation/evm/initEvmProvider.ts +0 -24
- package/src/orchestration/services/implementation/evm/initInfuraProvider.ts +0 -26
- package/src/orchestration/services/implementation/evm/initJsonRpcProvider.ts +0 -20
- package/src/orchestration/services/implementation/head/createBootstrapHead.ts +0 -31
- package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +0 -27
- package/src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +0 -19
- package/src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts +0 -10
- package/src/orchestration/services/implementation/head/createForkedHead/config/index.ts +0 -3
- package/src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts +0 -29
- package/src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +0 -42
- package/src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts +0 -51
- package/src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts +0 -46
- package/src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +0 -41
- package/src/orchestration/services/implementation/head/createForkedHead/index.ts +0 -1
- package/src/orchestration/services/implementation/head/getForkFromBlock.ts +0 -43
- package/src/orchestration/services/implementation/head/head.ts +0 -49
- package/src/orchestration/services/implementation/head/index.ts +0 -1
- package/src/orchestration/services/implementation/head/submitNewChain.ts +0 -27
- package/src/orchestration/services/implementation/index.ts +0 -11
- package/src/orchestration/services/implementation/pendingTransactions.ts +0 -35
- package/src/orchestration/services/implementation/producer.ts +0 -15
- package/src/orchestration/services/implementation/reward.ts +0 -50
- package/src/orchestration/services/implementation/time.ts +0 -26
- package/src/orchestration/services/implementation/transfer.ts +0 -15
- package/src/orchestration/services/implementation/validator.ts +0 -15
- package/src/orchestration/services/index.ts +0 -1
package/dist/node/xl1.mjs
CHANGED
|
@@ -5,7 +5,9 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
5
5
|
import { config } from "dotenv";
|
|
6
6
|
|
|
7
7
|
// src/runCLI.ts
|
|
8
|
-
import { deepMerge, isDefined as
|
|
8
|
+
import { deepMerge, isDefined as isDefined3 } from "@xylabs/sdk-js";
|
|
9
|
+
import { Orchestrator } from "@xyo-network/chain-orchestration";
|
|
10
|
+
import { runProducer } from "@xyo-network/chain-producer";
|
|
9
11
|
import { ConfigZod } from "@xyo-network/xl1-protocol-sdk";
|
|
10
12
|
import yargs from "yargs";
|
|
11
13
|
import { hideBin } from "yargs/helpers";
|
|
@@ -32,1372 +34,6 @@ function runMempool(context) {
|
|
|
32
34
|
}
|
|
33
35
|
__name(runMempool, "runMempool");
|
|
34
36
|
|
|
35
|
-
// src/commands/producer/runProducer.ts
|
|
36
|
-
import { exists, isDefined as isDefined15 } from "@xylabs/sdk-js";
|
|
37
|
-
|
|
38
|
-
// src/orchestration/actor/implementation/BalanceActor.ts
|
|
39
|
-
import { assertEx } from "@xylabs/sdk-js";
|
|
40
|
-
import { Mutex } from "async-mutex";
|
|
41
|
-
|
|
42
|
-
// src/orchestration/actor/model/Actor.ts
|
|
43
|
-
import { Base, delay, IdLogger } from "@xylabs/sdk-js";
|
|
44
|
-
import { span, spanRootAsync } from "@xylabs/telemetry";
|
|
45
|
-
import { Semaphore } from "async-mutex";
|
|
46
|
-
var Actor = class extends Base {
|
|
47
|
-
static {
|
|
48
|
-
__name(this, "Actor");
|
|
49
|
-
}
|
|
50
|
-
_intervals = /* @__PURE__ */ new Map();
|
|
51
|
-
_semaphores = /* @__PURE__ */ new Map();
|
|
52
|
-
_timeouts = /* @__PURE__ */ new Map();
|
|
53
|
-
_active = false;
|
|
54
|
-
_displayName;
|
|
55
|
-
_id;
|
|
56
|
-
constructor(id, displayName = "Actor", params) {
|
|
57
|
-
const logger = params.logger ?? new IdLogger(Base.defaultLogger ?? console, () => `[${displayName} (${id})] `);
|
|
58
|
-
super({
|
|
59
|
-
...params,
|
|
60
|
-
logger
|
|
61
|
-
});
|
|
62
|
-
this._displayName = displayName;
|
|
63
|
-
this._id = id;
|
|
64
|
-
}
|
|
65
|
-
get displayName() {
|
|
66
|
-
return this._displayName;
|
|
67
|
-
}
|
|
68
|
-
get id() {
|
|
69
|
-
return this._id;
|
|
70
|
-
}
|
|
71
|
-
get name() {
|
|
72
|
-
return this.params.name;
|
|
73
|
-
}
|
|
74
|
-
get logPrefix() {
|
|
75
|
-
return `[${this.displayName} (${this.id})] `;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* The timer runs until the actor is deactivated (or you manually stop it).
|
|
79
|
-
*/
|
|
80
|
-
registerTimer(timerName, callback, dueTimeMs, periodMs) {
|
|
81
|
-
if (!this._active) {
|
|
82
|
-
this.logger?.warn(`Cannot register timer '${timerName}' because actor is not active.`);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
let running = false;
|
|
86
|
-
this._semaphores.set(timerName, new Semaphore(1));
|
|
87
|
-
const timeoutId = setTimeout(() => {
|
|
88
|
-
const intervalId = setInterval(() => {
|
|
89
|
-
const semaphore = this._semaphores.get(timerName);
|
|
90
|
-
if (!this._active || !this._intervals.has(timerName) || !semaphore || running) return;
|
|
91
|
-
if (semaphore.isLocked()) {
|
|
92
|
-
this.logger?.warn(`Skipping timer '${this.name}:${timerName}' execution because previous execution is still running.`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
semaphore.acquire().then(([, release]) => {
|
|
96
|
-
const startTime = Date.now();
|
|
97
|
-
running = true;
|
|
98
|
-
callback().then(() => {
|
|
99
|
-
const duration = Date.now() - startTime;
|
|
100
|
-
if (duration > periodMs) {
|
|
101
|
-
this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than the period (${periodMs}ms).`);
|
|
102
|
-
} else if (duration > 5e3) {
|
|
103
|
-
this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than 5000ms.`);
|
|
104
|
-
}
|
|
105
|
-
}).catch((error) => {
|
|
106
|
-
this.logger?.error(`Error in timer '${this.name}:${timerName}': ${error}`);
|
|
107
|
-
}).finally(() => {
|
|
108
|
-
release();
|
|
109
|
-
running = false;
|
|
110
|
-
});
|
|
111
|
-
}).catch((error) => {
|
|
112
|
-
this.logger?.error(`Error acquiring semaphore for timer '${this.name}:${timerName}': ${error}`);
|
|
113
|
-
});
|
|
114
|
-
}, periodMs);
|
|
115
|
-
this._intervals.set(timerName, intervalId);
|
|
116
|
-
}, dueTimeMs);
|
|
117
|
-
this._timeouts.set(timerName, timeoutId);
|
|
118
|
-
this.logger?.log(`Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`);
|
|
119
|
-
}
|
|
120
|
-
span(name, fn) {
|
|
121
|
-
return span(`${this.name}:${name}`, fn, this.tracer);
|
|
122
|
-
}
|
|
123
|
-
async spanAsync(name, fn) {
|
|
124
|
-
return await spanRootAsync(`${this.name}:${name}`, fn, this.tracer);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Called by the Orchestrator when the actor is activated.
|
|
128
|
-
*/
|
|
129
|
-
async start() {
|
|
130
|
-
await Promise.resolve();
|
|
131
|
-
this._active = true;
|
|
132
|
-
this.logger?.log("Started.");
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Called by the Orchestrator when the actor is deactivated.
|
|
136
|
-
* Stop all running timers.
|
|
137
|
-
*/
|
|
138
|
-
async stop() {
|
|
139
|
-
await Promise.resolve();
|
|
140
|
-
this._active = false;
|
|
141
|
-
this.logger?.log("Stopping all timers...");
|
|
142
|
-
await Promise.all([
|
|
143
|
-
...this._semaphores.values()
|
|
144
|
-
].map(async (semaphore) => {
|
|
145
|
-
while (semaphore.isLocked()) {
|
|
146
|
-
this.logger?.log("Waiting for running timer task to complete...");
|
|
147
|
-
await delay(500);
|
|
148
|
-
}
|
|
149
|
-
await semaphore.acquire();
|
|
150
|
-
}));
|
|
151
|
-
this._semaphores.clear();
|
|
152
|
-
for (const [, timeoutRef] of this._timeouts.entries()) {
|
|
153
|
-
clearTimeout(timeoutRef);
|
|
154
|
-
}
|
|
155
|
-
this._timeouts.clear();
|
|
156
|
-
for (const [, intervalRef] of this._intervals.entries()) {
|
|
157
|
-
clearInterval(intervalRef);
|
|
158
|
-
}
|
|
159
|
-
this._intervals.clear();
|
|
160
|
-
this.logger?.log("Stopped.");
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// src/orchestration/actor/model/Orchestrator.ts
|
|
165
|
-
var Orchestrator = class {
|
|
166
|
-
static {
|
|
167
|
-
__name(this, "Orchestrator");
|
|
168
|
-
}
|
|
169
|
-
actors = [];
|
|
170
|
-
keepAliveHandle = null;
|
|
171
|
-
logger;
|
|
172
|
-
running = false;
|
|
173
|
-
constructor(logger) {
|
|
174
|
-
this.logger = logger;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Registers an actor.
|
|
178
|
-
* (We won't activate the actor until `start()` is called.)
|
|
179
|
-
*/
|
|
180
|
-
async registerActor(actor) {
|
|
181
|
-
if (this.running) {
|
|
182
|
-
await actor.start();
|
|
183
|
-
}
|
|
184
|
-
this.actors.push(actor);
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Starts the orchestrator: activates all actors.
|
|
188
|
-
*/
|
|
189
|
-
async start() {
|
|
190
|
-
await Promise.resolve();
|
|
191
|
-
if (this.running) {
|
|
192
|
-
this.logger?.warn("[Orchestrator] Already started.");
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
this.logger?.log("[Orchestrator] Starting...");
|
|
196
|
-
this.running = true;
|
|
197
|
-
for (const actor of this.actors) {
|
|
198
|
-
await actor.start();
|
|
199
|
-
}
|
|
200
|
-
this.keepAliveHandle = setInterval(() => {
|
|
201
|
-
}, 2147483647);
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Stops the orchestrator: deactivates all actors.
|
|
205
|
-
*/
|
|
206
|
-
async stop() {
|
|
207
|
-
await Promise.resolve();
|
|
208
|
-
if (!this.running) {
|
|
209
|
-
this.logger?.log("[Orchestrator] Already stopped.");
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
this.logger?.log("[Orchestrator] Stopping...");
|
|
213
|
-
for (const actor of this.actors) {
|
|
214
|
-
await actor.stop();
|
|
215
|
-
}
|
|
216
|
-
this.running = false;
|
|
217
|
-
if (this.keepAliveHandle) clearInterval(this.keepAliveHandle);
|
|
218
|
-
this.logger?.log("[Orchestrator] Stopped...");
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
// src/orchestration/actor/implementation/BalanceActor.ts
|
|
223
|
-
var BalanceActor = class _BalanceActor extends Actor {
|
|
224
|
-
static {
|
|
225
|
-
__name(this, "BalanceActor");
|
|
226
|
-
}
|
|
227
|
-
_updateMutex = new Mutex();
|
|
228
|
-
constructor(params) {
|
|
229
|
-
super("BalanceActor", "Balance", params);
|
|
230
|
-
}
|
|
231
|
-
get balanceService() {
|
|
232
|
-
return assertEx(this.params.balance, () => "balanceService not set");
|
|
233
|
-
}
|
|
234
|
-
get blockViewer() {
|
|
235
|
-
return assertEx(this.params.blockViewer, () => "blockViewer not set");
|
|
236
|
-
}
|
|
237
|
-
static create(params) {
|
|
238
|
-
return new _BalanceActor(params);
|
|
239
|
-
}
|
|
240
|
-
async start() {
|
|
241
|
-
await super.start();
|
|
242
|
-
this.registerTimer(
|
|
243
|
-
"BalanceTimer",
|
|
244
|
-
async () => {
|
|
245
|
-
await this.updateBalance();
|
|
246
|
-
},
|
|
247
|
-
1e3,
|
|
248
|
-
1e4
|
|
249
|
-
/* 1000 */
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
async updateBalance() {
|
|
253
|
-
if (this._updateMutex.isLocked()) return;
|
|
254
|
-
await this._updateMutex.runExclusive(async () => {
|
|
255
|
-
const head = await this.blockViewer.currentBlockHash();
|
|
256
|
-
await this.balanceService.accountsBalances([], head);
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
// src/orchestration/actor/implementation/ProducerActor.ts
|
|
262
|
-
import { assertEx as assertEx2, isDefined, isUndefined, toHex } from "@xylabs/sdk-js";
|
|
263
|
-
import { createDeclarationIntent } from "@xyo-network/chain-protocol";
|
|
264
|
-
import { BaseBlockProducerService } from "@xyo-network/chain-services";
|
|
265
|
-
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
266
|
-
import { PayloadBundleSchema } from "@xyo-network/payload-model";
|
|
267
|
-
import { asXL1BlockNumber } from "@xyo-network/xl1-protocol";
|
|
268
|
-
import { buildTransaction, flattenHydratedBlock, flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
|
|
269
|
-
import { Mutex as Mutex2 } from "async-mutex";
|
|
270
|
-
var SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true;
|
|
271
|
-
var TEN_MINUTES = 10 * 60 * 1e3;
|
|
272
|
-
var ProducerActor = class _ProducerActor extends Actor {
|
|
273
|
-
static {
|
|
274
|
-
__name(this, "ProducerActor");
|
|
275
|
-
}
|
|
276
|
-
_lastProducedBlock;
|
|
277
|
-
_lastRedeclarationIntent;
|
|
278
|
-
_metricAttributes;
|
|
279
|
-
_producerActorBlockProductionAttempts;
|
|
280
|
-
_producerActorBlockProductionChecks;
|
|
281
|
-
_producerActorBlocksProduced;
|
|
282
|
-
_producerActorBlocksPublished;
|
|
283
|
-
_produceBlockMutex = new Mutex2();
|
|
284
|
-
constructor(params) {
|
|
285
|
-
super(params.producer.address, "Producer", params);
|
|
286
|
-
this._metricAttributes = {
|
|
287
|
-
address: this.account.address.toString()
|
|
288
|
-
};
|
|
289
|
-
this._producerActorBlockProductionChecks = this.meter?.createCounter("producer_actor_block_production_checks", {
|
|
290
|
-
description: "Number of block production checks"
|
|
291
|
-
});
|
|
292
|
-
this._producerActorBlockProductionAttempts = this.meter?.createCounter("producer_actor_block_production_attempts", {
|
|
293
|
-
description: "Number of block production attempts"
|
|
294
|
-
});
|
|
295
|
-
this._producerActorBlocksProduced = this.meter?.createCounter("producer_actor_blocks_produced", {
|
|
296
|
-
description: "Number of blocks produced"
|
|
297
|
-
});
|
|
298
|
-
this._producerActorBlocksPublished = this.meter?.createCounter("producer_actor_blocks_published", {
|
|
299
|
-
description: "Number of blocks published"
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
get account() {
|
|
303
|
-
return assertEx2(this.params.account, () => "account not set");
|
|
304
|
-
}
|
|
305
|
-
get balanceService() {
|
|
306
|
-
return assertEx2(this.params.balance, () => "balanceService not set");
|
|
307
|
-
}
|
|
308
|
-
get blockViewer() {
|
|
309
|
-
return assertEx2(this.params.blockViewer, () => "blockViewer not set");
|
|
310
|
-
}
|
|
311
|
-
get chainStakeViewer() {
|
|
312
|
-
return assertEx2(this.params.chainStakeViewer, () => "chainStakeViewer not set");
|
|
313
|
-
}
|
|
314
|
-
get chainSubmissionsArchivistWrite() {
|
|
315
|
-
return assertEx2(this.params.chainSubmissionsArchivistWrite, () => "chainSubmissionsArchivistWrite not set");
|
|
316
|
-
}
|
|
317
|
-
get pendingBundledTransactionsArchivistWrite() {
|
|
318
|
-
return assertEx2(this.params.pendingBundledTransactionsArchivistWrite, () => "pendingBundledTransactionsArchivistWrite not set");
|
|
319
|
-
}
|
|
320
|
-
get producer() {
|
|
321
|
-
return assertEx2(this.params.producer, () => "producer not set");
|
|
322
|
-
}
|
|
323
|
-
get stakeIntentService() {
|
|
324
|
-
return assertEx2(this.params.stakeIntent, () => "stakeIntentService not set");
|
|
325
|
-
}
|
|
326
|
-
static create(params) {
|
|
327
|
-
return new _ProducerActor(params);
|
|
328
|
-
}
|
|
329
|
-
async start() {
|
|
330
|
-
await super.start();
|
|
331
|
-
this.registerTimer(
|
|
332
|
-
"BlockProductionTimer",
|
|
333
|
-
async () => {
|
|
334
|
-
await this.produceBlock();
|
|
335
|
-
},
|
|
336
|
-
2e3,
|
|
337
|
-
1500
|
|
338
|
-
/* 500 */
|
|
339
|
-
);
|
|
340
|
-
if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {
|
|
341
|
-
this.registerTimer("ProducerRedeclarationTimer", async () => {
|
|
342
|
-
await this.redeclareIntent();
|
|
343
|
-
}, TEN_MINUTES, TEN_MINUTES);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
async calculateBlocksUntilProducerDeclarationExpiration(currentBlock) {
|
|
347
|
-
const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.account.address, "producer");
|
|
348
|
-
const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
|
|
349
|
-
const [, currentDeclarationEnd] = lastRange ?? [
|
|
350
|
-
void 0,
|
|
351
|
-
currentBlock
|
|
352
|
-
];
|
|
353
|
-
const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
|
|
354
|
-
return timeToProducerExpiration;
|
|
355
|
-
}
|
|
356
|
-
async produceBlock() {
|
|
357
|
-
this._producerActorBlockProductionChecks?.add(1, this._metricAttributes);
|
|
358
|
-
await this.spanAsync("produceBlock", async () => {
|
|
359
|
-
if (this._produceBlockMutex.isLocked()) {
|
|
360
|
-
this.logger?.log("Skipping block production, previous production still in progress");
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
await this._produceBlockMutex.runExclusive(async () => {
|
|
364
|
-
const headStart = Date.now();
|
|
365
|
-
const head = (await this.blockViewer.currentBlock())[0];
|
|
366
|
-
const headDuration = Date.now() - headStart;
|
|
367
|
-
if (headDuration > 500) this.logger?.warn(`[Slow] Fetched head in ${headDuration}ms: 0x${toHex(head._hash)}`);
|
|
368
|
-
const headHash = head._hash;
|
|
369
|
-
if (this._lastProducedBlock && this._lastProducedBlock[0].previous === headHash) {
|
|
370
|
-
this.logger?.log("Block already produced:", `0x${toHex(this._lastProducedBlock[0].block)}`, this._lastProducedBlock[0].block);
|
|
371
|
-
} else {
|
|
372
|
-
this._producerActorBlockProductionAttempts?.add(1, this._metricAttributes);
|
|
373
|
-
const nextStart = Date.now();
|
|
374
|
-
const nextBlock = await this.producer.next(head);
|
|
375
|
-
const nextDuration = Date.now() - nextStart;
|
|
376
|
-
if (nextDuration > 1e3) this.logger?.warn(`[Slow] Generated next block in ${nextDuration}ms, block: ${nextBlock?.[0]._hash}`);
|
|
377
|
-
if (nextBlock) {
|
|
378
|
-
const displayBlockNumber = `0x${toHex(nextBlock[0].block)}`;
|
|
379
|
-
this.logger?.log("Produced block:", displayBlockNumber);
|
|
380
|
-
this._producerActorBlocksProduced?.add(1, this._metricAttributes);
|
|
381
|
-
await this.chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(nextBlock));
|
|
382
|
-
this.logger?.log("Published block:", displayBlockNumber, nextBlock[0].block);
|
|
383
|
-
this._producerActorBlocksPublished?.add(1, this._metricAttributes);
|
|
384
|
-
this._lastProducedBlock = nextBlock;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
async redeclareIntent() {
|
|
391
|
-
await this.spanAsync("redeclareIntent", async () => {
|
|
392
|
-
if (this.params.config.producer.disableIntentRedeclaration) return;
|
|
393
|
-
const head = (await this.blockViewer.currentBlock())[0];
|
|
394
|
-
if (isUndefined(head)) return;
|
|
395
|
-
const currentBlock = head.block;
|
|
396
|
-
const blocksUntilExpiration = await this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock);
|
|
397
|
-
if (blocksUntilExpiration > BaseBlockProducerService.RedeclarationWindow * 0.1) {
|
|
398
|
-
this._lastRedeclarationIntent = void 0;
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
if (this._lastRedeclarationIntent) {
|
|
402
|
-
if (this._lastRedeclarationIntent.exp > currentBlock) return;
|
|
403
|
-
this._lastRedeclarationIntent = void 0;
|
|
404
|
-
}
|
|
405
|
-
if (!await this.validateCurrentBalance()) {
|
|
406
|
-
this.logger?.error(`Add balance to address ${this.account.address} for the producer to declare it's intent.`);
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
if (!await this.validateCurrentStake()) {
|
|
410
|
-
this.logger?.error(`Add stake to contract address ${this.params.config.chain.id} for the producer to declare it's intent.`);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
this.logger?.log("Creating redeclaration intent for producer:", this.account.address);
|
|
414
|
-
const redeclarationIntent = createDeclarationIntent(this.account.address, "producer", currentBlock, currentBlock + BaseBlockProducerService.RedeclarationDuration);
|
|
415
|
-
await this.submitRedeclarationIntent(currentBlock, redeclarationIntent);
|
|
416
|
-
this._lastRedeclarationIntent = redeclarationIntent;
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
async submitRedeclarationIntent(currentBlock, redeclarationIntent) {
|
|
420
|
-
this.logger?.log("Submitting redeclaration intent for producer:", this.account.address);
|
|
421
|
-
const tx = await buildTransaction(await this.chainStakeViewer.chainId(), [
|
|
422
|
-
redeclarationIntent
|
|
423
|
-
], [], this.account, currentBlock, asXL1BlockNumber(currentBlock + 1e3, true));
|
|
424
|
-
const payloads = flattenHydratedTransaction(tx);
|
|
425
|
-
const root = tx[0]._hash;
|
|
426
|
-
const payloadBundle = new PayloadBuilder({
|
|
427
|
-
schema: PayloadBundleSchema
|
|
428
|
-
}).fields({
|
|
429
|
-
payloads,
|
|
430
|
-
root
|
|
431
|
-
}).build();
|
|
432
|
-
await this.pendingBundledTransactionsArchivistWrite.insert([
|
|
433
|
-
payloadBundle
|
|
434
|
-
]);
|
|
435
|
-
this.logger?.log("Submitted redeclaration intent for producer:", this.account.address);
|
|
436
|
-
}
|
|
437
|
-
async validateCurrentBalance() {
|
|
438
|
-
const head = this._lastProducedBlock?.[0]._hash;
|
|
439
|
-
if (isDefined(head)) {
|
|
440
|
-
const balances = await this.balanceService.accountsBalances([
|
|
441
|
-
this.account.address
|
|
442
|
-
], head);
|
|
443
|
-
const currentBalance = balances[this.account.address] ?? 0n;
|
|
444
|
-
if (currentBalance <= 0n) {
|
|
445
|
-
this.logger?.error(`Producer ${this.account.address} has no balance.`);
|
|
446
|
-
return false;
|
|
447
|
-
}
|
|
448
|
-
return true;
|
|
449
|
-
}
|
|
450
|
-
return true;
|
|
451
|
-
}
|
|
452
|
-
async validateCurrentStake() {
|
|
453
|
-
const requiredMinimumStake = this.stakeIntentService.getRequiredMinimumStakeForIntent("producer");
|
|
454
|
-
const currentStake = await this.chainStakeViewer.activeByStaked(this.account.address);
|
|
455
|
-
if (currentStake < requiredMinimumStake) {
|
|
456
|
-
this.logger?.error(`Producer ${this.account.address} has insufficient stake.`);
|
|
457
|
-
return false;
|
|
458
|
-
}
|
|
459
|
-
return true;
|
|
460
|
-
}
|
|
461
|
-
};
|
|
462
|
-
|
|
463
|
-
// src/orchestration/health/initHealthEndpoints.ts
|
|
464
|
-
import http from "http";
|
|
465
|
-
import { isDefined as isDefined2 } from "@xylabs/sdk-js";
|
|
466
|
-
var sendStatus = /* @__PURE__ */ __name((res, status, errorCode) => {
|
|
467
|
-
const statusCode = status === "started" ? 200 : errorCode;
|
|
468
|
-
res.writeHead(statusCode, {
|
|
469
|
-
"Content-Type": "application/json"
|
|
470
|
-
});
|
|
471
|
-
res.end(JSON.stringify({
|
|
472
|
-
status
|
|
473
|
-
}));
|
|
474
|
-
}, "sendStatus");
|
|
475
|
-
var notFound = /* @__PURE__ */ __name((res) => {
|
|
476
|
-
res.writeHead(404, {
|
|
477
|
-
"Content-Type": "application/json"
|
|
478
|
-
});
|
|
479
|
-
res.end(JSON.stringify({
|
|
480
|
-
status: "not found"
|
|
481
|
-
}));
|
|
482
|
-
}, "notFound");
|
|
483
|
-
var createHealthServer = /* @__PURE__ */ __name((port, statusMonitor, logger) => {
|
|
484
|
-
const server = http.createServer((req, res) => {
|
|
485
|
-
const url = req.url ?? "";
|
|
486
|
-
const status = statusMonitor.getGlobalStatus();
|
|
487
|
-
switch (url) {
|
|
488
|
-
case "/healthz": {
|
|
489
|
-
sendStatus(res, status, 500);
|
|
490
|
-
break;
|
|
491
|
-
}
|
|
492
|
-
case "/livez": {
|
|
493
|
-
sendStatus(res, status, 503);
|
|
494
|
-
break;
|
|
495
|
-
}
|
|
496
|
-
case "/readyz": {
|
|
497
|
-
sendStatus(res, status, 503);
|
|
498
|
-
break;
|
|
499
|
-
}
|
|
500
|
-
default: {
|
|
501
|
-
notFound(res);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
server.listen(port, () => {
|
|
506
|
-
logger.log(`Health server running on http://localhost:${port}`);
|
|
507
|
-
logger.log(" - /healthz");
|
|
508
|
-
logger.log(" - /livez");
|
|
509
|
-
logger.log(" - /readyz");
|
|
510
|
-
});
|
|
511
|
-
return server;
|
|
512
|
-
}, "createHealthServer");
|
|
513
|
-
var initHealthEndpoints = /* @__PURE__ */ __name((params) => {
|
|
514
|
-
const { config: config2, logger, statusReporter } = params;
|
|
515
|
-
const { healthCheckPort } = config2.producer;
|
|
516
|
-
return isDefined2(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : void 0;
|
|
517
|
-
}, "initHealthEndpoints");
|
|
518
|
-
|
|
519
|
-
// src/orchestration/initServices.ts
|
|
520
|
-
import { asAddress as asAddress2, assertEx as assertEx15, isDefined as isDefined14 } from "@xylabs/sdk-js";
|
|
521
|
-
import { initElectionService, initProducerAccount, initStakeIntentService } from "@xyo-network/chain-orchestration";
|
|
522
|
-
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
523
|
-
import { startupSpanAsync as startupSpanAsync7 } from "@xyo-network/chain-utils";
|
|
524
|
-
import { validateHydratedBlockState } from "@xyo-network/chain-validation";
|
|
525
|
-
import { CompletedStepRewardAddressValidatorFactory, DerivedReceiveAddressValidatorFactory, SelfSignerValidator, TransactionTransfersValidatorFactory } from "@xyo-network/xl1-validation";
|
|
526
|
-
|
|
527
|
-
// src/orchestration/archivists/lib/localPersistentArchivist.ts
|
|
528
|
-
import { rm } from "fs/promises";
|
|
529
|
-
import Path from "path";
|
|
530
|
-
import { LmdbArchivist, LmdbArchivistConfigSchema } from "@xyo-network/archivist-lmdb";
|
|
531
|
-
import { getStoreDirectory } from "@xyo-network/chain-protocol";
|
|
532
|
-
var DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), ".store");
|
|
533
|
-
var getLocalPersistentArchivist = /* @__PURE__ */ __name((name, dbName, storeName, storageRoot, kind = "lmdb") => {
|
|
534
|
-
switch (kind) {
|
|
535
|
-
case "lmdb": {
|
|
536
|
-
const root = storageRoot ?? DEFAULT_STORAGE_ROOT;
|
|
537
|
-
return LmdbArchivist.create({
|
|
538
|
-
account: "random",
|
|
539
|
-
config: {
|
|
540
|
-
name,
|
|
541
|
-
clearStoreOnStart: false,
|
|
542
|
-
dbName,
|
|
543
|
-
location: getStoreDirectory(dbName, root, "lmdb"),
|
|
544
|
-
schema: LmdbArchivistConfigSchema,
|
|
545
|
-
storeName
|
|
546
|
-
}
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
}, "getLocalPersistentArchivist");
|
|
551
|
-
|
|
552
|
-
// src/orchestration/archivists/ChainSubmissions/archivist.ts
|
|
553
|
-
import { assertEx as assertEx4 } from "@xylabs/sdk-js";
|
|
554
|
-
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
555
|
-
import { timeBudget } from "@xyo-network/xl1-protocol-sdk";
|
|
556
|
-
import { Mutex as Mutex4 } from "async-mutex";
|
|
557
|
-
|
|
558
|
-
// src/orchestration/archivists/ChainSubmissions/remote.ts
|
|
559
|
-
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
560
|
-
import { initBridge, initBridgedArchivistModule } from "@xyo-network/chain-orchestration";
|
|
561
|
-
import { getUrl } from "@xyo-network/xl1-protocol-sdk";
|
|
562
|
-
import { Mutex as Mutex3 } from "async-mutex";
|
|
563
|
-
var mutex = new Mutex3();
|
|
564
|
-
var singleton;
|
|
565
|
-
var initRemoteChainSubmissionsArchivist = /* @__PURE__ */ __name(async ({ config: config2 }) => {
|
|
566
|
-
return await mutex.runExclusive(async () => {
|
|
567
|
-
if (singleton) return singleton;
|
|
568
|
-
const { host, port } = config2.mempool.enabled ? config2.mempool : config2.api;
|
|
569
|
-
const nodeUrl = getUrl(host, port);
|
|
570
|
-
const bridge = await initBridge(nodeUrl);
|
|
571
|
-
singleton = await initBridgedArchivistModule({
|
|
572
|
-
bridge,
|
|
573
|
-
moduleName: "XYOChain:Chain:Submissions"
|
|
574
|
-
});
|
|
575
|
-
return assertEx3(singleton, () => new Error("Failed to initialize RemoteChainSubmissionsArchivist"));
|
|
576
|
-
});
|
|
577
|
-
}, "initRemoteChainSubmissionsArchivist");
|
|
578
|
-
|
|
579
|
-
// src/orchestration/archivists/ChainSubmissions/archivist.ts
|
|
580
|
-
var mutex2 = new Mutex4();
|
|
581
|
-
var singleton2;
|
|
582
|
-
var initChainSubmissionsArchivist = /* @__PURE__ */ __name(async (params) => {
|
|
583
|
-
return await mutex2.runExclusive(async () => {
|
|
584
|
-
if (singleton2) return singleton2;
|
|
585
|
-
return await timeBudget("initChainSubmissionsArchivist", params.logger, async () => {
|
|
586
|
-
const remote = await startupSpanAsync("ChainSubmissionsArchivist:initRemote", () => initRemoteChainSubmissionsArchivist(params));
|
|
587
|
-
singleton2 = remote;
|
|
588
|
-
return assertEx4(singleton2, () => new Error("Failed to initialize ChainSubmissionsArchivist"));
|
|
589
|
-
}, 2e3, true);
|
|
590
|
-
});
|
|
591
|
-
}, "initChainSubmissionsArchivist");
|
|
592
|
-
|
|
593
|
-
// src/orchestration/archivists/PendingTransactions/archivist.ts
|
|
594
|
-
import { initArchivistSync } from "@xyo-network/chain-orchestration";
|
|
595
|
-
import { startupSpanAsync as startupSpanAsync2 } from "@xyo-network/chain-utils";
|
|
596
|
-
import { timeBudget as timeBudget2 } from "@xyo-network/xl1-protocol-sdk";
|
|
597
|
-
import { Mutex as Mutex7 } from "async-mutex";
|
|
598
|
-
|
|
599
|
-
// src/orchestration/archivists/PendingTransactions/local.ts
|
|
600
|
-
import { MemoryArchivist, MemoryArchivistConfigSchema } from "@xyo-network/archivist-memory";
|
|
601
|
-
import { Mutex as Mutex5 } from "async-mutex";
|
|
602
|
-
var mutex3 = new Mutex5();
|
|
603
|
-
var singleton3;
|
|
604
|
-
var initLocalPendingTransactionsArchivist = /* @__PURE__ */ __name(async () => {
|
|
605
|
-
return await mutex3.runExclusive(async () => {
|
|
606
|
-
if (singleton3) return singleton3;
|
|
607
|
-
singleton3 = await MemoryArchivist.create({
|
|
608
|
-
account: "random",
|
|
609
|
-
config: {
|
|
610
|
-
schema: MemoryArchivistConfigSchema,
|
|
611
|
-
max: 1e3,
|
|
612
|
-
name: "localPendingTransactions"
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
return singleton3;
|
|
616
|
-
});
|
|
617
|
-
}, "initLocalPendingTransactionsArchivist");
|
|
618
|
-
|
|
619
|
-
// src/orchestration/archivists/PendingTransactions/remote.ts
|
|
620
|
-
import { assertEx as assertEx5 } from "@xylabs/sdk-js";
|
|
621
|
-
import { initBridge as initBridge2, initBridgedArchivistModule as initBridgedArchivistModule2 } from "@xyo-network/chain-orchestration";
|
|
622
|
-
import { getUrl as getUrl2 } from "@xyo-network/xl1-protocol-sdk";
|
|
623
|
-
import { Mutex as Mutex6 } from "async-mutex";
|
|
624
|
-
var mutex4 = new Mutex6();
|
|
625
|
-
var singleton4;
|
|
626
|
-
var initRemotePendingTransactionsArchivist = /* @__PURE__ */ __name(async ({ config: config2 }) => {
|
|
627
|
-
return await mutex4.runExclusive(async () => {
|
|
628
|
-
if (singleton4) return singleton4;
|
|
629
|
-
const { host, port } = config2.mempool.enabled ? config2.mempool : config2.api;
|
|
630
|
-
const nodeUrl = getUrl2(host, port);
|
|
631
|
-
const bridge = await initBridge2(nodeUrl);
|
|
632
|
-
singleton4 = await initBridgedArchivistModule2({
|
|
633
|
-
bridge,
|
|
634
|
-
moduleName: "XYOChain:Pending:PendingTransactions"
|
|
635
|
-
});
|
|
636
|
-
return assertEx5(singleton4, () => "RemotePendingBundledTransactionsArchivist is undefined");
|
|
637
|
-
});
|
|
638
|
-
}, "initRemotePendingTransactionsArchivist");
|
|
639
|
-
|
|
640
|
-
// src/orchestration/archivists/PendingTransactions/archivist.ts
|
|
641
|
-
var mutex5 = new Mutex7();
|
|
642
|
-
var singleton5;
|
|
643
|
-
var initPendingBundledTransactionsArchivist = /* @__PURE__ */ __name(async ({ config: config2, logger }) => {
|
|
644
|
-
return await mutex5.runExclusive(async () => {
|
|
645
|
-
if (singleton5) return singleton5;
|
|
646
|
-
return await timeBudget2("initPendingBundledTransactionsArchivist", logger, async () => {
|
|
647
|
-
const remote = await startupSpanAsync2("PendingBundledTransactionsArchivist:initRemote", () => initRemotePendingTransactionsArchivist({
|
|
648
|
-
config: config2,
|
|
649
|
-
logger
|
|
650
|
-
}));
|
|
651
|
-
const local = await startupSpanAsync2("PendingBundledTransactionsArchivist:initLocal", () => initLocalPendingTransactionsArchivist({
|
|
652
|
-
config: config2,
|
|
653
|
-
logger
|
|
654
|
-
}));
|
|
655
|
-
const start2 = await remote.next({
|
|
656
|
-
limit: 1,
|
|
657
|
-
order: "desc"
|
|
658
|
-
});
|
|
659
|
-
await local.insert(start2);
|
|
660
|
-
await startupSpanAsync2("PendingBundledTransactionsArchivist:initArchivistSync", () => initArchivistSync("PendingBundledTransactionsArchivist", remote, local));
|
|
661
|
-
singleton5 = [
|
|
662
|
-
local,
|
|
663
|
-
remote
|
|
664
|
-
];
|
|
665
|
-
return singleton5;
|
|
666
|
-
}, 2e3, true);
|
|
667
|
-
});
|
|
668
|
-
}, "initPendingBundledTransactionsArchivist");
|
|
669
|
-
|
|
670
|
-
// src/orchestration/archivists/RejectedTransactions/archivist.ts
|
|
671
|
-
import { startupSpanAsync as startupSpanAsync3 } from "@xyo-network/chain-utils";
|
|
672
|
-
import { timeBudget as timeBudget3 } from "@xyo-network/xl1-protocol-sdk";
|
|
673
|
-
import { Mutex as Mutex9 } from "async-mutex";
|
|
674
|
-
|
|
675
|
-
// src/orchestration/archivists/RejectedTransactions/local.ts
|
|
676
|
-
import { MemoryArchivist as MemoryArchivist2, MemoryArchivistConfigSchema as MemoryArchivistConfigSchema2 } from "@xyo-network/archivist-memory";
|
|
677
|
-
import { Mutex as Mutex8 } from "async-mutex";
|
|
678
|
-
var mutex6 = new Mutex8();
|
|
679
|
-
var singleton6;
|
|
680
|
-
var initLocalRejectedTransactionsArchivist = /* @__PURE__ */ __name(async () => {
|
|
681
|
-
return await mutex6.runExclusive(async () => {
|
|
682
|
-
if (singleton6) return singleton6;
|
|
683
|
-
singleton6 = await MemoryArchivist2.create({
|
|
684
|
-
account: "random",
|
|
685
|
-
config: {
|
|
686
|
-
schema: MemoryArchivistConfigSchema2,
|
|
687
|
-
max: 1e3,
|
|
688
|
-
name: "localRejectedTransactions"
|
|
689
|
-
}
|
|
690
|
-
});
|
|
691
|
-
return singleton6;
|
|
692
|
-
});
|
|
693
|
-
}, "initLocalRejectedTransactionsArchivist");
|
|
694
|
-
|
|
695
|
-
// src/orchestration/archivists/RejectedTransactions/archivist.ts
|
|
696
|
-
var mutex7 = new Mutex9();
|
|
697
|
-
var singleton7;
|
|
698
|
-
async function initRejectedTransactionsArchivist(params) {
|
|
699
|
-
return await mutex7.runExclusive(async () => {
|
|
700
|
-
if (singleton7) return singleton7;
|
|
701
|
-
return await timeBudget3("initRejectedTransactionsArchivist", params.logger, async () => {
|
|
702
|
-
const local = await startupSpanAsync3("RejectedTransactionsArchivist:initLocal", () => initLocalRejectedTransactionsArchivist(params));
|
|
703
|
-
singleton7 = local;
|
|
704
|
-
return singleton7;
|
|
705
|
-
}, 2e3, true);
|
|
706
|
-
});
|
|
707
|
-
}
|
|
708
|
-
__name(initRejectedTransactionsArchivist, "initRejectedTransactionsArchivist");
|
|
709
|
-
|
|
710
|
-
// src/orchestration/archivists/StakeIntentState/archivist.ts
|
|
711
|
-
import { assertEx as assertEx7 } from "@xylabs/sdk-js";
|
|
712
|
-
import { startupSpanAsync as startupSpanAsync4 } from "@xyo-network/chain-utils";
|
|
713
|
-
import { timeBudget as timeBudget4 } from "@xyo-network/xl1-protocol-sdk";
|
|
714
|
-
import { Mutex as Mutex11 } from "async-mutex";
|
|
715
|
-
|
|
716
|
-
// src/orchestration/archivists/StakeIntentState/local.ts
|
|
717
|
-
import { assertEx as assertEx6 } from "@xylabs/sdk-js";
|
|
718
|
-
import { Mutex as Mutex10 } from "async-mutex";
|
|
719
|
-
var mutex8 = new Mutex10();
|
|
720
|
-
var singleton8;
|
|
721
|
-
var initLocalStakeIntentStateArchivist = /* @__PURE__ */ __name(async ({ config: config2 }) => {
|
|
722
|
-
return await mutex8.runExclusive(async () => {
|
|
723
|
-
if (singleton8) return singleton8;
|
|
724
|
-
const { root } = config2.storage;
|
|
725
|
-
singleton8 = await getLocalPersistentArchivist("local-stake-intent-state", "stakeIntent", "state", root);
|
|
726
|
-
return assertEx6(singleton8, () => new Error("Failed to initialize stake intent state archivist"));
|
|
727
|
-
});
|
|
728
|
-
}, "initLocalStakeIntentStateArchivist");
|
|
729
|
-
|
|
730
|
-
// src/orchestration/archivists/StakeIntentState/archivist.ts
|
|
731
|
-
var mutex9 = new Mutex11();
|
|
732
|
-
var singleton9;
|
|
733
|
-
var initStakeIntentStateArchivist = /* @__PURE__ */ __name(async (params) => {
|
|
734
|
-
return await mutex9.runExclusive(async () => {
|
|
735
|
-
if (singleton9) return singleton9;
|
|
736
|
-
return await timeBudget4("initStakeIntentStateArchivist", params.logger, async () => {
|
|
737
|
-
const local = await startupSpanAsync4("StakeIntentStateArchivist:initLocal", () => initLocalStakeIntentStateArchivist(params));
|
|
738
|
-
singleton9 = local;
|
|
739
|
-
return assertEx7(singleton9, () => "StakeIntentStateArchivist is undefined");
|
|
740
|
-
}, 2e3, true);
|
|
741
|
-
});
|
|
742
|
-
}, "initStakeIntentStateArchivist");
|
|
743
|
-
|
|
744
|
-
// src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
|
|
745
|
-
import { isDefined as isDefined4 } from "@xylabs/sdk-js";
|
|
746
|
-
import { startupSpanAsync as startupSpanAsync5 } from "@xyo-network/chain-utils";
|
|
747
|
-
import { timeBudget as timeBudget5 } from "@xyo-network/xl1-protocol-sdk";
|
|
748
|
-
import { Mutex as Mutex13 } from "async-mutex";
|
|
749
|
-
|
|
750
|
-
// src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts
|
|
751
|
-
import { isDefined as isDefined3 } from "@xylabs/sdk-js";
|
|
752
|
-
import { getLocalPersistentMap } from "@xyo-network/chain-protocol";
|
|
753
|
-
import { Mutex as Mutex12 } from "async-mutex";
|
|
754
|
-
var mutex10 = new Mutex12();
|
|
755
|
-
var singleton10;
|
|
756
|
-
var initLocalBalanceSummaryMap = /* @__PURE__ */ __name(async (params) => {
|
|
757
|
-
return await mutex10.runExclusive(async () => {
|
|
758
|
-
if (isDefined3(singleton10)) return singleton10;
|
|
759
|
-
const { root } = params.config.storage;
|
|
760
|
-
singleton10 = await getLocalPersistentMap("balance", "summary", root);
|
|
761
|
-
return singleton10;
|
|
762
|
-
});
|
|
763
|
-
}, "initLocalBalanceSummaryMap");
|
|
764
|
-
|
|
765
|
-
// src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
|
|
766
|
-
var mutex11 = new Mutex13();
|
|
767
|
-
var singleton11;
|
|
768
|
-
async function initBalanceSummaryMap(params) {
|
|
769
|
-
return await mutex11.runExclusive(async () => {
|
|
770
|
-
if (isDefined4(singleton11)) return singleton11;
|
|
771
|
-
return await timeBudget5("initBalanceSummaryMap", params.logger, async () => {
|
|
772
|
-
const local = await startupSpanAsync5("BalanceSummaryMap:initLocal", () => initLocalBalanceSummaryMap(params));
|
|
773
|
-
singleton11 = local;
|
|
774
|
-
return singleton11;
|
|
775
|
-
}, 2e3, true);
|
|
776
|
-
});
|
|
777
|
-
}
|
|
778
|
-
__name(initBalanceSummaryMap, "initBalanceSummaryMap");
|
|
779
|
-
|
|
780
|
-
// src/orchestration/map/BalanceSummary/initTransferSummaryMap.ts
|
|
781
|
-
import { isDefined as isDefined6 } from "@xylabs/sdk-js";
|
|
782
|
-
import { startupSpanAsync as startupSpanAsync6 } from "@xyo-network/chain-utils";
|
|
783
|
-
import { timeBudget as timeBudget6 } from "@xyo-network/xl1-protocol-sdk";
|
|
784
|
-
import { Mutex as Mutex15 } from "async-mutex";
|
|
785
|
-
|
|
786
|
-
// src/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.ts
|
|
787
|
-
import { isDefined as isDefined5 } from "@xylabs/sdk-js";
|
|
788
|
-
import { getLocalPersistentMap as getLocalPersistentMap2 } from "@xyo-network/chain-protocol";
|
|
789
|
-
import { Mutex as Mutex14 } from "async-mutex";
|
|
790
|
-
var mutex12 = new Mutex14();
|
|
791
|
-
var singleton12;
|
|
792
|
-
var initLocalTransferSummaryMap = /* @__PURE__ */ __name(async (params) => {
|
|
793
|
-
return await mutex12.runExclusive(async () => {
|
|
794
|
-
if (isDefined5(singleton12)) return singleton12;
|
|
795
|
-
const { root } = params.config.storage;
|
|
796
|
-
singleton12 = await getLocalPersistentMap2("transfer", "summary", root);
|
|
797
|
-
return singleton12;
|
|
798
|
-
});
|
|
799
|
-
}, "initLocalTransferSummaryMap");
|
|
800
|
-
|
|
801
|
-
// src/orchestration/map/BalanceSummary/initTransferSummaryMap.ts
|
|
802
|
-
var mutex13 = new Mutex15();
|
|
803
|
-
var singleton13;
|
|
804
|
-
async function initTransferSummaryMap(params) {
|
|
805
|
-
return await mutex13.runExclusive(async () => {
|
|
806
|
-
if (isDefined6(singleton13)) return singleton13;
|
|
807
|
-
return await timeBudget6("initTransferSummaryMap:Init", params.logger, async () => {
|
|
808
|
-
const local = await startupSpanAsync6("TransferSummaryMap:initLocal", () => initLocalTransferSummaryMap(params));
|
|
809
|
-
singleton13 = local;
|
|
810
|
-
return singleton13;
|
|
811
|
-
}, 2e3, true);
|
|
812
|
-
});
|
|
813
|
-
}
|
|
814
|
-
__name(initTransferSummaryMap, "initTransferSummaryMap");
|
|
815
|
-
|
|
816
|
-
// src/orchestration/services/implementation/accountBalance.ts
|
|
817
|
-
import { isDefined as isDefined7 } from "@xylabs/sdk-js";
|
|
818
|
-
import { AccountBalanceViewerRpcSchemas, HttpRpcTransport, JsonRpcAccountBalanceViewer } from "@xyo-network/xl1-rpc";
|
|
819
|
-
var balanceServiceSingleton;
|
|
820
|
-
var initAccountBalanceService = /* @__PURE__ */ __name((params) => {
|
|
821
|
-
const { config: config2, logger } = params;
|
|
822
|
-
if (balanceServiceSingleton) return balanceServiceSingleton;
|
|
823
|
-
const endpoint = config2.services?.accountBalanceViewerEndpoint ?? config2.services?.apiEndpoint;
|
|
824
|
-
if (isDefined7(endpoint)) {
|
|
825
|
-
const transport = new HttpRpcTransport(endpoint, {
|
|
826
|
-
...AccountBalanceViewerRpcSchemas
|
|
827
|
-
});
|
|
828
|
-
const viewer = new JsonRpcAccountBalanceViewer(transport);
|
|
829
|
-
logger?.log("Using AccountBalanceViewer RPC service at", endpoint);
|
|
830
|
-
return viewer;
|
|
831
|
-
} else {
|
|
832
|
-
throw new Error("No AccountBalanceViewer endpoint configured");
|
|
833
|
-
}
|
|
834
|
-
}, "initAccountBalanceService");
|
|
835
|
-
|
|
836
|
-
// src/orchestration/services/implementation/blockViewer.ts
|
|
837
|
-
import { isDefined as isDefined8 } from "@xylabs/sdk-js";
|
|
838
|
-
import { BlockViewerRpcSchemas, HttpRpcTransport as HttpRpcTransport2, JsonRpcBlockViewer } from "@xyo-network/xl1-rpc";
|
|
839
|
-
var blockViewerSingleton;
|
|
840
|
-
var initBlockViewer = /* @__PURE__ */ __name((params) => {
|
|
841
|
-
const { config: config2, logger } = params;
|
|
842
|
-
if (blockViewerSingleton) return blockViewerSingleton;
|
|
843
|
-
const endpoint = config2.services?.apiEndpoint;
|
|
844
|
-
if (isDefined8(endpoint)) {
|
|
845
|
-
const transport = new HttpRpcTransport2(endpoint, {
|
|
846
|
-
...BlockViewerRpcSchemas
|
|
847
|
-
});
|
|
848
|
-
const viewer = new JsonRpcBlockViewer(transport);
|
|
849
|
-
logger?.log("Using BlockViewer RPC service at", endpoint);
|
|
850
|
-
return viewer;
|
|
851
|
-
} else {
|
|
852
|
-
throw new Error("No BlockViewer endpoint configured");
|
|
853
|
-
}
|
|
854
|
-
}, "initBlockViewer");
|
|
855
|
-
|
|
856
|
-
// src/orchestration/services/implementation/chain/index.ts
|
|
857
|
-
import { assertEx as assertEx13 } from "@xylabs/sdk-js";
|
|
858
|
-
import { MemoryChainService } from "@xyo-network/chain-services";
|
|
859
|
-
|
|
860
|
-
// src/orchestration/services/implementation/chain/evm.ts
|
|
861
|
-
import { asAddress, assertEx as assertEx12, isDefined as isDefined12, ZERO_ADDRESS } from "@xylabs/sdk-js";
|
|
862
|
-
import { EvmChainService } from "@xyo-network/chain-services";
|
|
863
|
-
import { Wallet } from "ethers/wallet";
|
|
864
|
-
|
|
865
|
-
// src/orchestration/services/implementation/evm/initEvmProvider.ts
|
|
866
|
-
import { assertEx as assertEx11 } from "@xylabs/sdk-js";
|
|
867
|
-
|
|
868
|
-
// src/orchestration/services/implementation/evm/initInfuraProvider.ts
|
|
869
|
-
import { assertEx as assertEx9, isDefined as isDefined10 } from "@xylabs/sdk-js";
|
|
870
|
-
import { InfuraProvider } from "ethers/providers";
|
|
871
|
-
|
|
872
|
-
// src/orchestration/services/implementation/evm/initChainId.ts
|
|
873
|
-
import { assertEx as assertEx8, hexFrom, isDefined as isDefined9, isHex } from "@xylabs/sdk-js";
|
|
874
|
-
var canUseChainId = /* @__PURE__ */ __name((config2) => {
|
|
875
|
-
return isDefined9(config2.evm.chainId);
|
|
876
|
-
}, "canUseChainId");
|
|
877
|
-
var getChainId = /* @__PURE__ */ __name((config2) => {
|
|
878
|
-
const chainId = assertEx8(config2.evm.chainId, () => "Missing config.evm.chainId");
|
|
879
|
-
if (isHex(chainId, {
|
|
880
|
-
prefix: true
|
|
881
|
-
})) {
|
|
882
|
-
const hex = hexFrom(chainId);
|
|
883
|
-
const parsed = Number.parseInt(hex, 16);
|
|
884
|
-
return parsed;
|
|
885
|
-
} else {
|
|
886
|
-
const parsed = Number.parseInt(chainId, 10);
|
|
887
|
-
return parsed;
|
|
888
|
-
}
|
|
889
|
-
}, "getChainId");
|
|
890
|
-
|
|
891
|
-
// src/orchestration/services/implementation/evm/initInfuraProvider.ts
|
|
892
|
-
var instance;
|
|
893
|
-
var initInfuraProvider = /* @__PURE__ */ __name((config2) => {
|
|
894
|
-
if (instance) return instance;
|
|
895
|
-
const providerConfig = getInfuraProviderConfig(config2);
|
|
896
|
-
instance = Promise.resolve(new InfuraProvider(...providerConfig));
|
|
897
|
-
return instance;
|
|
898
|
-
}, "initInfuraProvider");
|
|
899
|
-
var canUseInfuraProvider = /* @__PURE__ */ __name((config2) => {
|
|
900
|
-
return canUseChainId(config2) && isDefined10(config2.evm?.infura?.projectId) && isDefined10(config2.evm?.infura?.projectSecret);
|
|
901
|
-
}, "canUseInfuraProvider");
|
|
902
|
-
var getInfuraProviderConfig = /* @__PURE__ */ __name((config2) => {
|
|
903
|
-
const projectId = assertEx9(config2.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
|
|
904
|
-
const projectSecret = assertEx9(config2.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
|
|
905
|
-
return [
|
|
906
|
-
getChainId(config2),
|
|
907
|
-
projectId,
|
|
908
|
-
projectSecret
|
|
909
|
-
];
|
|
910
|
-
}, "getInfuraProviderConfig");
|
|
911
|
-
|
|
912
|
-
// src/orchestration/services/implementation/evm/initJsonRpcProvider.ts
|
|
913
|
-
import { assertEx as assertEx10, isDefined as isDefined11 } from "@xylabs/sdk-js";
|
|
914
|
-
import { JsonRpcProvider } from "ethers/providers";
|
|
915
|
-
var initJsonRpcProvider = /* @__PURE__ */ __name((config2) => {
|
|
916
|
-
const providerConfig = getJsonRpcProviderConfig(config2);
|
|
917
|
-
return Promise.resolve(new JsonRpcProvider(...providerConfig));
|
|
918
|
-
}, "initJsonRpcProvider");
|
|
919
|
-
var canUseJsonRpcProvider = /* @__PURE__ */ __name((config2) => {
|
|
920
|
-
return canUseChainId(config2) && isDefined11(config2.evm.jsonRpc?.url);
|
|
921
|
-
}, "canUseJsonRpcProvider");
|
|
922
|
-
var getJsonRpcProviderConfig = /* @__PURE__ */ __name((config2) => {
|
|
923
|
-
const jsonRpcUrl = assertEx10(config2.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
|
|
924
|
-
return [
|
|
925
|
-
jsonRpcUrl,
|
|
926
|
-
getChainId(config2)
|
|
927
|
-
];
|
|
928
|
-
}, "getJsonRpcProviderConfig");
|
|
929
|
-
|
|
930
|
-
// src/orchestration/services/implementation/evm/initEvmProvider.ts
|
|
931
|
-
var provider;
|
|
932
|
-
var initEvmProvider = /* @__PURE__ */ __name(async ({ config: config2 }) => {
|
|
933
|
-
if (provider) return provider;
|
|
934
|
-
if (canUseInfuraProvider(config2)) {
|
|
935
|
-
provider = initInfuraProvider(config2);
|
|
936
|
-
} else if (canUseJsonRpcProvider(config2)) {
|
|
937
|
-
provider = initJsonRpcProvider(config2);
|
|
938
|
-
}
|
|
939
|
-
return assertEx11(await provider, () => "No provider available");
|
|
940
|
-
}, "initEvmProvider");
|
|
941
|
-
var canUseEvmProvider = /* @__PURE__ */ __name(({ config: config2 }) => {
|
|
942
|
-
return canUseInfuraProvider(config2) || canUseJsonRpcProvider(config2);
|
|
943
|
-
}, "canUseEvmProvider");
|
|
944
|
-
|
|
945
|
-
// src/orchestration/services/implementation/chain/evm.ts
|
|
946
|
-
var chainStakeServiceSingleton;
|
|
947
|
-
var canUseEvmContractChainService = /* @__PURE__ */ __name((config2) => {
|
|
948
|
-
const { id } = config2.chain;
|
|
949
|
-
return isDefined12(id) && id !== ZERO_ADDRESS && canUseEvmProvider({
|
|
950
|
-
config: config2
|
|
951
|
-
});
|
|
952
|
-
}, "canUseEvmContractChainService");
|
|
953
|
-
var initEvmContractChainService = /* @__PURE__ */ __name(async ({ account, config: config2, traceProvider, meterProvider, logger }) => {
|
|
954
|
-
if (chainStakeServiceSingleton) return chainStakeServiceSingleton;
|
|
955
|
-
const emvStakingContractAddress = assertEx12(config2.chain.id, () => "config.chain.id is required");
|
|
956
|
-
const id = assertEx12(asAddress(emvStakingContractAddress), () => "config.chain.id is not a valid address");
|
|
957
|
-
const provider2 = assertEx12(await initEvmProvider({
|
|
958
|
-
config: config2
|
|
959
|
-
}));
|
|
960
|
-
const privateKey = assertEx12(account.private?.hex, () => "Account does not have a private key");
|
|
961
|
-
const runner = new Wallet(privateKey, provider2);
|
|
962
|
-
chainStakeServiceSingleton = EvmChainService.create({
|
|
963
|
-
id,
|
|
964
|
-
runner,
|
|
965
|
-
traceProvider,
|
|
966
|
-
meterProvider,
|
|
967
|
-
logger
|
|
968
|
-
});
|
|
969
|
-
const result = await chainStakeServiceSingleton;
|
|
970
|
-
await result.start();
|
|
971
|
-
return result;
|
|
972
|
-
}, "initEvmContractChainService");
|
|
973
|
-
|
|
974
|
-
// src/orchestration/services/implementation/chain/index.ts
|
|
975
|
-
var chainStakeServiceSingleton2;
|
|
976
|
-
var initChainService = /* @__PURE__ */ __name(({ account, config: config2, logger }) => {
|
|
977
|
-
logger?.log("ChainService: Initializing...");
|
|
978
|
-
const result = init({
|
|
979
|
-
config: config2,
|
|
980
|
-
name: "ChainService",
|
|
981
|
-
account
|
|
982
|
-
});
|
|
983
|
-
logger?.log("ChainService: Initialized");
|
|
984
|
-
return result;
|
|
985
|
-
}, "initChainService");
|
|
986
|
-
var initMemoryChainService = /* @__PURE__ */ __name(async ({ config: config2 }) => {
|
|
987
|
-
const result = await MemoryChainService.create({
|
|
988
|
-
config: config2,
|
|
989
|
-
name: "MemoryChainService"
|
|
990
|
-
});
|
|
991
|
-
assertEx13(await result.start(), () => "Failed to start MemoryChainService");
|
|
992
|
-
return result;
|
|
993
|
-
}, "initMemoryChainService");
|
|
994
|
-
var init = /* @__PURE__ */ __name(async (params) => {
|
|
995
|
-
if (chainStakeServiceSingleton2) return chainStakeServiceSingleton2;
|
|
996
|
-
const { config: config2 } = params;
|
|
997
|
-
chainStakeServiceSingleton2 = canUseEvmContractChainService(config2) ? await initEvmContractChainService({
|
|
998
|
-
...params,
|
|
999
|
-
name: "ChainStakeService"
|
|
1000
|
-
}) : await initMemoryChainService(params);
|
|
1001
|
-
return chainStakeServiceSingleton2;
|
|
1002
|
-
}, "init");
|
|
1003
|
-
|
|
1004
|
-
// src/orchestration/services/implementation/pendingTransactions.ts
|
|
1005
|
-
import { isDefined as isDefined13 } from "@xylabs/sdk-js";
|
|
1006
|
-
import { BasePendingTransactionsService } from "@xyo-network/chain-services";
|
|
1007
|
-
import { timeBudget as timeBudget7 } from "@xyo-network/xl1-protocol-sdk";
|
|
1008
|
-
import { HttpRpcTransport as HttpRpcTransport3, JsonRpcMempoolViewer, MempoolViewerRpcSchemas } from "@xyo-network/xl1-rpc";
|
|
1009
|
-
var serviceSingleton;
|
|
1010
|
-
var initPendingTransactions = /* @__PURE__ */ __name(async ({ config: config2, params, logger }) => {
|
|
1011
|
-
if (serviceSingleton) return serviceSingleton;
|
|
1012
|
-
return await timeBudget7("initPendingTransactions", logger, async () => {
|
|
1013
|
-
const endpoint = config2.services?.apiEndpoint;
|
|
1014
|
-
if (isDefined13(endpoint)) {
|
|
1015
|
-
const transport = new HttpRpcTransport3(endpoint, {
|
|
1016
|
-
...MempoolViewerRpcSchemas
|
|
1017
|
-
});
|
|
1018
|
-
const viewer = new JsonRpcMempoolViewer(transport);
|
|
1019
|
-
logger?.log("Using MempoolViewer RPC service at", endpoint);
|
|
1020
|
-
return viewer;
|
|
1021
|
-
} else {
|
|
1022
|
-
serviceSingleton = await BasePendingTransactionsService.create(params);
|
|
1023
|
-
}
|
|
1024
|
-
return serviceSingleton;
|
|
1025
|
-
}, 2e3, true);
|
|
1026
|
-
}, "initPendingTransactions");
|
|
1027
|
-
|
|
1028
|
-
// src/orchestration/services/implementation/producer.ts
|
|
1029
|
-
import { BaseBlockProducerService as BaseBlockProducerService2 } from "@xyo-network/chain-services";
|
|
1030
|
-
import { timeBudget as timeBudget8 } from "@xyo-network/xl1-protocol-sdk";
|
|
1031
|
-
var serviceSingleton2;
|
|
1032
|
-
var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
|
|
1033
|
-
if (serviceSingleton2) return serviceSingleton2;
|
|
1034
|
-
return await timeBudget8("initBlockProducer", params.logger, async () => {
|
|
1035
|
-
serviceSingleton2 = await BaseBlockProducerService2.create(params);
|
|
1036
|
-
return serviceSingleton2;
|
|
1037
|
-
}, 2e3, true);
|
|
1038
|
-
}, "initBlockProducer");
|
|
1039
|
-
|
|
1040
|
-
// src/orchestration/services/implementation/reward.ts
|
|
1041
|
-
import { assertEx as assertEx14 } from "@xylabs/sdk-js";
|
|
1042
|
-
import { EvmBlockRewardService, MemoryBlockRewardService } from "@xyo-network/chain-services";
|
|
1043
|
-
import { timeBudget as timeBudget9 } from "@xyo-network/xl1-protocol-sdk";
|
|
1044
|
-
var rewardServiceSingleton;
|
|
1045
|
-
var initBlockRewardService = /* @__PURE__ */ __name((params) => {
|
|
1046
|
-
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1047
|
-
return timeBudget9("initBlockRewardService", params.logger, () => {
|
|
1048
|
-
const { config: config2 } = params;
|
|
1049
|
-
rewardServiceSingleton = canUseEvmBlockRewardService({
|
|
1050
|
-
config: config2
|
|
1051
|
-
}) ? initEvmBlockRewardService(params) : initXyoBlockRewardService(params);
|
|
1052
|
-
return rewardServiceSingleton;
|
|
1053
|
-
}, 2e3, true);
|
|
1054
|
-
}, "initBlockRewardService");
|
|
1055
|
-
var initXyoBlockRewardService = /* @__PURE__ */ __name((params) => {
|
|
1056
|
-
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1057
|
-
return timeBudget9("initXyoBlockRewardService", params.logger, () => {
|
|
1058
|
-
rewardServiceSingleton = MemoryBlockRewardService.create(params);
|
|
1059
|
-
return rewardServiceSingleton;
|
|
1060
|
-
}, 2e3, true);
|
|
1061
|
-
}, "initXyoBlockRewardService");
|
|
1062
|
-
var canUseEvmBlockRewardService = /* @__PURE__ */ __name((params) => canUseEvmProvider({
|
|
1063
|
-
config: params.config
|
|
1064
|
-
}), "canUseEvmBlockRewardService");
|
|
1065
|
-
var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
|
|
1066
|
-
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1067
|
-
return await timeBudget9("initEvmBlockRewardService", params.logger, async () => {
|
|
1068
|
-
const { account: paramsAccount } = params;
|
|
1069
|
-
const account = assertEx14(paramsAccount, () => "Account is required");
|
|
1070
|
-
const provider2 = assertEx14(await initEvmProvider(params));
|
|
1071
|
-
const evmBlockRewardServiceParams = {
|
|
1072
|
-
...params,
|
|
1073
|
-
provider: provider2,
|
|
1074
|
-
account
|
|
1075
|
-
};
|
|
1076
|
-
rewardServiceSingleton = EvmBlockRewardService.create(evmBlockRewardServiceParams);
|
|
1077
|
-
return rewardServiceSingleton;
|
|
1078
|
-
}, 2e3, true);
|
|
1079
|
-
}, "initEvmBlockRewardService");
|
|
1080
|
-
|
|
1081
|
-
// src/orchestration/services/implementation/time.ts
|
|
1082
|
-
import { BaseTimeSyncService } from "@xyo-network/chain-services";
|
|
1083
|
-
import { timeBudget as timeBudget10 } from "@xyo-network/xl1-protocol-sdk";
|
|
1084
|
-
var timeSyncServiceSingleton;
|
|
1085
|
-
var initTimeService = /* @__PURE__ */ __name(async ({ blockViewer, config: config2, logger, meterProvider, traceProvider }) => {
|
|
1086
|
-
if (timeSyncServiceSingleton) return timeSyncServiceSingleton;
|
|
1087
|
-
return await timeBudget10("initTimeService", logger, async () => {
|
|
1088
|
-
const ethProvider = canUseEvmProvider({
|
|
1089
|
-
config: config2
|
|
1090
|
-
}) ? await initEvmProvider({
|
|
1091
|
-
config: config2
|
|
1092
|
-
}) : void 0;
|
|
1093
|
-
timeSyncServiceSingleton = BaseTimeSyncService.create({
|
|
1094
|
-
blockViewer,
|
|
1095
|
-
ethProvider,
|
|
1096
|
-
logger,
|
|
1097
|
-
meterProvider,
|
|
1098
|
-
traceProvider
|
|
1099
|
-
});
|
|
1100
|
-
return await timeSyncServiceSingleton;
|
|
1101
|
-
}, 2e3, true);
|
|
1102
|
-
}, "initTimeService");
|
|
1103
|
-
|
|
1104
|
-
// src/orchestration/status/ServiceStatus.ts
|
|
1105
|
-
var LoggerStatusReporter = class {
|
|
1106
|
-
static {
|
|
1107
|
-
__name(this, "LoggerStatusReporter");
|
|
1108
|
-
}
|
|
1109
|
-
logger;
|
|
1110
|
-
statusMap = {};
|
|
1111
|
-
constructor(logger) {
|
|
1112
|
-
this.logger = logger;
|
|
1113
|
-
}
|
|
1114
|
-
report(name, status, progress) {
|
|
1115
|
-
this.statusMap[name] = status;
|
|
1116
|
-
const starting = Object.entries(this.statusMap).map(([, value]) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
1117
|
-
const started = Object.entries(this.statusMap).map(([, value]) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
|
|
1118
|
-
this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, {
|
|
1119
|
-
progress
|
|
1120
|
-
});
|
|
1121
|
-
}
|
|
1122
|
-
};
|
|
1123
|
-
|
|
1124
|
-
// src/orchestration/status/RuntimeStatusMonitor.ts
|
|
1125
|
-
var statusPriority = {
|
|
1126
|
-
error: 0,
|
|
1127
|
-
stopped: 1,
|
|
1128
|
-
stopping: 2,
|
|
1129
|
-
creating: 3,
|
|
1130
|
-
created: 4,
|
|
1131
|
-
starting: 5,
|
|
1132
|
-
started: 6
|
|
1133
|
-
};
|
|
1134
|
-
var SENTINEL_STATUS = "starting";
|
|
1135
|
-
var reduceToMinimumStatus = /* @__PURE__ */ __name((statuses) => {
|
|
1136
|
-
let minStatus = SENTINEL_STATUS;
|
|
1137
|
-
let minPriority = Infinity;
|
|
1138
|
-
for (const status of statuses) {
|
|
1139
|
-
const priority = statusPriority[status];
|
|
1140
|
-
if (priority < minPriority) {
|
|
1141
|
-
minPriority = priority;
|
|
1142
|
-
minStatus = status;
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
return minStatus;
|
|
1146
|
-
}, "reduceToMinimumStatus");
|
|
1147
|
-
var RuntimeStatusMonitor = class extends LoggerStatusReporter {
|
|
1148
|
-
static {
|
|
1149
|
-
__name(this, "RuntimeStatusMonitor");
|
|
1150
|
-
}
|
|
1151
|
-
globalTransitions = [];
|
|
1152
|
-
transitions = [];
|
|
1153
|
-
getGlobalStatus() {
|
|
1154
|
-
if (Object.keys(this.statusMap).length === 0) return SENTINEL_STATUS;
|
|
1155
|
-
return reduceToMinimumStatus(Object.values(this.statusMap));
|
|
1156
|
-
}
|
|
1157
|
-
getStatus(name) {
|
|
1158
|
-
return this.statusMap[name];
|
|
1159
|
-
}
|
|
1160
|
-
onGlobalTransition(match, handler) {
|
|
1161
|
-
this.globalTransitions.push({
|
|
1162
|
-
...match,
|
|
1163
|
-
handler
|
|
1164
|
-
});
|
|
1165
|
-
}
|
|
1166
|
-
/**
|
|
1167
|
-
* Register a callback to be called on a specific transition.
|
|
1168
|
-
*/
|
|
1169
|
-
onTransition(match, handler) {
|
|
1170
|
-
this.transitions.push({
|
|
1171
|
-
...match,
|
|
1172
|
-
handler
|
|
1173
|
-
});
|
|
1174
|
-
}
|
|
1175
|
-
report(name, status, progress) {
|
|
1176
|
-
const previous = this.statusMap[name];
|
|
1177
|
-
const previousGlobal = this.getGlobalStatus();
|
|
1178
|
-
super.report(name, status, progress);
|
|
1179
|
-
if (previous === status) return;
|
|
1180
|
-
this.runTransitions(this.transitions, previous, status, name);
|
|
1181
|
-
const globalStatus = this.getGlobalStatus();
|
|
1182
|
-
if (previousGlobal === globalStatus) return;
|
|
1183
|
-
this.runTransitions(this.globalTransitions, previousGlobal, globalStatus);
|
|
1184
|
-
}
|
|
1185
|
-
runTransitions(transitions, prev, next, name) {
|
|
1186
|
-
for (const { from, to, name: matchName, handler } of transitions) {
|
|
1187
|
-
if ((matchName === void 0 || matchName === name) && (from === void 0 || from === prev) && (to === void 0 || to === next)) {
|
|
1188
|
-
handler(prev, next);
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
}
|
|
1192
|
-
};
|
|
1193
|
-
|
|
1194
|
-
// src/orchestration/initServices.ts
|
|
1195
|
-
var isStartable = /* @__PURE__ */ __name((value) => {
|
|
1196
|
-
const possibleStartable = value;
|
|
1197
|
-
return isDefined14(possibleStartable.start) && typeof possibleStartable.start === "function" && possibleStartable.status === "created";
|
|
1198
|
-
}, "isStartable");
|
|
1199
|
-
var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
1200
|
-
const { config: config2, logger } = context;
|
|
1201
|
-
const statusReporter = new RuntimeStatusMonitor(logger);
|
|
1202
|
-
statusReporter.onGlobalTransition({
|
|
1203
|
-
to: "started"
|
|
1204
|
-
}, () => {
|
|
1205
|
-
logger.log("All services started.");
|
|
1206
|
-
});
|
|
1207
|
-
statusReporter.onGlobalTransition({
|
|
1208
|
-
to: "error"
|
|
1209
|
-
}, () => {
|
|
1210
|
-
logger.error("Producer encountered an unhandled error!");
|
|
1211
|
-
process.exit(1);
|
|
1212
|
-
});
|
|
1213
|
-
await startupSpanAsync7("initHealthEndpoints", () => initHealthEndpoints({
|
|
1214
|
-
...context,
|
|
1215
|
-
statusReporter
|
|
1216
|
-
}));
|
|
1217
|
-
const { otlpEndpoint } = config2.telemetry?.otel ?? {};
|
|
1218
|
-
const { path: endpoint = "/metrics", port = 9464 } = config2.telemetry?.metrics?.scrape ?? {};
|
|
1219
|
-
const telemetryConfig = {
|
|
1220
|
-
attributes: {
|
|
1221
|
-
serviceName: "xl1-producer",
|
|
1222
|
-
serviceVersion: "1.0.0"
|
|
1223
|
-
},
|
|
1224
|
-
otlpEndpoint,
|
|
1225
|
-
metricsConfig: {
|
|
1226
|
-
endpoint,
|
|
1227
|
-
port
|
|
1228
|
-
}
|
|
1229
|
-
};
|
|
1230
|
-
const [{ traceProvider, meterProvider }, account] = await Promise.all([
|
|
1231
|
-
startupSpanAsync7("initTelemetry", () => initTelemetry(telemetryConfig)),
|
|
1232
|
-
startupSpanAsync7("initProducerAccount", () => initProducerAccount(context))
|
|
1233
|
-
]);
|
|
1234
|
-
const allowedRewardRedeemers = config2.validation?.allowedRewardRedeemers ?? [];
|
|
1235
|
-
const allowedRewardEscrowAccountSigners = config2.validation?.allowedRewardEscrowAccountSigners ?? [];
|
|
1236
|
-
const baseParamsFields = {
|
|
1237
|
-
logger,
|
|
1238
|
-
meterProvider,
|
|
1239
|
-
traceProvider
|
|
1240
|
-
};
|
|
1241
|
-
const initParams = {
|
|
1242
|
-
config: config2,
|
|
1243
|
-
logger,
|
|
1244
|
-
meterProvider,
|
|
1245
|
-
statusReporter,
|
|
1246
|
-
traceProvider
|
|
1247
|
-
};
|
|
1248
|
-
const [[pendingBundledTransactionsArchivist, pendingBundledTransactionsArchivistWrite], rejectedTransactionsArchivist, chainSubmissionsArchivistWrite, stakeIntentStateArchivist, chainService, balanceSummaryMap] = await Promise.all([
|
|
1249
|
-
startupSpanAsync7("PendingBundledTransactionsArchivist", () => initPendingBundledTransactionsArchivist(initParams)),
|
|
1250
|
-
startupSpanAsync7("RejectedTransactionsArchivist", () => initRejectedTransactionsArchivist(initParams)),
|
|
1251
|
-
startupSpanAsync7("ChainSubmissionsArchivist", () => initChainSubmissionsArchivist(initParams)),
|
|
1252
|
-
startupSpanAsync7("StakeIntentStateArchivist", () => initStakeIntentStateArchivist(initParams)),
|
|
1253
|
-
startupSpanAsync7("ChainService", () => initChainService({
|
|
1254
|
-
...initParams,
|
|
1255
|
-
account,
|
|
1256
|
-
name: "ChainService"
|
|
1257
|
-
})),
|
|
1258
|
-
startupSpanAsync7("BalanceSummaryMap", () => initBalanceSummaryMap(initParams)),
|
|
1259
|
-
startupSpanAsync7("TransferSummaryMap", () => initTransferSummaryMap(initParams))
|
|
1260
|
-
]);
|
|
1261
|
-
const chainId = await chainService.chainId();
|
|
1262
|
-
const chainContractViewer = chainService;
|
|
1263
|
-
const chainStakeViewer = chainService;
|
|
1264
|
-
const chainStaker = chainService;
|
|
1265
|
-
const additionalPendingTransactionValidators = [
|
|
1266
|
-
TransactionTransfersValidatorFactory([
|
|
1267
|
-
SelfSignerValidator,
|
|
1268
|
-
CompletedStepRewardAddressValidatorFactory(allowedRewardRedeemers),
|
|
1269
|
-
DerivedReceiveAddressValidatorFactory(allowedRewardEscrowAccountSigners, "reward-escrow")
|
|
1270
|
-
])
|
|
1271
|
-
];
|
|
1272
|
-
const [pendingTransactionsService, rewardService] = await Promise.all([
|
|
1273
|
-
startupSpanAsync7("PendingTransactions", () => initPendingTransactions({
|
|
1274
|
-
config: config2,
|
|
1275
|
-
params: {
|
|
1276
|
-
name: "PendingTransactionsService",
|
|
1277
|
-
chainId,
|
|
1278
|
-
pendingBundledTransactionsArchivist,
|
|
1279
|
-
rejectedTransactionsArchivist,
|
|
1280
|
-
additionalPendingTransactionValidators,
|
|
1281
|
-
...initParams
|
|
1282
|
-
}
|
|
1283
|
-
})),
|
|
1284
|
-
startupSpanAsync7("RewardService", () => initBlockRewardService({
|
|
1285
|
-
name: "RewardService",
|
|
1286
|
-
account,
|
|
1287
|
-
chainService,
|
|
1288
|
-
...initParams
|
|
1289
|
-
}))
|
|
1290
|
-
]);
|
|
1291
|
-
const blockViewer = await startupSpanAsync7("BlockViewer", () => initBlockViewer({
|
|
1292
|
-
...initParams
|
|
1293
|
-
}));
|
|
1294
|
-
const balanceService = await startupSpanAsync7("BalanceService", () => initAccountBalanceService({
|
|
1295
|
-
...initParams
|
|
1296
|
-
}));
|
|
1297
|
-
const [stakeIntentService, time] = await Promise.all([
|
|
1298
|
-
startupSpanAsync7("StakeIntentService", () => initStakeIntentService({
|
|
1299
|
-
name: "StakeIntentService",
|
|
1300
|
-
blockViewer,
|
|
1301
|
-
chainStakeViewer,
|
|
1302
|
-
stakeIntentStateArchivist,
|
|
1303
|
-
...initParams
|
|
1304
|
-
})),
|
|
1305
|
-
startupSpanAsync7("TimeService", () => initTimeService({
|
|
1306
|
-
name: "TimeService",
|
|
1307
|
-
blockViewer,
|
|
1308
|
-
...initParams
|
|
1309
|
-
}))
|
|
1310
|
-
]);
|
|
1311
|
-
const electionService = await startupSpanAsync7("ElectionService", () => initElectionService({
|
|
1312
|
-
name: "ElectionService",
|
|
1313
|
-
blockViewer,
|
|
1314
|
-
chainStakeViewer,
|
|
1315
|
-
stakeIntentService,
|
|
1316
|
-
...initParams
|
|
1317
|
-
}));
|
|
1318
|
-
const validatorParams = {
|
|
1319
|
-
name: "Validator",
|
|
1320
|
-
account,
|
|
1321
|
-
chainId,
|
|
1322
|
-
pendingBundledTransactionsArchivist,
|
|
1323
|
-
blockViewer,
|
|
1324
|
-
electionService,
|
|
1325
|
-
rewardService,
|
|
1326
|
-
stakeIntentService,
|
|
1327
|
-
validateHydratedBlockState,
|
|
1328
|
-
...initParams
|
|
1329
|
-
};
|
|
1330
|
-
const rewardAddress = isDefined14(config2.producer.rewardAddress) ? assertEx15(asAddress2(config2.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
|
|
1331
|
-
const producerParams = {
|
|
1332
|
-
...validatorParams,
|
|
1333
|
-
name: "Producer",
|
|
1334
|
-
balanceService,
|
|
1335
|
-
blockViewer,
|
|
1336
|
-
pendingBundledTransactionsArchivist,
|
|
1337
|
-
pendingTransactionsService,
|
|
1338
|
-
rejectedTransactionsArchivist,
|
|
1339
|
-
rewardAddress,
|
|
1340
|
-
time,
|
|
1341
|
-
...initParams
|
|
1342
|
-
};
|
|
1343
|
-
const producer = await startupSpanAsync7("Producer", () => initBlockProducer(producerParams));
|
|
1344
|
-
const services = {
|
|
1345
|
-
account,
|
|
1346
|
-
balance: balanceService,
|
|
1347
|
-
chainContractViewer,
|
|
1348
|
-
blockViewer,
|
|
1349
|
-
chainStaker,
|
|
1350
|
-
chainStakeViewer,
|
|
1351
|
-
chainSubmissionsArchivistWrite,
|
|
1352
|
-
election: electionService,
|
|
1353
|
-
pendingBundledTransactionsArchivistWrite,
|
|
1354
|
-
pendingTransactions: pendingTransactionsService,
|
|
1355
|
-
producer,
|
|
1356
|
-
reward: rewardService,
|
|
1357
|
-
stakeIntent: stakeIntentService
|
|
1358
|
-
};
|
|
1359
|
-
logger?.log("All services created. Starting...");
|
|
1360
|
-
const startableServices = [
|
|
1361
|
-
balanceSummaryMap,
|
|
1362
|
-
...Object.values(services)
|
|
1363
|
-
].filter(isStartable);
|
|
1364
|
-
assertEx15((await Promise.all(startableServices.map((service) => service.start()))).every(Boolean), () => "One or more services failed to start");
|
|
1365
|
-
logger?.log("All services started successfully.");
|
|
1366
|
-
return {
|
|
1367
|
-
...services,
|
|
1368
|
-
...baseParamsFields
|
|
1369
|
-
};
|
|
1370
|
-
}, "initServices");
|
|
1371
|
-
|
|
1372
|
-
// src/commands/producer/runProducer.ts
|
|
1373
|
-
var runProducer = /* @__PURE__ */ __name(async (context) => {
|
|
1374
|
-
const { config: config2, logger, orchestrator } = context;
|
|
1375
|
-
logger?.log("Services: Initializing...");
|
|
1376
|
-
const services = await initServices(context);
|
|
1377
|
-
logger?.log("Services: Initialized");
|
|
1378
|
-
const params = {
|
|
1379
|
-
...services,
|
|
1380
|
-
config: config2
|
|
1381
|
-
};
|
|
1382
|
-
const apiEndpoint = config2.services.apiEndpoint;
|
|
1383
|
-
const balances = isDefined15(apiEndpoint) ? void 0 : await BalanceActor.create({
|
|
1384
|
-
...params,
|
|
1385
|
-
name: "BalanceActor"
|
|
1386
|
-
});
|
|
1387
|
-
const producer = await ProducerActor.create({
|
|
1388
|
-
...params,
|
|
1389
|
-
name: "ProducerActor"
|
|
1390
|
-
});
|
|
1391
|
-
const actors = [
|
|
1392
|
-
balances,
|
|
1393
|
-
producer
|
|
1394
|
-
].filter(exists);
|
|
1395
|
-
for (const actor of actors) {
|
|
1396
|
-
await orchestrator.registerActor(actor);
|
|
1397
|
-
}
|
|
1398
|
-
await orchestrator.start();
|
|
1399
|
-
}, "runProducer");
|
|
1400
|
-
|
|
1401
37
|
// src/commands/rewardRedemption/runRewardRedemptionApi.ts
|
|
1402
38
|
import { getServer as getServer4 } from "@xyo-network/chain-reward-redemption";
|
|
1403
39
|
function runRewardRedemptionApi(context) {
|
|
@@ -1426,20 +62,20 @@ var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\
|
|
|
1426
62
|
\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\x1B[0m\x1B[38;2;108;93;162m\xB2\x1B[0m\x1B[38;2;99;79;176m^\x1B[0m`;
|
|
1427
63
|
|
|
1428
64
|
// src/initLogger.ts
|
|
1429
|
-
import { Base
|
|
65
|
+
import { Base, ConsoleLogger, isDefined, LogLevel, SilentLogger } from "@xylabs/sdk-js";
|
|
1430
66
|
var initLogger = /* @__PURE__ */ __name((config2) => {
|
|
1431
67
|
let logger;
|
|
1432
68
|
if (config2.silent) {
|
|
1433
69
|
logger = new SilentLogger();
|
|
1434
70
|
} else {
|
|
1435
71
|
let level;
|
|
1436
|
-
if (
|
|
72
|
+
if (isDefined(config2.logLevel)) {
|
|
1437
73
|
const parsed = LogLevel[config2.logLevel.toLowerCase()];
|
|
1438
|
-
if (
|
|
74
|
+
if (isDefined(parsed)) level = parsed;
|
|
1439
75
|
}
|
|
1440
76
|
logger = new ConsoleLogger(level);
|
|
1441
77
|
}
|
|
1442
|
-
|
|
78
|
+
Base.defaultLogger = logger;
|
|
1443
79
|
return logger;
|
|
1444
80
|
}, "initLogger");
|
|
1445
81
|
|
|
@@ -1461,7 +97,7 @@ var optionsFromGlobalZodRegistry = /* @__PURE__ */ __name(() => {
|
|
|
1461
97
|
}, "optionsFromGlobalZodRegistry");
|
|
1462
98
|
|
|
1463
99
|
// src/tryParseConfig.ts
|
|
1464
|
-
import { isDefined as
|
|
100
|
+
import { isDefined as isDefined2, isNull } from "@xylabs/sdk-js";
|
|
1465
101
|
import { cosmiconfigSync } from "cosmiconfig";
|
|
1466
102
|
var configName = "xyo";
|
|
1467
103
|
var configSection = "xl1";
|
|
@@ -1470,7 +106,7 @@ var tryParseConfig = /* @__PURE__ */ __name(() => {
|
|
|
1470
106
|
const result = explorer.search();
|
|
1471
107
|
if (!isNull(result)) {
|
|
1472
108
|
const section = result?.config?.[configSection];
|
|
1473
|
-
if (
|
|
109
|
+
if (isDefined2(section) && typeof section === "object") {
|
|
1474
110
|
return section;
|
|
1475
111
|
}
|
|
1476
112
|
}
|
|
@@ -1500,10 +136,12 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
|
|
|
1500
136
|
|
|
1501
137
|
// src/runCLI.ts
|
|
1502
138
|
var configuration;
|
|
1503
|
-
var version =
|
|
1504
|
-
var getContextFromConfig = /* @__PURE__ */ __name((configuration2) => {
|
|
139
|
+
var version = isDefined3("1.17.1") ? "1.17.1" : "unknown";
|
|
140
|
+
var getContextFromConfig = /* @__PURE__ */ __name(async (configuration2) => {
|
|
1505
141
|
const logger = initLogger(configuration2);
|
|
1506
|
-
const orchestrator =
|
|
142
|
+
const orchestrator = await Orchestrator.create({
|
|
143
|
+
logger
|
|
144
|
+
});
|
|
1507
145
|
process.on("SIGINT", () => {
|
|
1508
146
|
void (async () => {
|
|
1509
147
|
try {
|
|
@@ -1548,8 +186,8 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1548
186
|
}
|
|
1549
187
|
}).options(optionsFromGlobalZodRegistry()).wrap(y.terminalWidth()).command("api", "Run a XL1 API Node", (yargs2) => {
|
|
1550
188
|
return yargs2.command("$0", "Run a XL1 API Node", () => {
|
|
1551
|
-
}, () => {
|
|
1552
|
-
const context = getContextFromConfig(configuration);
|
|
189
|
+
}, async () => {
|
|
190
|
+
const context = await getContextFromConfig(configuration);
|
|
1553
191
|
runApi({
|
|
1554
192
|
...context,
|
|
1555
193
|
config: configuration
|
|
@@ -1557,8 +195,8 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1557
195
|
});
|
|
1558
196
|
}).command("bridge", "Run a XL1 Bridge Node", (yargs2) => {
|
|
1559
197
|
return yargs2.command("$0", "Run a XL1 Bridge Node", () => {
|
|
1560
|
-
}, () => {
|
|
1561
|
-
const context = getContextFromConfig(configuration);
|
|
198
|
+
}, async () => {
|
|
199
|
+
const context = await getContextFromConfig(configuration);
|
|
1562
200
|
runBridge({
|
|
1563
201
|
...context,
|
|
1564
202
|
config: configuration
|
|
@@ -1566,8 +204,8 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1566
204
|
});
|
|
1567
205
|
}).command("mempool", "Run a XL1 Mempool Node", (yargs2) => {
|
|
1568
206
|
return yargs2.command("$0", "Run a XL1 Mempool Node", () => {
|
|
1569
|
-
}, () => {
|
|
1570
|
-
const context = getContextFromConfig(configuration);
|
|
207
|
+
}, async () => {
|
|
208
|
+
const context = await getContextFromConfig(configuration);
|
|
1571
209
|
runMempool({
|
|
1572
210
|
...context,
|
|
1573
211
|
config: configuration
|
|
@@ -1576,7 +214,7 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1576
214
|
}).command("producer", "Run a XL1 Producer Node", (yargs2) => {
|
|
1577
215
|
return yargs2.command("$0", "Run a XL1 Producer Node", () => {
|
|
1578
216
|
}, async () => {
|
|
1579
|
-
const context = getContextFromConfig(configuration);
|
|
217
|
+
const context = await getContextFromConfig(configuration);
|
|
1580
218
|
await runProducer({
|
|
1581
219
|
...context,
|
|
1582
220
|
config: configuration
|
|
@@ -1584,8 +222,8 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1584
222
|
});
|
|
1585
223
|
}).command("reward-redemption-api", "Run a XL1 Rewards Redemption API Node", (yargs2) => {
|
|
1586
224
|
return yargs2.command("$0", "Run a XL1 Rewards Redemption API Node", () => {
|
|
1587
|
-
}, () => {
|
|
1588
|
-
const context = getContextFromConfig(configuration);
|
|
225
|
+
}, async () => {
|
|
226
|
+
const context = await getContextFromConfig(configuration);
|
|
1589
227
|
runRewardRedemptionApi({
|
|
1590
228
|
...context,
|
|
1591
229
|
config: configuration
|
|
@@ -1593,7 +231,7 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1593
231
|
});
|
|
1594
232
|
}).command("$0", "Run a full XL1 Node", () => {
|
|
1595
233
|
}, async () => {
|
|
1596
|
-
const context = getContextFromConfig(configuration);
|
|
234
|
+
const context = await getContextFromConfig(configuration);
|
|
1597
235
|
if (configuration.mempool.enabled) {
|
|
1598
236
|
runMempool({
|
|
1599
237
|
...context,
|