@xyo-network/chain-orchestration 1.20.28 → 1.20.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/browser/index.mjs +357 -77
  2. package/dist/browser/index.mjs.map +1 -1
  3. package/dist/browser/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  4. package/dist/browser/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  5. package/dist/browser/node/config/capabilities/Capability.d.ts +36 -0
  6. package/dist/browser/node/config/capabilities/Capability.d.ts.map +1 -0
  7. package/dist/browser/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
  8. package/dist/browser/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
  9. package/dist/browser/node/config/capabilities/Provider.d.ts +50 -0
  10. package/dist/browser/node/config/capabilities/Provider.d.ts.map +1 -0
  11. package/dist/browser/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
  12. package/dist/browser/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
  13. package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
  14. package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
  15. package/dist/browser/node/config/capabilities/descriptors.d.ts +15 -0
  16. package/dist/browser/node/config/capabilities/descriptors.d.ts.map +1 -0
  17. package/dist/browser/node/config/capabilities/index.d.ts +9 -0
  18. package/dist/browser/node/config/capabilities/index.d.ts.map +1 -0
  19. package/dist/browser/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
  20. package/dist/browser/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
  21. package/dist/browser/node/config/capabilities/resolveProviders.d.ts +30 -0
  22. package/dist/browser/node/config/capabilities/resolveProviders.d.ts.map +1 -0
  23. package/dist/browser/node/config/index.d.ts +1 -0
  24. package/dist/browser/node/config/index.d.ts.map +1 -1
  25. package/dist/browser/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
  26. package/dist/browser/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  27. package/dist/browser/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  28. package/dist/browser/node/config/locators/localLocatorFromConfig.d.ts +10 -2
  29. package/dist/browser/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
  30. package/dist/browser/shared/actor/FinalizerActor.d.ts +6 -2
  31. package/dist/browser/shared/actor/FinalizerActor.d.ts.map +1 -1
  32. package/dist/browser/shared/actor/index.d.ts +1 -0
  33. package/dist/browser/shared/actor/index.d.ts.map +1 -1
  34. package/dist/browser/shared/actor/v3/ActorV3.d.ts +85 -0
  35. package/dist/browser/shared/actor/v3/ActorV3.d.ts.map +1 -0
  36. package/dist/browser/shared/actor/v3/index.d.ts +2 -0
  37. package/dist/browser/shared/actor/v3/index.d.ts.map +1 -0
  38. package/dist/browser/shared/config/actors/Api.d.ts +4 -4
  39. package/dist/browser/shared/config/actors/Bridge.d.ts +4 -4
  40. package/dist/browser/shared/config/actors/Finalizer.d.ts +10 -4
  41. package/dist/browser/shared/config/actors/Finalizer.d.ts.map +1 -1
  42. package/dist/browser/shared/config/actors/Mempool.d.ts +4 -4
  43. package/dist/browser/shared/config/actors/Producer.d.ts +6 -6
  44. package/dist/browser/shared/config/actors/Producer.d.ts.map +1 -1
  45. package/dist/browser/shared/config/actors/RewardRedemption.d.ts +4 -4
  46. package/dist/browser/shared/orchestrator/Orchestrator.d.ts +16 -2
  47. package/dist/browser/shared/orchestrator/Orchestrator.d.ts.map +1 -1
  48. package/dist/neutral/index.mjs +357 -77
  49. package/dist/neutral/index.mjs.map +1 -1
  50. package/dist/neutral/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  51. package/dist/neutral/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  52. package/dist/neutral/node/config/capabilities/Capability.d.ts +36 -0
  53. package/dist/neutral/node/config/capabilities/Capability.d.ts.map +1 -0
  54. package/dist/neutral/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
  55. package/dist/neutral/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
  56. package/dist/neutral/node/config/capabilities/Provider.d.ts +50 -0
  57. package/dist/neutral/node/config/capabilities/Provider.d.ts.map +1 -0
  58. package/dist/neutral/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
  59. package/dist/neutral/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
  60. package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
  61. package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
  62. package/dist/neutral/node/config/capabilities/descriptors.d.ts +15 -0
  63. package/dist/neutral/node/config/capabilities/descriptors.d.ts.map +1 -0
  64. package/dist/neutral/node/config/capabilities/index.d.ts +9 -0
  65. package/dist/neutral/node/config/capabilities/index.d.ts.map +1 -0
  66. package/dist/neutral/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
  67. package/dist/neutral/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
  68. package/dist/neutral/node/config/capabilities/resolveProviders.d.ts +30 -0
  69. package/dist/neutral/node/config/capabilities/resolveProviders.d.ts.map +1 -0
  70. package/dist/neutral/node/config/index.d.ts +1 -0
  71. package/dist/neutral/node/config/index.d.ts.map +1 -1
  72. package/dist/neutral/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
  73. package/dist/neutral/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  74. package/dist/neutral/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  75. package/dist/neutral/node/config/locators/localLocatorFromConfig.d.ts +10 -2
  76. package/dist/neutral/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
  77. package/dist/neutral/shared/actor/FinalizerActor.d.ts +6 -2
  78. package/dist/neutral/shared/actor/FinalizerActor.d.ts.map +1 -1
  79. package/dist/neutral/shared/actor/index.d.ts +1 -0
  80. package/dist/neutral/shared/actor/index.d.ts.map +1 -1
  81. package/dist/neutral/shared/actor/v3/ActorV3.d.ts +85 -0
  82. package/dist/neutral/shared/actor/v3/ActorV3.d.ts.map +1 -0
  83. package/dist/neutral/shared/actor/v3/index.d.ts +2 -0
  84. package/dist/neutral/shared/actor/v3/index.d.ts.map +1 -0
  85. package/dist/neutral/shared/config/actors/Api.d.ts +4 -4
  86. package/dist/neutral/shared/config/actors/Bridge.d.ts +4 -4
  87. package/dist/neutral/shared/config/actors/Finalizer.d.ts +10 -4
  88. package/dist/neutral/shared/config/actors/Finalizer.d.ts.map +1 -1
  89. package/dist/neutral/shared/config/actors/Mempool.d.ts +4 -4
  90. package/dist/neutral/shared/config/actors/Producer.d.ts +6 -6
  91. package/dist/neutral/shared/config/actors/Producer.d.ts.map +1 -1
  92. package/dist/neutral/shared/config/actors/RewardRedemption.d.ts +4 -4
  93. package/dist/neutral/shared/orchestrator/Orchestrator.d.ts +16 -2
  94. package/dist/neutral/shared/orchestrator/Orchestrator.d.ts.map +1 -1
  95. package/dist/node/index.mjs +1036 -223
  96. package/dist/node/index.mjs.map +1 -1
  97. package/dist/node/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  98. package/dist/node/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  99. package/dist/node/node/config/capabilities/Capability.d.ts +36 -0
  100. package/dist/node/node/config/capabilities/Capability.d.ts.map +1 -0
  101. package/dist/node/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
  102. package/dist/node/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
  103. package/dist/node/node/config/capabilities/Provider.d.ts +50 -0
  104. package/dist/node/node/config/capabilities/Provider.d.ts.map +1 -0
  105. package/dist/node/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
  106. package/dist/node/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
  107. package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
  108. package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
  109. package/dist/node/node/config/capabilities/descriptors.d.ts +15 -0
  110. package/dist/node/node/config/capabilities/descriptors.d.ts.map +1 -0
  111. package/dist/node/node/config/capabilities/index.d.ts +9 -0
  112. package/dist/node/node/config/capabilities/index.d.ts.map +1 -0
  113. package/dist/node/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
  114. package/dist/node/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
  115. package/dist/node/node/config/capabilities/resolveProviders.d.ts +30 -0
  116. package/dist/node/node/config/capabilities/resolveProviders.d.ts.map +1 -0
  117. package/dist/node/node/config/index.d.ts +1 -0
  118. package/dist/node/node/config/index.d.ts.map +1 -1
  119. package/dist/node/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
  120. package/dist/node/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
  121. package/dist/node/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
  122. package/dist/node/node/config/locators/localLocatorFromConfig.d.ts +10 -2
  123. package/dist/node/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
  124. package/dist/node/shared/actor/FinalizerActor.d.ts +6 -2
  125. package/dist/node/shared/actor/FinalizerActor.d.ts.map +1 -1
  126. package/dist/node/shared/actor/index.d.ts +1 -0
  127. package/dist/node/shared/actor/index.d.ts.map +1 -1
  128. package/dist/node/shared/actor/v3/ActorV3.d.ts +85 -0
  129. package/dist/node/shared/actor/v3/ActorV3.d.ts.map +1 -0
  130. package/dist/node/shared/actor/v3/index.d.ts +2 -0
  131. package/dist/node/shared/actor/v3/index.d.ts.map +1 -0
  132. package/dist/node/shared/config/actors/Api.d.ts +4 -4
  133. package/dist/node/shared/config/actors/Bridge.d.ts +4 -4
  134. package/dist/node/shared/config/actors/Finalizer.d.ts +10 -4
  135. package/dist/node/shared/config/actors/Finalizer.d.ts.map +1 -1
  136. package/dist/node/shared/config/actors/Mempool.d.ts +4 -4
  137. package/dist/node/shared/config/actors/Producer.d.ts +6 -6
  138. package/dist/node/shared/config/actors/Producer.d.ts.map +1 -1
  139. package/dist/node/shared/config/actors/RewardRedemption.d.ts +4 -4
  140. package/dist/node/shared/orchestrator/Orchestrator.d.ts +16 -2
  141. package/dist/node/shared/orchestrator/Orchestrator.d.ts.map +1 -1
  142. package/package.json +80 -80
@@ -4,7 +4,201 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
4
4
  // src/shared/actor/FinalizerActor.ts
5
5
  import { creatable } from "@xylabs/sdk-js";
6
6
  import { processPendingBlocks } from "@xyo-network/chain-sdk";
7
- import { ActorV3, BlockValidationViewerMoniker, BlockViewerMoniker, DeadLetterQueueRunnerMoniker, FinalizationRunnerMoniker, MempoolViewerMoniker } from "@xyo-network/xl1-sdk";
7
+ import { BlockValidationViewerMoniker, BlockViewerMoniker, DeadLetterQueueRunnerMoniker, FinalizationRunnerMoniker, MempoolViewerMoniker } from "@xyo-network/xl1-sdk";
8
+
9
+ // src/shared/actor/v3/ActorV3.ts
10
+ import { AbstractCreatable, assertEx, delay, IdLogger } from "@xylabs/sdk-js";
11
+ import { Semaphore } from "async-mutex";
12
+ import z from "zod";
13
+ var CreatableNameZod = z.custom((val) => typeof val === "string" && val.length > 0);
14
+ var StatusReporterInstanceZod = z.custom((val) => val !== null && typeof val === "object" && "report" in val);
15
+ var AccountInstanceZod = z.custom((val) => val !== null && typeof val === "object" && "address" in val);
16
+ var ActorParamsV3Zod = z.object({
17
+ account: AccountInstanceZod,
18
+ locator: z.unknown(),
19
+ name: CreatableNameZod,
20
+ statusReporter: StatusReporterInstanceZod.optional()
21
+ });
22
+ function createDeferred() {
23
+ let resolve;
24
+ let reject;
25
+ const promise = new Promise((res, rej) => {
26
+ resolve = res;
27
+ reject = rej;
28
+ });
29
+ return {
30
+ promise,
31
+ resolve,
32
+ reject
33
+ };
34
+ }
35
+ __name(createDeferred, "createDeferred");
36
+ var ActorV3 = class extends AbstractCreatable {
37
+ static {
38
+ __name(this, "ActorV3");
39
+ }
40
+ _intervals = /* @__PURE__ */ new Map();
41
+ _semaphores = /* @__PURE__ */ new Map();
42
+ _timeouts = /* @__PURE__ */ new Map();
43
+ _logger;
44
+ _readyDeferred = createDeferred();
45
+ _readyError;
46
+ _readyState = "pending";
47
+ get logger() {
48
+ this._logger = new IdLogger(assertEx(this.context.logger, () => `Logger is required in context for actor ${this.name}.`), () => this.name);
49
+ return this._logger;
50
+ }
51
+ get readyError() {
52
+ return this._readyError;
53
+ }
54
+ get readyState() {
55
+ return this._readyState;
56
+ }
57
+ get account() {
58
+ return this.params.account;
59
+ }
60
+ get context() {
61
+ return this.locator.context;
62
+ }
63
+ get locator() {
64
+ return this.params.locator;
65
+ }
66
+ static async paramsHandler(params) {
67
+ const baseParams = await super.paramsHandler({
68
+ ...params,
69
+ name: params.name ?? "UnknownActor"
70
+ });
71
+ const account = assertEx(params.account, () => `params.account is required for actor ${baseParams.name}.`);
72
+ const locator = assertEx(params.locator, () => `params.locator is required for actor ${baseParams.name}.`);
73
+ return {
74
+ ...baseParams,
75
+ account,
76
+ locator
77
+ };
78
+ }
79
+ /**
80
+ * The timer runs until the actor is deactivated (or you manually stop it).
81
+ */
82
+ registerTimer(timerName, callback, dueTimeMs, periodMs) {
83
+ if (this.status !== "starting") {
84
+ this.logger?.warn(`Cannot register timer '${timerName}' because actor is not starting.`);
85
+ return;
86
+ }
87
+ let running = false;
88
+ this._semaphores.set(timerName, new Semaphore(1));
89
+ const timeoutId = setTimeout(() => {
90
+ const intervalId = setInterval(() => {
91
+ const semaphore = this._semaphores.get(timerName);
92
+ if (this.status !== "started" || !this._intervals.has(timerName) || !semaphore || running) return;
93
+ if (semaphore.isLocked()) {
94
+ this.logger?.warn(`Skipping timer '${this.name}:${timerName}' execution because previous execution is still running.`);
95
+ return;
96
+ }
97
+ semaphore.acquire().then(([, release]) => {
98
+ const startTime = Date.now();
99
+ running = true;
100
+ callback().then(() => {
101
+ const duration = Date.now() - startTime;
102
+ if (duration > periodMs) {
103
+ this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than the period (${periodMs}ms).`);
104
+ } else if (duration > 5e3) {
105
+ this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than 5000ms.`);
106
+ }
107
+ }).catch((error) => {
108
+ const err = error instanceof Error ? error : new Error(String(error));
109
+ this.logger?.error(`Error in timer '${this.name}:${timerName}': ${err.message}`);
110
+ if (err.stack) this.logger?.error(err.stack);
111
+ }).finally(() => {
112
+ release();
113
+ running = false;
114
+ });
115
+ }).catch((error) => {
116
+ const err = error instanceof Error ? error : new Error(String(error));
117
+ this.logger?.error(`Error acquiring semaphore for timer '${this.name}:${timerName}': ${err.message}`);
118
+ });
119
+ }, periodMs);
120
+ this._intervals.set(timerName, intervalId);
121
+ }, dueTimeMs);
122
+ this._timeouts.set(timerName, timeoutId);
123
+ this.logger?.debug(`Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`);
124
+ }
125
+ /**
126
+ * Invoked by the Orchestrator after `start()` to run the warm-pass.
127
+ * Idempotent: returns immediately if already invoked.
128
+ * Throws if `readyHandler` throws; resolves once `readyHandler` resolves.
129
+ */
130
+ async runReadyHandler() {
131
+ if (this._readyState !== "pending") return;
132
+ try {
133
+ await this.readyHandler();
134
+ this._readyState = "ready";
135
+ this._readyDeferred.resolve();
136
+ } catch (err) {
137
+ const error = err instanceof Error ? err : new Error(String(err));
138
+ this._readyState = "failed";
139
+ this._readyError = error;
140
+ this._readyDeferred.reject(error);
141
+ throw error;
142
+ }
143
+ }
144
+ async stopHandler() {
145
+ await super.stopHandler();
146
+ this.logger?.debug("Stopping all timers...");
147
+ await Promise.all([
148
+ ...this._semaphores.values()
149
+ ].map(async (semaphore) => {
150
+ while (semaphore.isLocked()) {
151
+ this.logger?.debug("Waiting for running timer task to complete...");
152
+ await delay(500);
153
+ }
154
+ await semaphore.acquire();
155
+ }));
156
+ this._semaphores.clear();
157
+ for (const [, timeoutRef] of this._timeouts.entries()) {
158
+ clearTimeout(timeoutRef);
159
+ }
160
+ this._timeouts.clear();
161
+ for (const [, intervalRef] of this._intervals.entries()) {
162
+ clearInterval(intervalRef);
163
+ }
164
+ this._intervals.clear();
165
+ this.logger?.debug("Stopped.");
166
+ }
167
+ async whenReady(timeoutMs) {
168
+ if (timeoutMs === void 0) {
169
+ await this._readyDeferred.promise;
170
+ return;
171
+ }
172
+ let timer;
173
+ const timeout = new Promise((_, reject) => {
174
+ timer = setTimeout(() => {
175
+ reject(new Error(`Actor ${this.name} did not become ready within ${timeoutMs}ms`));
176
+ }, timeoutMs);
177
+ });
178
+ try {
179
+ await Promise.race([
180
+ this._readyDeferred.promise,
181
+ timeout
182
+ ]);
183
+ } finally {
184
+ if (timer) clearTimeout(timer);
185
+ }
186
+ }
187
+ /**
188
+ * Override in subclasses to prove the actor can do useful work.
189
+ * Default: no-op (the actor declares itself ready as soon as `start()` returns).
190
+ */
191
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
192
+ async readyHandler() {
193
+ }
194
+ };
195
+ var Actor = class extends ActorV3 {
196
+ static {
197
+ __name(this, "Actor");
198
+ }
199
+ };
200
+
201
+ // src/shared/actor/FinalizerActor.ts
8
202
  function _ts_decorate(decorators, target, key, desc) {
9
203
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
204
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -16,6 +210,17 @@ var FinalizerActor = class extends ActorV3 {
16
210
  static {
17
211
  __name(this, "FinalizerActor");
18
212
  }
213
+ static needs = {
214
+ required: [
215
+ BlockValidationViewerMoniker,
216
+ BlockViewerMoniker,
217
+ FinalizationRunnerMoniker,
218
+ MempoolViewerMoniker
219
+ ],
220
+ optional: [
221
+ DeadLetterQueueRunnerMoniker
222
+ ]
223
+ };
19
224
  _blockValidationViewer;
20
225
  _blockViewer;
21
226
  _deadLetterQueueRunner;
@@ -49,25 +254,32 @@ var FinalizerActor = class extends ActorV3 {
49
254
  }
50
255
  async startHandler() {
51
256
  await super.startHandler();
257
+ const interval = this.params.config.finalizationCheckInterval ?? 500;
52
258
  this.registerTimer("FinalizerActor", async () => {
53
- await this.spanAsync("processPendingBlocks", async () => {
54
- this.logger?.debug("FinalizerActor: Processing pending blocks...");
55
- await processPendingBlocks({
56
- blockValidationViewer: this.blockValidationViewer,
57
- context: this.context,
58
- logger: this.logger,
59
- mempoolViewer: this.mempoolViewer,
60
- blockViewer: this.blockViewer,
61
- finalizationRunner: this.finalizationRunner,
62
- allowedProducers: this.allowedProducers,
63
- minCandidates: this.minCandidates,
64
- deadLetterQueueRunner: this._deadLetterQueueRunner
65
- });
66
- }, {
67
- ...this.context,
68
- timeBudgetLimit: 1500
259
+ await this.runFinalizationPass();
260
+ }, 2e3, interval);
261
+ }
262
+ async readyHandler() {
263
+ await this.runFinalizationPass();
264
+ }
265
+ async runFinalizationPass() {
266
+ await this.spanAsync("processPendingBlocks", async () => {
267
+ this.logger?.debug("FinalizerActor: Processing pending blocks...");
268
+ await processPendingBlocks({
269
+ blockValidationViewer: this.blockValidationViewer,
270
+ context: this.context,
271
+ logger: this.logger,
272
+ mempoolViewer: this.mempoolViewer,
273
+ blockViewer: this.blockViewer,
274
+ finalizationRunner: this.finalizationRunner,
275
+ allowedProducers: this.allowedProducers,
276
+ minCandidates: this.minCandidates,
277
+ deadLetterQueueRunner: this._deadLetterQueueRunner
69
278
  });
70
- }, 2e3, 500);
279
+ }, {
280
+ ...this.context,
281
+ timeBudgetLimit: 1500
282
+ });
71
283
  }
72
284
  };
73
285
  FinalizerActor = _ts_decorate([
@@ -96,12 +308,12 @@ __name(buildTelemetryConfig, "buildTelemetryConfig");
96
308
  // src/shared/config/actors/Api.ts
97
309
  import { zodAsFactory, zodIsFactory, zodToFactory } from "@xylabs/sdk-js";
98
310
  import { BaseConfigContextZod, HostActorConfigZod } from "@xyo-network/xl1-sdk";
99
- import { globalRegistry, z } from "zod";
100
- var ApiConfigZod = HostActorConfigZod.extend(z.object({
101
- initRewardsCache: z.union([
102
- z.number(),
103
- z.string(),
104
- z.boolean()
311
+ import { globalRegistry, z as z2 } from "zod";
312
+ var ApiConfigZod = HostActorConfigZod.extend(z2.object({
313
+ initRewardsCache: z2.union([
314
+ z2.number(),
315
+ z2.string(),
316
+ z2.boolean()
105
317
  ]).transform((v) => v !== "0" && v !== "false" && v !== false && v != 0).default(true).register(globalRegistry, {
106
318
  description: "Whether to initialize the rewards cache on startup",
107
319
  title: "api.initRewardsCache",
@@ -121,7 +333,7 @@ var toApiConfigContext = zodToFactory(ApiConfigContext, "toApiConfigContext");
121
333
  // src/shared/config/actors/Bridge.ts
122
334
  import { AddressZod, HexZod, toAddress, toHex, zodAsFactory as zodAsFactory2, zodIsFactory as zodIsFactory2, zodToFactory as zodToFactory2 } from "@xylabs/sdk-js";
123
335
  import { AttoXL1ConvertFactor, BaseConfigContextZod as BaseConfigContextZod2, HostActorConfigZod as HostActorConfigZod2, XL1 } from "@xyo-network/xl1-sdk";
124
- import { globalRegistry as globalRegistry2, z as z2 } from "zod";
336
+ import { globalRegistry as globalRegistry2, z as z3 } from "zod";
125
337
  var DEFAULT_FIXED_FEE = toHex(XL1(1000n) * AttoXL1ConvertFactor.xl1);
126
338
  var DEFAULT_VARIABLE_FEE_BASIS_POINTS = 300;
127
339
  var DEFAULT_HARDHAT_BRIDGE_CONTRACT = toAddress("2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6");
@@ -130,7 +342,7 @@ var DEFAULT_HARDHAT_REMOTE_CHAIN_WALLET_PRIVATE_KEY = toHex("0xac0974bec39a17e36
130
342
  var DEFAULT_HARDHAT_TOKEN_CONTRACT = toAddress("5FbDB2315678afecb367f032d93F642f64180aa3");
131
343
  var DEFAULT_MAX_BRIDGE_AMOUNT = toHex(XL1(1000000n) * AttoXL1ConvertFactor.xl1);
132
344
  var DEFAULT_MIN_BRIDGE_AMOUNT = toHex(XL1(1500n) * AttoXL1ConvertFactor.xl1);
133
- var BasisPointsZod = z2.coerce.number().int().nonnegative().max(1e4);
345
+ var BasisPointsZod = z3.coerce.number().int().nonnegative().max(1e4);
134
346
  var BridgeConfigZod = HostActorConfigZod2.extend({
135
347
  escrowAddress: AddressZod.optional().register(globalRegistry2, {
136
348
  description: "Address to which bridge escrow will be sent",
@@ -166,13 +378,13 @@ var BridgeConfigZod = HostActorConfigZod2.extend({
166
378
  title: "bridge.minBridgeAmount",
167
379
  type: "string"
168
380
  }),
169
- redisHost: z2.string().default("localhost").register(globalRegistry2, {
381
+ redisHost: z3.string().default("localhost").register(globalRegistry2, {
170
382
  default: "localhost",
171
383
  description: "Host for the Bridge Redis instance",
172
384
  title: "bridge.redisHost",
173
385
  type: "string"
174
386
  }),
175
- redisPort: z2.coerce.number().int().positive().default(6379).register(globalRegistry2, {
387
+ redisPort: z3.coerce.number().int().positive().default(6379).register(globalRegistry2, {
176
388
  default: 6379,
177
389
  description: "Port for the Bridge Redis instance",
178
390
  title: "bridge.redisPort",
@@ -237,10 +449,14 @@ var toBridgeConfigContext = zodToFactory2(BridgeConfigContext, "toBridgeConfigCo
237
449
  // src/shared/config/actors/Finalizer.ts
238
450
  import { AddressZod as AddressZod2, zodAsFactory as zodAsFactory3, zodIsFactory as zodIsFactory3, zodToFactory as zodToFactory3 } from "@xylabs/sdk-js";
239
451
  import { BaseConfigContextZod as BaseConfigContextZod3, DEFAULT_MIN_CANDIDATES, HostActorConfigZod as HostActorConfigZod3 } from "@xyo-network/xl1-sdk";
240
- import { z as z3 } from "zod";
452
+ import { z as z4 } from "zod";
241
453
  var FinalizerConfigZod = HostActorConfigZod3.extend({
242
- allowedProducers: z3.array(AddressZod2).optional(),
243
- minCandidates: z3.number().int().min(0).default(DEFAULT_MIN_CANDIDATES)
454
+ allowedProducers: z4.array(AddressZod2).optional(),
455
+ // Period (ms) between finalizer ticks. Default matches the historical
456
+ // hardcoded value in FinalizerActor; tests can lower it to drive faster
457
+ // block finalization.
458
+ finalizationCheckInterval: z4.coerce.number().default(500),
459
+ minCandidates: z4.number().int().min(0).default(DEFAULT_MIN_CANDIDATES)
244
460
  });
245
461
  var isFinalizerConfig = zodIsFactory3(FinalizerConfigZod);
246
462
  var asFinalizerConfig = zodAsFactory3(FinalizerConfigZod, "asFinalizerConfig");
@@ -255,13 +471,13 @@ var toFinalizerConfigContext = zodToFactory3(FinalizerConfigContext, "toFinalize
255
471
  // src/shared/config/actors/Mempool.ts
256
472
  import { zodAsFactory as zodAsFactory4, zodIsFactory as zodIsFactory4, zodToFactory as zodToFactory4 } from "@xylabs/sdk-js";
257
473
  import { BaseConfigContextZod as BaseConfigContextZod4, HostActorConfigZod as HostActorConfigZod4 } from "@xyo-network/xl1-sdk";
258
- import { globalRegistry as globalRegistry3, z as z4 } from "zod";
474
+ import { globalRegistry as globalRegistry3, z as z5 } from "zod";
259
475
  var DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL = 1e3;
260
476
  var DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL = 1e3;
261
477
  var MempoolConfigZod = HostActorConfigZod4.extend({
262
- enabled: z4.union([
263
- z4.string(),
264
- z4.boolean()
478
+ enabled: z5.union([
479
+ z5.string(),
480
+ z5.boolean()
265
481
  ]).default("false").transform((val, ctx) => {
266
482
  if (typeof val === "boolean") return val;
267
483
  const normalized = val.toLowerCase().trim();
@@ -282,19 +498,19 @@ var MempoolConfigZod = HostActorConfigZod4.extend({
282
498
  expected: "boolean",
283
499
  message: `Invalid boolean value: "${val}". Use true/false, 1/0, yes/no.`
284
500
  });
285
- return z4.NEVER;
501
+ return z5.NEVER;
286
502
  }).register(globalRegistry3, {
287
503
  default: "false",
288
504
  description: "Enable the Mempool",
289
505
  title: "mempool.enabled",
290
506
  type: "boolean"
291
507
  }),
292
- blockPruneInterval: z4.coerce.number().default(DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL).register(globalRegistry3, {
508
+ blockPruneInterval: z5.coerce.number().default(DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL).register(globalRegistry3, {
293
509
  description: "The interval time (in milliseconds) between pending block prune attempts",
294
510
  title: "mempool.blockPruneInterval",
295
511
  type: "number"
296
512
  }),
297
- transactionPruneInterval: z4.coerce.number().default(DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL).register(globalRegistry3, {
513
+ transactionPruneInterval: z5.coerce.number().default(DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL).register(globalRegistry3, {
298
514
  description: "The interval time (in milliseconds) between pending transaction prune attempts",
299
515
  title: "mempool.transactionPruneInterval",
300
516
  type: "number"
@@ -311,44 +527,39 @@ var asMempoolConfigContext = zodAsFactory4(MempoolConfigContext, "asMempoolConfi
311
527
  var toMempoolConfigContext = zodToFactory4(MempoolConfigContext, "toMempoolConfigContext");
312
528
 
313
529
  // src/shared/config/actors/Producer.ts
314
- import { AddressZod as AddressZod3, asAddress, zodAsFactory as zodAsFactory5, zodIsFactory as zodIsFactory5, zodToFactory as zodToFactory5 } from "@xylabs/sdk-js";
530
+ import { AddressZod as AddressZod3, zodAsFactory as zodAsFactory5, zodIsFactory as zodIsFactory5, zodToFactory as zodToFactory5 } from "@xylabs/sdk-js";
315
531
  import { ActorConfigZod, BaseConfigContextZod as BaseConfigContextZod5 } from "@xyo-network/xl1-sdk";
316
- import { globalRegistry as globalRegistry4, z as z5 } from "zod";
532
+ import { globalRegistry as globalRegistry4, z as z6 } from "zod";
317
533
  var DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL = 1e4;
318
- var ProducerConfigZod = ActorConfigZod.extend(z5.object({
319
- allowlist: z5.preprocess((val) => {
320
- if (typeof val === "string") {
321
- return val.split(",").map((s) => asAddress(s.trim()));
322
- }
323
- return val;
324
- }, z5.array(AddressZod3).optional().register(globalRegistry4, {
534
+ var ProducerConfigZod = ActorConfigZod.extend(z6.object({
535
+ allowlist: z6.array(AddressZod3).optional().register(globalRegistry4, {
325
536
  description: "List of allowed producer addresses, if undefined anyone can participate",
326
537
  title: "allowlist",
327
538
  type: "array"
328
- })),
329
- blockProductionCheckInterval: z5.coerce.number().default(DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL).register(globalRegistry4, {
539
+ }),
540
+ blockProductionCheckInterval: z6.coerce.number().default(DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL).register(globalRegistry4, {
330
541
  description: "The interval time (in milliseconds) between block production attempts",
331
542
  title: "producer.blockProductionCheckInterval",
332
543
  type: "number"
333
544
  }),
334
- disableIntentRedeclaration: z5.boolean().optional().register(globalRegistry4, {
545
+ disableIntentRedeclaration: z6.boolean().optional().register(globalRegistry4, {
335
546
  description: "Should the producer skip redeclaring their intent to continue producing blocks",
336
547
  title: "producer.disableIntentRedeclaration",
337
548
  type: "boolean"
338
549
  }),
339
- heartbeatInterval: z5.coerce.number().default(36e5).register(globalRegistry4, {
550
+ heartbeatInterval: z6.coerce.number().default(36e5).register(globalRegistry4, {
340
551
  description: "The number of milliseconds between heartbeats if no blocks are produced",
341
552
  title: "producer.heartbeatInterval",
342
553
  type: "number"
343
554
  }),
344
555
  // TODO: BigInt schema
345
- minStake: z5.coerce.number().default(1).register(globalRegistry4, {
556
+ minStake: z6.coerce.number().default(1).register(globalRegistry4, {
346
557
  description: "Minimum stake required to be a Producer",
347
558
  title: "producer.minStake",
348
559
  type: "number"
349
560
  }),
350
561
  // TODO: Address schema
351
- rewardAddress: z5.string().optional().register(globalRegistry4, {
562
+ rewardAddress: z6.string().optional().register(globalRegistry4, {
352
563
  description: "Address to receive block rewards",
353
564
  title: "producer.rewardAddress",
354
565
  type: "string"
@@ -765,7 +976,7 @@ async function initActorAccount({ config, logger }) {
765
976
  __name(initActorAccount, "initActorAccount");
766
977
 
767
978
  // src/shared/init/initActorSeedPhrase.ts
768
- import { assertEx, isString } from "@xylabs/sdk-js";
979
+ import { assertEx as assertEx2, isString } from "@xylabs/sdk-js";
769
980
  async function initActorSeedPhrase(context, bios) {
770
981
  const { logger, config } = context;
771
982
  const walletKind = config.name;
@@ -774,12 +985,12 @@ async function initActorSeedPhrase(context, bios) {
774
985
  if (isString(report?.root.mnemonic)) return report.root.mnemonic;
775
986
  const fallback = getBuiltInDevMnemonic();
776
987
  logger?.debug(`[${walletKind}] Falling back to built-in development mnemonic`);
777
- return assertEx(fallback, () => "Unable to resolve mnemonic");
988
+ return assertEx2(fallback, () => "Unable to resolve mnemonic");
778
989
  }
779
990
  __name(initActorSeedPhrase, "initActorSeedPhrase");
780
991
 
781
992
  // src/shared/init/initBridgedModule.ts
782
- import { assertEx as assertEx2 } from "@xylabs/sdk-js";
993
+ import { assertEx as assertEx3 } from "@xylabs/sdk-js";
783
994
  import { asAttachableArchivistInstance, asAttachableModuleInstance } from "@xyo-network/sdk-js";
784
995
  import { Mutex } from "async-mutex";
785
996
  var initMutex = new Mutex();
@@ -788,8 +999,8 @@ async function initBridgedModule({ bridge, moduleName }) {
788
999
  return await initMutex.runExclusive(async () => {
789
1000
  const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName];
790
1001
  if (existing) return existing;
791
- const mod = assertEx2(await bridge.resolve(moduleName), () => `Could not resolve ${moduleName}`);
792
- const moduleInstance = assertEx2(asAttachableModuleInstance(mod), () => `Could not convert ${moduleName} to attachable module instance`);
1002
+ const mod = assertEx3(await bridge.resolve(moduleName), () => `Could not resolve ${moduleName}`);
1003
+ const moduleInstance = assertEx3(asAttachableModuleInstance(mod), () => `Could not convert ${moduleName} to attachable module instance`);
793
1004
  let moduleMap = bridgedModuleDictionary[bridge.address];
794
1005
  if (moduleMap === void 0) {
795
1006
  moduleMap = {};
@@ -801,7 +1012,7 @@ async function initBridgedModule({ bridge, moduleName }) {
801
1012
  }
802
1013
  __name(initBridgedModule, "initBridgedModule");
803
1014
  async function initBridgedArchivistModule({ bridge, moduleName }) {
804
- return assertEx2(asAttachableArchivistInstance(await initBridgedModule({
1015
+ return assertEx3(asAttachableArchivistInstance(await initBridgedModule({
805
1016
  bridge,
806
1017
  moduleName
807
1018
  })), () => `Could not convert ${moduleName} to attachable archivist instance`);
@@ -836,7 +1047,7 @@ async function initActorWallet(context) {
836
1047
  __name(initActorWallet, "initActorWallet");
837
1048
 
838
1049
  // src/shared/orchestrator/Orchestrator.ts
839
- import { AbstractCreatable, creatable as creatable2 } from "@xylabs/sdk-js";
1050
+ import { AbstractCreatable as AbstractCreatable2, creatable as creatable2 } from "@xylabs/sdk-js";
840
1051
  function _ts_decorate2(decorators, target, key, desc) {
841
1052
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
842
1053
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -844,25 +1055,43 @@ function _ts_decorate2(decorators, target, key, desc) {
844
1055
  return c > 3 && r && Object.defineProperty(target, key, r), r;
845
1056
  }
846
1057
  __name(_ts_decorate2, "_ts_decorate");
847
- var Orchestrator = class extends AbstractCreatable {
1058
+ var Orchestrator = class extends AbstractCreatable2 {
848
1059
  static {
849
1060
  __name(this, "Orchestrator");
850
1061
  }
851
1062
  actors = [];
852
- keepAliveHandle = null;
853
1063
  running = false;
1064
+ shuttingDown = false;
1065
+ get readyState() {
1066
+ if (this.actors.length === 0) return "pending";
1067
+ if (this.actors.some((a) => isLocalActor(a) && a.readyState === "failed")) return "failed";
1068
+ if (this.actors.every((a) => isLocalActor(a) && a.readyState === "ready")) return "ready";
1069
+ return "pending";
1070
+ }
1071
+ isReady() {
1072
+ return this.readyState === "ready" && !this.shuttingDown;
1073
+ }
1074
+ isShuttingDown() {
1075
+ return this.shuttingDown;
1076
+ }
854
1077
  /**
855
1078
  * Registers an actor.
856
1079
  * (We won't activate the actor until `start()` is called.)
857
1080
  */
858
1081
  async registerActor(actor) {
1082
+ this.actors.push(actor);
859
1083
  if (this.running) {
860
1084
  await actor.start();
1085
+ if (isLocalActor(actor)) {
1086
+ actor.runReadyHandler().catch((err) => {
1087
+ this.logger?.error(`[Orchestrator] Actor [${actor.name}] readyHandler failed: ${formatError(err)}`);
1088
+ });
1089
+ }
861
1090
  }
862
- this.actors.push(actor);
863
1091
  }
864
1092
  /**
865
- * Starts the orchestrator: activates all actors.
1093
+ * Starts the orchestrator: activates all actors in parallel and kicks off their warm-pass.
1094
+ * `whenReady()` resolves once every actor's `readyHandler` has succeeded.
866
1095
  */
867
1096
  async startHandler() {
868
1097
  await super.startHandler();
@@ -870,13 +1099,26 @@ var Orchestrator = class extends AbstractCreatable {
870
1099
  this.logger?.warn("[Orchestrator] Already started.");
871
1100
  return;
872
1101
  }
873
- this.logger?.log("[Orchestrator] Starting...");
1102
+ this.logger?.log(`[Orchestrator] Starting ${this.actors.length} actor(s) in parallel...`);
874
1103
  this.running = true;
1104
+ const startResults = await Promise.allSettled(this.actors.map((a) => a.start()));
1105
+ const startFailures = startResults.flatMap((r, i) => r.status === "rejected" ? [
1106
+ {
1107
+ actor: this.actors[i],
1108
+ reason: r.reason
1109
+ }
1110
+ ] : []);
1111
+ if (startFailures.length > 0) {
1112
+ for (const f of startFailures) this.logger?.error(`[Orchestrator] Actor [${f.actor?.name ?? "?"}] failed to start: ${formatError(f.reason)}`);
1113
+ throw new Error(`[Orchestrator] ${startFailures.length} actor(s) failed to start`);
1114
+ }
875
1115
  for (const actor of this.actors) {
876
- await actor.start();
1116
+ if (isLocalActor(actor)) {
1117
+ actor.runReadyHandler().catch((err) => {
1118
+ this.logger?.error(`[Orchestrator] Actor [${actor.name}] readyHandler failed: ${formatError(err)}`);
1119
+ });
1120
+ }
877
1121
  }
878
- this.keepAliveHandle = setInterval(() => {
879
- }, 2147483647);
880
1122
  }
881
1123
  /**
882
1124
  * Stops the orchestrator: deactivates all actors.
@@ -888,20 +1130,55 @@ var Orchestrator = class extends AbstractCreatable {
888
1130
  return;
889
1131
  }
890
1132
  this.logger?.log("[Orchestrator] Stopping...");
891
- for (const actor of this.actors) {
892
- await actor.stop();
893
- }
1133
+ this.shuttingDown = true;
1134
+ await Promise.allSettled(this.actors.map((a) => a.stop()));
894
1135
  this.running = false;
895
- if (this.keepAliveHandle) clearInterval(this.keepAliveHandle);
896
- this.logger?.log("[Orchestrator] Stopped...");
1136
+ this.shuttingDown = false;
1137
+ this.logger?.log("[Orchestrator] Stopped.");
1138
+ }
1139
+ /**
1140
+ * Resolves once every actor reports ready. Rejects if any actor's `readyHandler` throws,
1141
+ * or after `timeoutMs` if provided.
1142
+ */
1143
+ async whenReady(timeoutMs) {
1144
+ const localActors = this.actors.filter(isLocalActor);
1145
+ if (localActors.length === 0) return;
1146
+ if (timeoutMs === void 0) {
1147
+ await Promise.all(localActors.map((a) => a.whenReady()));
1148
+ return;
1149
+ }
1150
+ let timer;
1151
+ const timeout = new Promise((_, reject) => {
1152
+ timer = setTimeout(() => {
1153
+ reject(new Error(`[Orchestrator] Not ready within ${timeoutMs}ms`));
1154
+ }, timeoutMs);
1155
+ });
1156
+ try {
1157
+ await Promise.race([
1158
+ Promise.all(localActors.map((a) => a.whenReady())),
1159
+ timeout
1160
+ ]);
1161
+ } finally {
1162
+ if (timer) clearTimeout(timer);
1163
+ }
897
1164
  }
898
1165
  };
899
1166
  Orchestrator = _ts_decorate2([
900
1167
  creatable2()
901
1168
  ], Orchestrator);
1169
+ function isLocalActor(actor) {
1170
+ return actor instanceof ActorV3;
1171
+ }
1172
+ __name(isLocalActor, "isLocalActor");
1173
+ function formatError(err) {
1174
+ if (err instanceof Error) return `${err.message}${err.stack ? `
1175
+ ${err.stack}` : ""}`;
1176
+ return String(err);
1177
+ }
1178
+ __name(formatError, "formatError");
902
1179
 
903
1180
  // src/shared/provider/SimpleRejectedTransactionsArchivistProvider.ts
904
- import { assertEx as assertEx3 } from "@xylabs/sdk-js";
1181
+ import { assertEx as assertEx4 } from "@xylabs/sdk-js";
905
1182
  import { AbstractCreatableProvider, creatableProvider } from "@xyo-network/xl1-sdk";
906
1183
  function _ts_decorate3(decorators, target, key, desc) {
907
1184
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -927,7 +1204,7 @@ var SimpleRejectedTransactionsArchivistProvider = class _SimpleRejectedTransacti
927
1204
  static async paramsHandler(params) {
928
1205
  return {
929
1206
  ...await super.paramsHandler(params),
930
- archivist: assertEx3(params?.archivist, () => "archivist is required")
1207
+ archivist: assertEx4(params?.archivist, () => "archivist is required")
931
1208
  };
932
1209
  }
933
1210
  };
@@ -954,18 +1231,21 @@ function basicRemoteViewerLocator(name, remoteConfig, dataLakeEndpoint, validato
954
1231
  __name(basicRemoteViewerLocator, "basicRemoteViewerLocator");
955
1232
 
956
1233
  // src/neutral/config/locators/rootLocatorFromConfig.ts
957
- import { assertEx as assertEx4 } from "@xylabs/sdk-js";
1234
+ import { assertEx as assertEx5 } from "@xylabs/sdk-js";
958
1235
  import { commonLocatorFromConfig, remoteLocatorFromConfig } from "@xyo-network/xl1-sdk";
959
1236
  async function rootLocatorFromConfig(context, validateDepsOnRegister = false) {
960
1237
  const { config } = context;
961
1238
  await commonLocatorFromConfig(context, validateDepsOnRegister);
962
- const locator = assertEx4(await (config.remote.rpc ? remoteLocatorFromConfig(context, validateDepsOnRegister) : void 0), () => "Root locator could not be created from config. No supported configuration found.");
1239
+ const locator = assertEx5(await (config.remote.rpc ? remoteLocatorFromConfig(context, validateDepsOnRegister) : void 0), () => "Root locator could not be created from config. No supported configuration found.");
963
1240
  locator.freeze();
964
1241
  return locator;
965
1242
  }
966
1243
  __name(rootLocatorFromConfig, "rootLocatorFromConfig");
967
1244
  export {
1245
+ Actor,
968
1246
  ActorMnemonicNotAllowedError,
1247
+ ActorParamsV3Zod,
1248
+ ActorV3,
969
1249
  ApiConfigContext,
970
1250
  ApiConfigZod,
971
1251
  BUILT_IN_DEV_MNEMONIC,