@xyo-network/chain-producer 1.22.0 → 1.23.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.
@@ -1,62 +1,58 @@
1
1
  var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __decorateClass = (decorators, target, key, kind) => {
5
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
7
+ if (decorator = decorators[i])
8
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
9
+ if (kind && result) __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
3
13
 
4
14
  // src/command.ts
5
15
  import { ProducerConfigZod } from "@xyo-network/chain-orchestration";
6
16
 
7
17
  // src/run.ts
8
18
  import { exists } from "@xylabs/sdk-js";
9
- import { initActorWallet } from "@xyo-network/chain-orchestration";
19
+ import {
20
+ initActorWallet
21
+ } from "@xyo-network/chain-orchestration";
10
22
 
11
23
  // src/ProducerActor.ts
12
- import { assertEx, creatable, isDefined, isUndefined, toHex } from "@xylabs/sdk-js";
13
- import { ActorV3, DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL } from "@xyo-network/chain-orchestration";
24
+ import {
25
+ assertEx,
26
+ creatable,
27
+ isDefined,
28
+ isUndefined,
29
+ toHex
30
+ } from "@xylabs/sdk-js";
31
+ import {
32
+ ActorV3,
33
+ DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL
34
+ } from "@xyo-network/chain-orchestration";
14
35
  import { SimpleBlockRunner } from "@xyo-network/chain-services";
15
- import { AccountBalanceViewerMoniker, asXL1BlockNumber, BlockRunnerMoniker, BlockViewerMoniker, buildTransaction, ChainContractViewerMoniker, createDeclarationIntent, FinalizationViewerMoniker, MempoolRunnerMoniker, MempoolViewerMoniker, StakeTotalsViewerMoniker } from "@xyo-network/xl1-sdk";
36
+ import {
37
+ AccountBalanceViewerMoniker,
38
+ asXL1BlockNumber,
39
+ BlockRunnerMoniker,
40
+ BlockViewerMoniker,
41
+ buildTransaction,
42
+ ChainContractViewerMoniker,
43
+ createDeclarationIntent,
44
+ FinalizationViewerMoniker,
45
+ MempoolRunnerMoniker,
46
+ MempoolViewerMoniker,
47
+ StakeTotalsViewerMoniker
48
+ } from "@xyo-network/xl1-sdk";
16
49
  import { Mutex } from "async-mutex";
17
- function _ts_decorate(decorators, target, key, desc) {
18
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
21
- return c > 3 && r && Object.defineProperty(target, key, r), r;
22
- }
23
- __name(_ts_decorate, "_ts_decorate");
24
50
  var SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true;
25
51
  var TEN_MINUTES = 10 * 60 * 1e3;
26
- var toFormattedBlockReference = /* @__PURE__ */ __name((blockBoundWitness) => {
27
- return `${blockBoundWitness.block} [${toHex(blockBoundWitness._hash, {
28
- prefix: true
29
- })}]`;
30
- }, "toFormattedBlockReference");
31
- var ProducerActor = class _ProducerActor extends ActorV3 {
32
- static {
33
- __name(this, "ProducerActor");
34
- }
35
- /**
36
- * The default interval time (in MS) between block production attempts.
37
- */
38
- static DefaultBlockProductionCheckInterval = DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL;
39
- /**
40
- * The multiplier applied to the block production check interval to determine
41
- * the threshold for resubmitting the same block number if the head has not changed.
42
- */
43
- static HeadResubmissionMultiplier = 30;
44
- /**
45
- * The window (in blocks) before expiration to attempt redeclaration of producer intent.
46
- */
47
- static RedeclarationWindow = 1e3;
48
- static needs = {
49
- required: [
50
- AccountBalanceViewerMoniker,
51
- BlockRunnerMoniker,
52
- BlockViewerMoniker,
53
- ChainContractViewerMoniker,
54
- FinalizationViewerMoniker,
55
- MempoolRunnerMoniker,
56
- MempoolViewerMoniker,
57
- StakeTotalsViewerMoniker
58
- ]
59
- };
52
+ var toFormattedBlockReference = (blockBoundWitness) => {
53
+ return `${blockBoundWitness.block} [${toHex(blockBoundWitness._hash, { prefix: true })}]`;
54
+ };
55
+ var ProducerActor = class extends ActorV3 {
60
56
  _lastProducedBlock;
61
57
  _lastRedeclarationIntent;
62
58
  _metricAttributes;
@@ -82,7 +78,7 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
82
78
  return this._accountBalanceViewer;
83
79
  }
84
80
  get blockProductionCheckInterval() {
85
- return this.config.blockProductionCheckInterval ?? _ProducerActor.DefaultBlockProductionCheckInterval;
81
+ return this.config.blockProductionCheckInterval ?? ProducerActor.DefaultBlockProductionCheckInterval;
86
82
  }
87
83
  get blockRunner() {
88
84
  return this._blockRunner;
@@ -100,7 +96,7 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
100
96
  return this.params.config;
101
97
  }
102
98
  get headResubmissionThreshold() {
103
- return this.blockProductionCheckInterval * _ProducerActor.HeadResubmissionMultiplier;
99
+ return this.blockProductionCheckInterval * ProducerActor.HeadResubmissionMultiplier;
104
100
  }
105
101
  get mempoolRunner() {
106
102
  return this._mempoolRunner;
@@ -113,22 +109,53 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
113
109
  }
114
110
  async createHandler() {
115
111
  await super.createHandler();
116
- this._metricAttributes = {
117
- address: this.account.address.toString()
118
- };
119
- this._producerActorBlockProductionChecks = this.counter("producer_actor_block_production_checks", "Number of block production checks");
120
- this._producerActorBlockProductionAttempts = this.counter("producer_actor_block_production_attempts", "Number of block production attempts");
121
- this._producerActorBlocksProduced = this.counter("producer_actor_blocks_produced", "Number of blocks produced");
122
- this._producerActorBlocksPublished = this.counter("producer_actor_blocks_published", "Number of blocks published");
112
+ this._metricAttributes = { address: this.account.address.toString() };
113
+ this._producerActorBlockProductionChecks = this.counter(
114
+ "producer_actor_block_production_checks",
115
+ "Number of block production checks"
116
+ );
117
+ this._producerActorBlockProductionAttempts = this.counter(
118
+ "producer_actor_block_production_attempts",
119
+ "Number of block production attempts"
120
+ );
121
+ this._producerActorBlocksProduced = this.counter(
122
+ "producer_actor_blocks_produced",
123
+ "Number of blocks produced"
124
+ );
125
+ this._producerActorBlocksPublished = this.counter(
126
+ "producer_actor_blocks_published",
127
+ "Number of blocks published"
128
+ );
123
129
  const final = await this.locator?.getInstance(FinalizationViewerMoniker);
124
130
  await final.start();
125
- this._accountBalanceViewer = assertEx(await this.locator?.getInstance(AccountBalanceViewerMoniker), () => "Unable to locate AccountBalanceViewer");
126
- this._blockRunner = assertEx(await this.locator?.getInstance(BlockRunnerMoniker), () => "Unable to locate BlockRunner");
127
- this._blockViewer = assertEx(await this.locator?.getInstance(BlockViewerMoniker), () => "Unable to locate BlockViewer");
128
- this._chainContractViewer = assertEx(await this.locator?.getInstance(ChainContractViewerMoniker), () => "Unable to locate ChainContractViewer");
129
- this._mempoolRunner = assertEx(await this.locator?.getInstance(MempoolRunnerMoniker), () => "Unable to locate MempoolRunner");
130
- this._mempoolViewer = assertEx(await this.locator?.getInstance(MempoolViewerMoniker), () => "Unable to locate MempoolViewer");
131
- this._stakeTotalsViewer = assertEx(await this.locator?.getInstance(StakeTotalsViewerMoniker), () => "Unable to locate StakeTotalsViewer");
131
+ this._accountBalanceViewer = assertEx(
132
+ await this.locator?.getInstance(AccountBalanceViewerMoniker),
133
+ () => "Unable to locate AccountBalanceViewer"
134
+ );
135
+ this._blockRunner = assertEx(
136
+ await this.locator?.getInstance(BlockRunnerMoniker),
137
+ () => "Unable to locate BlockRunner"
138
+ );
139
+ this._blockViewer = assertEx(
140
+ await this.locator?.getInstance(BlockViewerMoniker),
141
+ () => "Unable to locate BlockViewer"
142
+ );
143
+ this._chainContractViewer = assertEx(
144
+ await this.locator?.getInstance(ChainContractViewerMoniker),
145
+ () => "Unable to locate ChainContractViewer"
146
+ );
147
+ this._mempoolRunner = assertEx(
148
+ await this.locator?.getInstance(MempoolRunnerMoniker),
149
+ () => "Unable to locate MempoolRunner"
150
+ );
151
+ this._mempoolViewer = assertEx(
152
+ await this.locator?.getInstance(MempoolViewerMoniker),
153
+ () => "Unable to locate MempoolViewer"
154
+ );
155
+ this._stakeTotalsViewer = assertEx(
156
+ await this.locator?.getInstance(StakeTotalsViewerMoniker),
157
+ () => "Unable to locate StakeTotalsViewer"
158
+ );
132
159
  this._chainId = await this.chainContractViewer.chainId();
133
160
  }
134
161
  // async initLocator() {
@@ -202,9 +229,7 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
202
229
  const displayBlockNumber = toFormattedBlockReference(nextBlock[0]);
203
230
  this.logger?.log("Produced block:", displayBlockNumber);
204
231
  this._producerActorBlocksProduced.add(1, this._metricAttributes);
205
- await this.mempoolRunner.submitBlocks([
206
- nextBlock
207
- ]);
232
+ await this.mempoolRunner.submitBlocks([nextBlock]);
208
233
  this.logger?.log("Published block:", displayBlockNumber);
209
234
  this._producerActorBlocksPublished.add(1, this._metricAttributes);
210
235
  this._lastProducedBlock = nextBlock;
@@ -212,10 +237,7 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
212
237
  this.logger?.log("No block produced for submission.");
213
238
  }
214
239
  });
215
- }, {
216
- ...this.context,
217
- timeBudgetLimit: 1e3
218
- });
240
+ }, { ...this.context, timeBudgetLimit: 1e3 });
219
241
  }
220
242
  async readyHandler() {
221
243
  await this.produceBlock();
@@ -227,7 +249,7 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
227
249
  if (isUndefined(head)) return;
228
250
  const currentBlock = head.block;
229
251
  const blocksUntilExpiration = this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock);
230
- if (blocksUntilExpiration > _ProducerActor.RedeclarationWindow * 0.1) {
252
+ if (blocksUntilExpiration > ProducerActor.RedeclarationWindow * 0.1) {
231
253
  this._lastRedeclarationIntent = void 0;
232
254
  return;
233
255
  }
@@ -236,40 +258,45 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
236
258
  this._lastRedeclarationIntent = void 0;
237
259
  }
238
260
  if (!await this.validateCurrentBalance()) {
239
- this.logger?.error(`Add balance to address ${this.account.address} for the producer to declare it's intent.`);
261
+ this.logger?.error(
262
+ `Add balance to address ${this.account.address} for the producer to declare it's intent.`
263
+ );
240
264
  return;
241
265
  }
242
266
  if (!await this.validateCurrentStake()) {
243
- this.logger?.error(`Add stake to contract address ${this.chainId} for the producer to declare it's intent.`);
267
+ this.logger?.error(
268
+ `Add stake to contract address ${this.chainId} for the producer to declare it's intent.`
269
+ );
244
270
  return;
245
271
  }
246
272
  this.logger?.log("Creating redeclaration intent for producer:", this.account.address);
247
- const redeclarationIntent = createDeclarationIntent(this.account.address, "producer", currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration);
273
+ const redeclarationIntent = createDeclarationIntent(
274
+ this.account.address,
275
+ "producer",
276
+ currentBlock,
277
+ currentBlock + SimpleBlockRunner.RedeclarationDuration
278
+ );
248
279
  await this.submitRedeclarationIntent(currentBlock, redeclarationIntent);
249
280
  this._lastRedeclarationIntent = redeclarationIntent;
250
- }, {
251
- ...this.context,
252
- timeBudgetLimit: 1e3
253
- });
281
+ }, { ...this.context, timeBudgetLimit: 1e3 });
254
282
  }
255
283
  async submitRedeclarationIntent(currentBlock, redeclarationIntent) {
256
284
  this.logger?.log("Submitting redeclaration intent for producer:", this.account.address);
257
- const tx = await buildTransaction(this.chainId, [
258
- redeclarationIntent
259
- ], [], this.account, currentBlock, asXL1BlockNumber(currentBlock + 1e3, true));
260
- await this.mempoolRunner.submitTransactions([
261
- tx
262
- ]);
285
+ const tx = await buildTransaction(
286
+ this.chainId,
287
+ [redeclarationIntent],
288
+ [],
289
+ this.account,
290
+ currentBlock,
291
+ asXL1BlockNumber(currentBlock + 1e3, true)
292
+ );
293
+ await this.mempoolRunner.submitTransactions([tx]);
263
294
  this.logger?.log("Submitted redeclaration intent for producer:", this.account.address);
264
295
  }
265
296
  async validateCurrentBalance() {
266
297
  const head = (await this.blockViewer.currentBlock())?.[0]?._hash;
267
298
  if (isDefined(head)) {
268
- const balances = await this.accountBalanceViewer.accountBalances([
269
- this.account.address
270
- ], {
271
- head
272
- });
299
+ const balances = await this.accountBalanceViewer.accountBalances([this.account.address], { head });
273
300
  const currentBalance = balances[this.account.address] ?? 0n;
274
301
  if (currentBalance <= 0n) {
275
302
  this.logger?.error(`Producer ${this.account.address} has no balance.`);
@@ -289,33 +316,53 @@ var ProducerActor = class _ProducerActor extends ActorV3 {
289
316
  return true;
290
317
  }
291
318
  };
292
- ProducerActor = _ts_decorate([
319
+ /**
320
+ * The default interval time (in MS) between block production attempts.
321
+ */
322
+ __publicField(ProducerActor, "DefaultBlockProductionCheckInterval", DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL);
323
+ /**
324
+ * The multiplier applied to the block production check interval to determine
325
+ * the threshold for resubmitting the same block number if the head has not changed.
326
+ */
327
+ __publicField(ProducerActor, "HeadResubmissionMultiplier", 30);
328
+ /**
329
+ * The window (in blocks) before expiration to attempt redeclaration of producer intent.
330
+ */
331
+ __publicField(ProducerActor, "RedeclarationWindow", 1e3);
332
+ __publicField(ProducerActor, "needs", {
333
+ required: [
334
+ AccountBalanceViewerMoniker,
335
+ BlockRunnerMoniker,
336
+ BlockViewerMoniker,
337
+ ChainContractViewerMoniker,
338
+ FinalizationViewerMoniker,
339
+ MempoolRunnerMoniker,
340
+ MempoolViewerMoniker,
341
+ StakeTotalsViewerMoniker
342
+ ]
343
+ });
344
+ ProducerActor = __decorateClass([
293
345
  creatable()
294
346
  ], ProducerActor);
295
347
 
296
348
  // src/run.ts
297
- var getProducerActor = /* @__PURE__ */ __name(async (config, locator) => {
298
- const account = await initActorWallet({
299
- ...locator.context,
300
- config
301
- });
349
+ var getProducerActor = async (config, locator) => {
350
+ const account = await initActorWallet({ ...locator.context, config });
302
351
  return await ProducerActor.create({
303
352
  config,
304
353
  locator,
305
354
  name: "xl1-producer",
306
355
  account
307
356
  });
308
- }, "getProducerActor");
309
- var runProducer = /* @__PURE__ */ __name(async (config, orchestrator, locator) => {
357
+ };
358
+ var runProducer = async (config, orchestrator, locator) => {
310
359
  const producer = await getProducerActor(config, locator);
311
- const actors = [
312
- producer
313
- ].filter(exists);
360
+ const actors = [producer].filter(exists);
314
361
  for (const actor of actors) {
315
362
  await orchestrator.registerActor(actor);
316
363
  }
317
364
  await orchestrator.start();
318
- }, "runProducer");
365
+ };
319
366
 
320
367
  // src/command.ts
321
368
  function producerCommand(getConfiguration, getLocatorsFromConfig) {
@@ -323,20 +370,17 @@ function producerCommand(getConfiguration, getLocatorsFromConfig) {
323
370
  command: "producer",
324
371
  deprecated: 'Use "start producer" instead',
325
372
  describe: "Run a XL1 Producer Node",
326
- handler: /* @__PURE__ */ __name(async () => {
373
+ handler: async () => {
327
374
  const configuration = getConfiguration();
328
- const { locators, orchestrator } = await getLocatorsFromConfig([
329
- "producer"
330
- ], configuration);
375
+ const { locators, orchestrator } = await getLocatorsFromConfig(["producer"], configuration);
331
376
  await runProducer(ProducerConfigZod.parse(locators["producer"].context.config), orchestrator, locators["producer"]);
332
- }, "handler")
377
+ }
333
378
  };
334
379
  }
335
- __name(producerCommand, "producerCommand");
336
380
  export {
337
381
  ProducerActor,
338
382
  getProducerActor,
339
383
  producerCommand,
340
384
  runProducer
341
385
  };
342
- //# sourceMappingURL=index.mjs.map
386
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/command.ts","../../src/run.ts","../../src/ProducerActor.ts"],"sourcesContent":["import type { GetLocatorsFromConfig } from '@xyo-network/chain-orchestration'\nimport { ProducerConfigZod } from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport type { CommandModule } from 'yargs'\n\nimport { runProducer } from './run.ts'\n\nexport function producerCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: 'producer',\n deprecated: 'Use \"start producer\" instead',\n describe: 'Run a XL1 Producer Node',\n handler: async () => {\n const configuration = getConfiguration()\n const { locators, orchestrator } = await getLocatorsFromConfig(['producer'], configuration)\n await runProducer(ProducerConfigZod.parse(locators['producer'].context.config), orchestrator, locators['producer'])\n },\n }\n}\n","import type { CreatableName } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport {\n initActorWallet,\n type OrchestratorInstance,\n type ProducerConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\n\nimport type { ProducerActorParams } from './ProducerActor.ts'\nimport { ProducerActor } from './ProducerActor.ts'\n\nexport const getProducerActor = async (\n config: ProducerConfig,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ProducerActor> => {\n const account = await initActorWallet({ ...locator.context, config })\n return await ProducerActor.create({\n config, locator, name: 'xl1-producer' as CreatableName, account,\n } satisfies ProducerActorParams)\n}\n\nexport const runProducer = async (\n config: ProducerConfig,\n orchestrator: OrchestratorInstance,\n locator: ProviderFactoryLocatorInstance,\n) => {\n const producer = await getProducerActor(config, locator)\n const actors = [producer].filter(exists)\n\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport {\n assertEx, creatable, isDefined, isUndefined,\n toHex,\n} from '@xylabs/sdk-js'\nimport {\n type ActorCapabilityNeeds,\n type ActorParamsV3,\n ActorV3,\n DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL,\n type ProducerConfig,\n} from '@xyo-network/chain-orchestration'\nimport { SimpleBlockRunner } from '@xyo-network/chain-services'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer,\n BlockBoundWitness,\n BlockRunner, BlockViewer, ChainContractViewer, ChainId, ChainStakeIntent, FinalizationViewer, HydratedBlockWithHashMeta, MempoolRunner,\n MempoolViewer, StakeTotalsViewer, XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asXL1BlockNumber, BlockRunnerMoniker, BlockViewerMoniker,\n buildTransaction, ChainContractViewerMoniker, createDeclarationIntent, FinalizationViewerMoniker, MempoolRunnerMoniker, MempoolViewerMoniker, StakeTotalsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport type ProducerActorParams = ActorParamsV3<{\n config: ProducerConfig\n}>\n\nconst SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true\nconst TEN_MINUTES = 10 * 60 * 1000 // 10 minutes in milliseconds\n\n/**\n * Formats a hydrated block with hash meta into a string representation of its hash and block number.\n * @param blockBoundWitness The hydrated block with hash meta to format\n * @returns The formatted block reference string\n */\nconst toFormattedBlockReference = (blockBoundWitness: WithHashMeta<BlockBoundWitness>): string => {\n return `${blockBoundWitness.block} [${toHex(blockBoundWitness._hash, { prefix: true })}]`\n}\n\n@creatable()\nexport class ProducerActor extends ActorV3<ProducerActorParams> {\n /**\n * The default interval time (in MS) between block production attempts.\n */\n static readonly DefaultBlockProductionCheckInterval = DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL\n\n /**\n * The multiplier applied to the block production check interval to determine\n * the threshold for resubmitting the same block number if the head has not changed.\n */\n static readonly HeadResubmissionMultiplier = 30\n\n /**\n * The window (in blocks) before expiration to attempt redeclaration of producer intent.\n */\n static readonly RedeclarationWindow = 1000\n\n static readonly needs: ActorCapabilityNeeds = {\n required: [\n AccountBalanceViewerMoniker,\n BlockRunnerMoniker,\n BlockViewerMoniker,\n ChainContractViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n StakeTotalsViewerMoniker,\n ],\n }\n\n protected _lastProducedBlock?: HydratedBlockWithHashMeta\n protected _lastRedeclarationIntent?: ChainStakeIntent\n protected _metricAttributes?: Attributes\n protected _producerActorBlockProductionAttempts!: Counter<Attributes>\n protected _producerActorBlockProductionChecks!: Counter<Attributes>\n protected _producerActorBlocksProduced!: Counter<Attributes>\n protected _producerActorBlocksPublished!: Counter<Attributes>\n\n private _accountBalanceViewer?: AccountBalanceViewer\n private _blockRunner?: BlockRunner\n private _blockViewer?: BlockViewer\n private _chainContractViewer?: ChainContractViewer\n private _chainId?: ChainId\n private _lastHeadChangeTime?: number\n private _lastHeadHash?: string\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _produceBlockMutex = new Mutex()\n private _stakeTotalsViewer?: StakeTotalsViewer\n\n override get logger() {\n return assertEx(super.logger, () => 'Logger is required for ProducerActor')\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get blockProductionCheckInterval() {\n return this.config.blockProductionCheckInterval ?? ProducerActor.DefaultBlockProductionCheckInterval\n }\n\n protected get blockRunner() {\n return this._blockRunner!\n }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n protected get chainContractViewer() {\n return this._chainContractViewer!\n }\n\n protected get chainId() {\n return this._chainId!\n }\n\n protected get config() {\n return this.params.config\n }\n\n protected get headResubmissionThreshold() {\n return this.blockProductionCheckInterval * ProducerActor.HeadResubmissionMultiplier\n }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n protected get stakeTotalsViewer() {\n return this._stakeTotalsViewer!\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create the consistent meter attributes that will\n // be included with all metrics from this actor\n this._metricAttributes = { address: this.account.address.toString() }\n // Create the metrics\n this._producerActorBlockProductionChecks = this.counter(\n 'producer_actor_block_production_checks',\n 'Number of block production checks',\n )\n this._producerActorBlockProductionAttempts = this.counter(\n 'producer_actor_block_production_attempts',\n 'Number of block production attempts',\n )\n this._producerActorBlocksProduced = this.counter(\n 'producer_actor_blocks_produced',\n 'Number of blocks produced',\n )\n this._producerActorBlocksPublished = this.counter(\n 'producer_actor_blocks_published',\n 'Number of blocks published',\n )\n const final = await this.locator?.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n await final.start()\n this._accountBalanceViewer = assertEx(\n await this.locator?.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker),\n () => 'Unable to locate AccountBalanceViewer',\n )\n this._blockRunner = assertEx(\n await this.locator?.getInstance<BlockRunner>(BlockRunnerMoniker),\n () => 'Unable to locate BlockRunner',\n )\n this._blockViewer = assertEx(\n await this.locator?.getInstance<BlockViewer>(BlockViewerMoniker),\n () => 'Unable to locate BlockViewer',\n )\n this._chainContractViewer = assertEx(\n await this.locator?.getInstance<ChainContractViewer>(ChainContractViewerMoniker),\n () => 'Unable to locate ChainContractViewer',\n )\n this._mempoolRunner = assertEx(\n await this.locator?.getInstance<MempoolRunner>(MempoolRunnerMoniker),\n () => 'Unable to locate MempoolRunner',\n )\n this._mempoolViewer = assertEx(\n await this.locator?.getInstance<MempoolViewer>(MempoolViewerMoniker),\n () => 'Unable to locate MempoolViewer',\n )\n this._stakeTotalsViewer = assertEx(\n await this.locator?.getInstance<StakeTotalsViewer>(StakeTotalsViewerMoniker),\n () => 'Unable to locate StakeTotalsViewer',\n )\n this._chainId = await this.chainContractViewer.chainId()\n }\n\n // async initLocator() {\n // const config = this.config\n // const endpoint = assertEx(config.services.apiEndpoint, () => 'API endpoint is required in config.services.apiEndpoint')\n // const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)\n // const locator = await buildJsonRpcProviderLocatorV2(config, transportFactory)\n\n // const version = '1.0.0'\n // const telemetryConfig = buildTelemetryConfig(config, this.name, version, DefaultMetricsScrapePorts.producer)\n // const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n // locator.context.traceProvider = traceProvider\n // locator.context.meterProvider = meterProvider\n\n // locator.register(SimpleBlockRewardViewer.factory<SimpleBlockRewardViewer>(SimpleBlockRewardViewer.dependencies, {}))\n // locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n // SimpleBlockValidationViewer.dependencies,\n // { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n // ))\n // locator.register(SimpleBlockRunner.factory<SimpleBlockRunner>(\n // SimpleBlockRunner.dependencies,\n // { account: this.params.account, rewardAddress: this.params.rewardAddress },\n // ))\n // return await initEvmProvidersIfAvailable(locator)\n // }\n\n override async startHandler() {\n await super.startHandler()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.produceBlock()\n }, 2000, this.blockProductionCheckInterval)\n\n if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {\n // Register a timer to check if we should redeclare the producer\n this.registerTimer('ProducerRedeclarationTimer', async () => {\n await this.redeclareIntent()\n }, TEN_MINUTES, TEN_MINUTES)\n }\n }\n\n protected calculateBlocksUntilProducerDeclarationExpiration(currentBlock: number): number {\n return (this._lastRedeclarationIntent?.exp ?? currentBlock) - currentBlock\n }\n\n protected async produceBlock(): Promise<void> {\n this._producerActorBlockProductionChecks.add(1, this._metricAttributes)\n await this.spanAsync('produceBlock', async () => {\n if (this._produceBlockMutex.isLocked()) {\n this.logger?.debug('Skipping block production, previous production still in progress')\n return\n }\n\n await this._produceBlockMutex.runExclusive(async () => {\n // Get the updated head\n const head = (await this.blockViewer.currentBlock())[0]\n const headHash = head._hash\n\n // Track head changes\n const currentTime = Date.now()\n if (this._lastHeadHash !== headHash) {\n const lastHeadHashHex = isDefined(this._lastHeadHash) ? `0x${this._lastHeadHash}` : 'undefined'\n const currentHeadHashHex = `0x${headHash}`\n this.logger?.log(`Found updated head ${lastHeadHashHex} -> ${currentHeadHashHex}`)\n this._lastHeadHash = headHash\n this._lastHeadChangeTime = currentTime\n }\n\n // Check if we should resubmit due to stale head\n const timeSinceHeadChange = isDefined(this._lastHeadChangeTime) ? currentTime - this._lastHeadChangeTime : 0\n\n // If we have never produced a block or the last produced block was not built on the current head we\n // need to attempt to produce a new block\n const shouldSubmit = !this._lastProducedBlock || this._lastProducedBlock[0].previous !== headHash\n\n // If the head has not changed determine if we should resubmit again based on head staleness\n const shouldResubmit = timeSinceHeadChange > this.headResubmissionThreshold\n\n // Determine if we should submit or resubmit\n const shouldSubmitBlock = shouldSubmit || shouldResubmit\n\n if (!shouldSubmitBlock) {\n this.logger?.debug('No block submission required at this time.')\n return\n }\n\n if (shouldResubmit) {\n this.logger?.log(`Resubmitting block due to stale head. Head ${toFormattedBlockReference(head)} unchanged for ${timeSinceHeadChange}ms`)\n this._lastHeadChangeTime = currentTime\n }\n this._producerActorBlockProductionAttempts.add(1, this._metricAttributes)\n // Produce the next block (do not pass force — undefined result is valid when idle)\n const nextBlock = await this.blockRunner.produceNextBlock(head)\n if (nextBlock) {\n const displayBlockNumber = toFormattedBlockReference(nextBlock[0])\n this.logger?.log('Produced block:', displayBlockNumber)\n this._producerActorBlocksProduced.add(1, this._metricAttributes)\n await this.mempoolRunner.submitBlocks([nextBlock])\n this.logger?.log('Published block:', displayBlockNumber)\n this._producerActorBlocksPublished.add(1, this._metricAttributes)\n this._lastProducedBlock = nextBlock\n } else {\n this.logger?.log('No block produced for submission.')\n }\n })\n }, { ...this.context, timeBudgetLimit: 1000 })\n }\n\n protected override async readyHandler(): Promise<void> {\n // Warm pass: prove the production loop reaches its dependencies before declaring ready.\n await this.produceBlock()\n }\n\n protected async redeclareIntent(): Promise<void> {\n await this.spanAsync('redeclareIntent', async () => {\n // Decide if we should redeclare intent\n if (this.config.disableIntentRedeclaration) return\n\n // Get the current block\n const head = (await this.blockViewer.currentBlock())[0]\n if (isUndefined(head)) return\n const currentBlock = head.block\n\n // // Calculate the time until the producer's declaration expires\n const blocksUntilExpiration = this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock)\n\n // Allow the producer time to redeclare itself via block production\n // (for free) before submitting a redeclaration intent transaction.\n if (blocksUntilExpiration > ProducerActor.RedeclarationWindow * 0.1) {\n // Clear any previous redeclaration intent\n this._lastRedeclarationIntent = undefined\n // No need to redeclare yet\n return\n }\n\n // If we already have a valid redeclaration intent, do not create another\n // unless it has expired.\n if (this._lastRedeclarationIntent) {\n // Check if the last redeclaration intent is still valid\n if (this._lastRedeclarationIntent.exp > currentBlock) return\n // If it has expired, clear the last redeclaration intent\n this._lastRedeclarationIntent = undefined\n }\n\n // Check if we have a valid balance before declaring intent\n if (!(await this.validateCurrentBalance())) {\n this.logger?.error(\n `Add balance to address ${this.account.address} for the producer to declare it's intent.`,\n )\n return\n }\n\n // Check if we have a valid stake before declaring intent\n if (!(await this.validateCurrentStake())) {\n this.logger?.error(\n `Add stake to contract address ${this.chainId}`\n + ' for the producer to declare it\\'s intent.',\n )\n return\n }\n\n // Create a redeclaration intent\n this.logger?.log('Creating redeclaration intent for producer:', this.account.address)\n const redeclarationIntent = createDeclarationIntent(\n this.account.address,\n 'producer',\n currentBlock,\n currentBlock + SimpleBlockRunner.RedeclarationDuration,\n )\n\n // Submit the redeclaration intent\n await this.submitRedeclarationIntent(currentBlock, redeclarationIntent)\n\n // On successful submission, save the redeclaration intent\n this._lastRedeclarationIntent = redeclarationIntent\n }, { ...this.context, timeBudgetLimit: 1000 })\n }\n\n protected async submitRedeclarationIntent(currentBlock: XL1BlockNumber, redeclarationIntent: ChainStakeIntent): Promise<void> {\n this.logger?.log('Submitting redeclaration intent for producer:', this.account.address)\n // Create a transaction to submit the redeclaration intent\n const tx = await buildTransaction(\n this.chainId,\n [redeclarationIntent],\n [],\n this.account,\n currentBlock,\n asXL1BlockNumber(currentBlock + 1000, true),\n )\n\n // Submit the redeclaration intent\n await this.mempoolRunner.submitTransactions([tx])\n\n this.logger?.log('Submitted redeclaration intent for producer:', this.account.address)\n }\n\n protected async validateCurrentBalance(): Promise<boolean> {\n // Check if we have a valid balance before declaring intent\n const head = (await this.blockViewer.currentBlock())?.[0]?._hash\n if (isDefined(head)) {\n const balances = await this.accountBalanceViewer.accountBalances([this.account.address], { head })\n const currentBalance = balances[this.account.address] ?? 0n\n if (currentBalance <= 0n) {\n this.logger?.error(`Producer ${this.account.address} has no balance.`)\n return false\n }\n return true\n }\n return true\n }\n\n protected async validateCurrentStake(): Promise<boolean> {\n // Use StakeIntentService to get the required minimum stake\n const requiredMinimumStake = 1n // this.stakeIntentService.getRequiredMinimumStakeForIntent('producer')\n // Check if we have a valid stake before declaring intent\n const currentStake = await this.stakeTotalsViewer.activeByStaked(this.account.address)\n if (currentStake < requiredMinimumStake) {\n this.logger?.error(`Producer ${this.account.address} has insufficient stake.`)\n return false\n }\n return true\n }\n}\n"],"mappings":"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","names":["ProducerConfigZod","exists","initActorWallet","assertEx","creatable","isDefined","isUndefined","toHex","ActorV3","DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL","SimpleBlockRunner","AccountBalanceViewerMoniker","asXL1BlockNumber","BlockRunnerMoniker","BlockViewerMoniker","buildTransaction","ChainContractViewerMoniker","createDeclarationIntent","FinalizationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","StakeTotalsViewerMoniker","Mutex","SHOULD_REGISTER_REDECLARATION_INTENT_TIMER","TEN_MINUTES","toFormattedBlockReference","blockBoundWitness","block","toHex","_hash","prefix","ProducerActor","ActorV3","DefaultBlockProductionCheckInterval","DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL","HeadResubmissionMultiplier","RedeclarationWindow","needs","required","AccountBalanceViewerMoniker","BlockRunnerMoniker","BlockViewerMoniker","ChainContractViewerMoniker","FinalizationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","StakeTotalsViewerMoniker","_lastProducedBlock","_lastRedeclarationIntent","_metricAttributes","_producerActorBlockProductionAttempts","_producerActorBlockProductionChecks","_producerActorBlocksProduced","_producerActorBlocksPublished","_accountBalanceViewer","_blockRunner","_blockViewer","_chainContractViewer","_chainId","_lastHeadChangeTime","_lastHeadHash","_mempoolRunner","_mempoolViewer","_produceBlockMutex","Mutex","_stakeTotalsViewer","logger","assertEx","accountBalanceViewer","blockProductionCheckInterval","config","blockRunner","blockViewer","chainContractViewer","chainId","params","headResubmissionThreshold","mempoolRunner","mempoolViewer","stakeTotalsViewer","createHandler","address","account","toString","counter","final","locator","getInstance","start","startHandler","registerTimer","produceBlock","redeclareIntent","calculateBlocksUntilProducerDeclarationExpiration","currentBlock","exp","add","spanAsync","isLocked","debug","runExclusive","head","headHash","currentTime","Date","now","lastHeadHashHex","isDefined","currentHeadHashHex","log","timeSinceHeadChange","shouldSubmit","previous","shouldResubmit","shouldSubmitBlock","nextBlock","produceNextBlock","displayBlockNumber","submitBlocks","context","timeBudgetLimit","readyHandler","disableIntentRedeclaration","isUndefined","blocksUntilExpiration","undefined","validateCurrentBalance","error","validateCurrentStake","redeclarationIntent","createDeclarationIntent","SimpleBlockRunner","RedeclarationDuration","submitRedeclarationIntent","tx","buildTransaction","asXL1BlockNumber","submitTransactions","balances","accountBalances","currentBalance","requiredMinimumStake","currentStake","activeByStaked","getProducerActor","config","locator","account","initActorWallet","context","ProducerActor","create","name","runProducer","orchestrator","producer","actors","filter","exists","actor","registerActor","start","producerCommand","getConfiguration","getLocatorsFromConfig","command","deprecated","describe","handler","configuration","locators","orchestrator","runProducer","ProducerConfigZod","parse","context","config"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/command.ts", "../../src/run.ts", "../../src/ProducerActor.ts"],
4
+ "sourcesContent": ["import type { GetLocatorsFromConfig } from '@xyo-network/chain-orchestration'\nimport { ProducerConfigZod } from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport type { CommandModule } from 'yargs'\n\nimport { runProducer } from './run.ts'\n\nexport function producerCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: 'producer',\n deprecated: 'Use \"start producer\" instead',\n describe: 'Run a XL1 Producer Node',\n handler: async () => {\n const configuration = getConfiguration()\n const { locators, orchestrator } = await getLocatorsFromConfig(['producer'], configuration)\n await runProducer(ProducerConfigZod.parse(locators['producer'].context.config), orchestrator, locators['producer'])\n },\n }\n}\n", "import type { CreatableName } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport {\n initActorWallet,\n type OrchestratorInstance,\n type ProducerConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\n\nimport type { ProducerActorParams } from './ProducerActor.ts'\nimport { ProducerActor } from './ProducerActor.ts'\n\nexport const getProducerActor = async (\n config: ProducerConfig,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ProducerActor> => {\n const account = await initActorWallet({ ...locator.context, config })\n return await ProducerActor.create({\n config, locator, name: 'xl1-producer' as CreatableName, account,\n } satisfies ProducerActorParams)\n}\n\nexport const runProducer = async (\n config: ProducerConfig,\n orchestrator: OrchestratorInstance,\n locator: ProviderFactoryLocatorInstance,\n) => {\n const producer = await getProducerActor(config, locator)\n const actors = [producer].filter(exists)\n\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n}\n", "import type { Attributes, Counter } from '@opentelemetry/api'\nimport {\n assertEx, creatable, isDefined, isUndefined,\n toHex,\n} from '@xylabs/sdk-js'\nimport {\n type ActorCapabilityNeeds,\n type ActorParamsV3,\n ActorV3,\n DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL,\n type ProducerConfig,\n} from '@xyo-network/chain-orchestration'\nimport { SimpleBlockRunner } from '@xyo-network/chain-services'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer,\n BlockBoundWitness,\n BlockRunner, BlockViewer, ChainContractViewer, ChainId, ChainStakeIntent, FinalizationViewer, HydratedBlockWithHashMeta, MempoolRunner,\n MempoolViewer, StakeTotalsViewer, XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asXL1BlockNumber, BlockRunnerMoniker, BlockViewerMoniker,\n buildTransaction, ChainContractViewerMoniker, createDeclarationIntent, FinalizationViewerMoniker, MempoolRunnerMoniker, MempoolViewerMoniker, StakeTotalsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport type ProducerActorParams = ActorParamsV3<{\n config: ProducerConfig\n}>\n\nconst SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true\nconst TEN_MINUTES = 10 * 60 * 1000 // 10 minutes in milliseconds\n\n/**\n * Formats a hydrated block with hash meta into a string representation of its hash and block number.\n * @param blockBoundWitness The hydrated block with hash meta to format\n * @returns The formatted block reference string\n */\nconst toFormattedBlockReference = (blockBoundWitness: WithHashMeta<BlockBoundWitness>): string => {\n return `${blockBoundWitness.block} [${toHex(blockBoundWitness._hash, { prefix: true })}]`\n}\n\n@creatable()\nexport class ProducerActor extends ActorV3<ProducerActorParams> {\n /**\n * The default interval time (in MS) between block production attempts.\n */\n static readonly DefaultBlockProductionCheckInterval = DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL\n\n /**\n * The multiplier applied to the block production check interval to determine\n * the threshold for resubmitting the same block number if the head has not changed.\n */\n static readonly HeadResubmissionMultiplier = 30\n\n /**\n * The window (in blocks) before expiration to attempt redeclaration of producer intent.\n */\n static readonly RedeclarationWindow = 1000\n\n static readonly needs: ActorCapabilityNeeds = {\n required: [\n AccountBalanceViewerMoniker,\n BlockRunnerMoniker,\n BlockViewerMoniker,\n ChainContractViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n StakeTotalsViewerMoniker,\n ],\n }\n\n protected _lastProducedBlock?: HydratedBlockWithHashMeta\n protected _lastRedeclarationIntent?: ChainStakeIntent\n protected _metricAttributes?: Attributes\n protected _producerActorBlockProductionAttempts!: Counter<Attributes>\n protected _producerActorBlockProductionChecks!: Counter<Attributes>\n protected _producerActorBlocksProduced!: Counter<Attributes>\n protected _producerActorBlocksPublished!: Counter<Attributes>\n\n private _accountBalanceViewer?: AccountBalanceViewer\n private _blockRunner?: BlockRunner\n private _blockViewer?: BlockViewer\n private _chainContractViewer?: ChainContractViewer\n private _chainId?: ChainId\n private _lastHeadChangeTime?: number\n private _lastHeadHash?: string\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _produceBlockMutex = new Mutex()\n private _stakeTotalsViewer?: StakeTotalsViewer\n\n override get logger() {\n return assertEx(super.logger, () => 'Logger is required for ProducerActor')\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get blockProductionCheckInterval() {\n return this.config.blockProductionCheckInterval ?? ProducerActor.DefaultBlockProductionCheckInterval\n }\n\n protected get blockRunner() {\n return this._blockRunner!\n }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n protected get chainContractViewer() {\n return this._chainContractViewer!\n }\n\n protected get chainId() {\n return this._chainId!\n }\n\n protected get config() {\n return this.params.config\n }\n\n protected get headResubmissionThreshold() {\n return this.blockProductionCheckInterval * ProducerActor.HeadResubmissionMultiplier\n }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n protected get stakeTotalsViewer() {\n return this._stakeTotalsViewer!\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create the consistent meter attributes that will\n // be included with all metrics from this actor\n this._metricAttributes = { address: this.account.address.toString() }\n // Create the metrics\n this._producerActorBlockProductionChecks = this.counter(\n 'producer_actor_block_production_checks',\n 'Number of block production checks',\n )\n this._producerActorBlockProductionAttempts = this.counter(\n 'producer_actor_block_production_attempts',\n 'Number of block production attempts',\n )\n this._producerActorBlocksProduced = this.counter(\n 'producer_actor_blocks_produced',\n 'Number of blocks produced',\n )\n this._producerActorBlocksPublished = this.counter(\n 'producer_actor_blocks_published',\n 'Number of blocks published',\n )\n const final = await this.locator?.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n await final.start()\n this._accountBalanceViewer = assertEx(\n await this.locator?.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker),\n () => 'Unable to locate AccountBalanceViewer',\n )\n this._blockRunner = assertEx(\n await this.locator?.getInstance<BlockRunner>(BlockRunnerMoniker),\n () => 'Unable to locate BlockRunner',\n )\n this._blockViewer = assertEx(\n await this.locator?.getInstance<BlockViewer>(BlockViewerMoniker),\n () => 'Unable to locate BlockViewer',\n )\n this._chainContractViewer = assertEx(\n await this.locator?.getInstance<ChainContractViewer>(ChainContractViewerMoniker),\n () => 'Unable to locate ChainContractViewer',\n )\n this._mempoolRunner = assertEx(\n await this.locator?.getInstance<MempoolRunner>(MempoolRunnerMoniker),\n () => 'Unable to locate MempoolRunner',\n )\n this._mempoolViewer = assertEx(\n await this.locator?.getInstance<MempoolViewer>(MempoolViewerMoniker),\n () => 'Unable to locate MempoolViewer',\n )\n this._stakeTotalsViewer = assertEx(\n await this.locator?.getInstance<StakeTotalsViewer>(StakeTotalsViewerMoniker),\n () => 'Unable to locate StakeTotalsViewer',\n )\n this._chainId = await this.chainContractViewer.chainId()\n }\n\n // async initLocator() {\n // const config = this.config\n // const endpoint = assertEx(config.services.apiEndpoint, () => 'API endpoint is required in config.services.apiEndpoint')\n // const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)\n // const locator = await buildJsonRpcProviderLocatorV2(config, transportFactory)\n\n // const version = '1.0.0'\n // const telemetryConfig = buildTelemetryConfig(config, this.name, version, DefaultMetricsScrapePorts.producer)\n // const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n // locator.context.traceProvider = traceProvider\n // locator.context.meterProvider = meterProvider\n\n // locator.register(SimpleBlockRewardViewer.factory<SimpleBlockRewardViewer>(SimpleBlockRewardViewer.dependencies, {}))\n // locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n // SimpleBlockValidationViewer.dependencies,\n // { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n // ))\n // locator.register(SimpleBlockRunner.factory<SimpleBlockRunner>(\n // SimpleBlockRunner.dependencies,\n // { account: this.params.account, rewardAddress: this.params.rewardAddress },\n // ))\n // return await initEvmProvidersIfAvailable(locator)\n // }\n\n override async startHandler() {\n await super.startHandler()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.produceBlock()\n }, 2000, this.blockProductionCheckInterval)\n\n if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {\n // Register a timer to check if we should redeclare the producer\n this.registerTimer('ProducerRedeclarationTimer', async () => {\n await this.redeclareIntent()\n }, TEN_MINUTES, TEN_MINUTES)\n }\n }\n\n protected calculateBlocksUntilProducerDeclarationExpiration(currentBlock: number): number {\n return (this._lastRedeclarationIntent?.exp ?? currentBlock) - currentBlock\n }\n\n protected async produceBlock(): Promise<void> {\n this._producerActorBlockProductionChecks.add(1, this._metricAttributes)\n await this.spanAsync('produceBlock', async () => {\n if (this._produceBlockMutex.isLocked()) {\n this.logger?.debug('Skipping block production, previous production still in progress')\n return\n }\n\n await this._produceBlockMutex.runExclusive(async () => {\n // Get the updated head\n const head = (await this.blockViewer.currentBlock())[0]\n const headHash = head._hash\n\n // Track head changes\n const currentTime = Date.now()\n if (this._lastHeadHash !== headHash) {\n const lastHeadHashHex = isDefined(this._lastHeadHash) ? `0x${this._lastHeadHash}` : 'undefined'\n const currentHeadHashHex = `0x${headHash}`\n this.logger?.log(`Found updated head ${lastHeadHashHex} -> ${currentHeadHashHex}`)\n this._lastHeadHash = headHash\n this._lastHeadChangeTime = currentTime\n }\n\n // Check if we should resubmit due to stale head\n const timeSinceHeadChange = isDefined(this._lastHeadChangeTime) ? currentTime - this._lastHeadChangeTime : 0\n\n // If we have never produced a block or the last produced block was not built on the current head we\n // need to attempt to produce a new block\n const shouldSubmit = !this._lastProducedBlock || this._lastProducedBlock[0].previous !== headHash\n\n // If the head has not changed determine if we should resubmit again based on head staleness\n const shouldResubmit = timeSinceHeadChange > this.headResubmissionThreshold\n\n // Determine if we should submit or resubmit\n const shouldSubmitBlock = shouldSubmit || shouldResubmit\n\n if (!shouldSubmitBlock) {\n this.logger?.debug('No block submission required at this time.')\n return\n }\n\n if (shouldResubmit) {\n this.logger?.log(`Resubmitting block due to stale head. Head ${toFormattedBlockReference(head)} unchanged for ${timeSinceHeadChange}ms`)\n this._lastHeadChangeTime = currentTime\n }\n this._producerActorBlockProductionAttempts.add(1, this._metricAttributes)\n // Produce the next block (do not pass force \u2014 undefined result is valid when idle)\n const nextBlock = await this.blockRunner.produceNextBlock(head)\n if (nextBlock) {\n const displayBlockNumber = toFormattedBlockReference(nextBlock[0])\n this.logger?.log('Produced block:', displayBlockNumber)\n this._producerActorBlocksProduced.add(1, this._metricAttributes)\n await this.mempoolRunner.submitBlocks([nextBlock])\n this.logger?.log('Published block:', displayBlockNumber)\n this._producerActorBlocksPublished.add(1, this._metricAttributes)\n this._lastProducedBlock = nextBlock\n } else {\n this.logger?.log('No block produced for submission.')\n }\n })\n }, { ...this.context, timeBudgetLimit: 1000 })\n }\n\n protected override async readyHandler(): Promise<void> {\n // Warm pass: prove the production loop reaches its dependencies before declaring ready.\n await this.produceBlock()\n }\n\n protected async redeclareIntent(): Promise<void> {\n await this.spanAsync('redeclareIntent', async () => {\n // Decide if we should redeclare intent\n if (this.config.disableIntentRedeclaration) return\n\n // Get the current block\n const head = (await this.blockViewer.currentBlock())[0]\n if (isUndefined(head)) return\n const currentBlock = head.block\n\n // // Calculate the time until the producer's declaration expires\n const blocksUntilExpiration = this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock)\n\n // Allow the producer time to redeclare itself via block production\n // (for free) before submitting a redeclaration intent transaction.\n if (blocksUntilExpiration > ProducerActor.RedeclarationWindow * 0.1) {\n // Clear any previous redeclaration intent\n this._lastRedeclarationIntent = undefined\n // No need to redeclare yet\n return\n }\n\n // If we already have a valid redeclaration intent, do not create another\n // unless it has expired.\n if (this._lastRedeclarationIntent) {\n // Check if the last redeclaration intent is still valid\n if (this._lastRedeclarationIntent.exp > currentBlock) return\n // If it has expired, clear the last redeclaration intent\n this._lastRedeclarationIntent = undefined\n }\n\n // Check if we have a valid balance before declaring intent\n if (!(await this.validateCurrentBalance())) {\n this.logger?.error(\n `Add balance to address ${this.account.address} for the producer to declare it's intent.`,\n )\n return\n }\n\n // Check if we have a valid stake before declaring intent\n if (!(await this.validateCurrentStake())) {\n this.logger?.error(\n `Add stake to contract address ${this.chainId}`\n + ' for the producer to declare it\\'s intent.',\n )\n return\n }\n\n // Create a redeclaration intent\n this.logger?.log('Creating redeclaration intent for producer:', this.account.address)\n const redeclarationIntent = createDeclarationIntent(\n this.account.address,\n 'producer',\n currentBlock,\n currentBlock + SimpleBlockRunner.RedeclarationDuration,\n )\n\n // Submit the redeclaration intent\n await this.submitRedeclarationIntent(currentBlock, redeclarationIntent)\n\n // On successful submission, save the redeclaration intent\n this._lastRedeclarationIntent = redeclarationIntent\n }, { ...this.context, timeBudgetLimit: 1000 })\n }\n\n protected async submitRedeclarationIntent(currentBlock: XL1BlockNumber, redeclarationIntent: ChainStakeIntent): Promise<void> {\n this.logger?.log('Submitting redeclaration intent for producer:', this.account.address)\n // Create a transaction to submit the redeclaration intent\n const tx = await buildTransaction(\n this.chainId,\n [redeclarationIntent],\n [],\n this.account,\n currentBlock,\n asXL1BlockNumber(currentBlock + 1000, true),\n )\n\n // Submit the redeclaration intent\n await this.mempoolRunner.submitTransactions([tx])\n\n this.logger?.log('Submitted redeclaration intent for producer:', this.account.address)\n }\n\n protected async validateCurrentBalance(): Promise<boolean> {\n // Check if we have a valid balance before declaring intent\n const head = (await this.blockViewer.currentBlock())?.[0]?._hash\n if (isDefined(head)) {\n const balances = await this.accountBalanceViewer.accountBalances([this.account.address], { head })\n const currentBalance = balances[this.account.address] ?? 0n\n if (currentBalance <= 0n) {\n this.logger?.error(`Producer ${this.account.address} has no balance.`)\n return false\n }\n return true\n }\n return true\n }\n\n protected async validateCurrentStake(): Promise<boolean> {\n // Use StakeIntentService to get the required minimum stake\n const requiredMinimumStake = 1n // this.stakeIntentService.getRequiredMinimumStakeForIntent('producer')\n // Check if we have a valid stake before declaring intent\n const currentStake = await this.stakeTotalsViewer.activeByStaked(this.account.address)\n if (currentStake < requiredMinimumStake) {\n this.logger?.error(`Producer ${this.account.address} has insufficient stake.`)\n return false\n }\n return true\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-producer",
3
- "version": "1.22.0",
3
+ "version": "1.23.2",
4
4
  "description": "XYO Layer One Producer",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -35,30 +35,29 @@
35
35
  "README.md"
36
36
  ],
37
37
  "dependencies": {
38
- "@xyo-network/chain-orchestration": "~1.22.0",
39
- "@xyo-network/chain-services": "~1.22.0"
38
+ "@xyo-network/chain-services": "~1.23.2",
39
+ "@xyo-network/chain-orchestration": "~1.23.2"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@bitauth/libauth": "~3.0.0",
43
- "@metamask/json-rpc-engine": "^10.4.0",
43
+ "@metamask/json-rpc-engine": "^10.5.0",
44
44
  "@metamask/providers": "^22.1.1",
45
45
  "@metamask/utils": "~11.11.0",
46
46
  "@opentelemetry/api": "^1.9.1",
47
47
  "@opentelemetry/context-async-hooks": "~2.7.1",
48
48
  "@opentelemetry/context-zone": "~2.7.1",
49
49
  "@opentelemetry/core": "~2.7.1",
50
- "@opentelemetry/exporter-prometheus": "~0.217",
51
- "@opentelemetry/exporter-trace-otlp-grpc": "~0.217",
52
- "@opentelemetry/exporter-trace-otlp-http": "~0.217",
50
+ "@opentelemetry/exporter-prometheus": "~0.218",
51
+ "@opentelemetry/exporter-trace-otlp-grpc": "~0.218",
52
+ "@opentelemetry/exporter-trace-otlp-http": "~0.218",
53
53
  "@opentelemetry/host-metrics": "~0.38.3",
54
- "@opentelemetry/instrumentation-runtime-node": "~0.30",
54
+ "@opentelemetry/instrumentation-runtime-node": "~0.31",
55
55
  "@opentelemetry/resources": "~2.7.1",
56
56
  "@opentelemetry/sdk-metrics": "~2.7.1",
57
57
  "@opentelemetry/sdk-trace-base": "^2.7.1",
58
- "@opentelemetry/semantic-conventions": "~1.40.0",
58
+ "@opentelemetry/semantic-conventions": "~1.41.1",
59
59
  "@scure/base": "~2.2.0",
60
60
  "@scure/bip39": "~2.2.0",
61
- "@types/node": ">=18",
62
61
  "@types/yargs": "^17.0.35",
63
62
  "@xylabs/express": "^5.1.2",
64
63
  "@xylabs/fetch": "~5.1.2",
@@ -66,8 +65,8 @@
66
65
  "@xylabs/mongo": "^5.1.2",
67
66
  "@xylabs/sdk-js": "^5.1.2",
68
67
  "@xylabs/threads": "~5.1.2",
69
- "@xylabs/toolchain": "~7.13.22",
70
- "@xylabs/tsconfig": "~7.13.22",
68
+ "@xylabs/toolchain": "~8.0.4",
69
+ "@xylabs/tsconfig": "~8.0.4",
71
70
  "@xyo-network/account": "~5.6.2",
72
71
  "@xyo-network/account-model": "~5.6.3",
73
72
  "@xyo-network/api": "~5.6.2",
@@ -92,12 +91,10 @@
92
91
  "@xyo-network/typechain": "^4.1.3",
93
92
  "@xyo-network/wallet": "~5.6.2",
94
93
  "@xyo-network/wallet-model": "^5.6.3",
95
- "@xyo-network/xl1-protocol-sdk": "~1.28.5",
96
- "@xyo-network/xl1-sdk": "^1.28.5",
97
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0",
94
+ "@xyo-network/xl1-protocol-sdk": "~1.30.2",
95
+ "@xyo-network/xl1-sdk": "^1.30.2",
98
96
  "ajv": "^8.20.0",
99
97
  "async-mutex": "^0.5.0",
100
- "axios": "^1",
101
98
  "bn.js": "^5.2.3",
102
99
  "body-parser": "~2.2.2",
103
100
  "buffer": "^6.0.3",
@@ -112,7 +109,6 @@
112
109
  "ethers": "^6.16.0",
113
110
  "express": "^5.2.1",
114
111
  "express-mung": "~0.5.1",
115
- "firebase": "^12",
116
112
  "hash-wasm": "~4.12.0",
117
113
  "http-status-codes": "~2.3.0",
118
114
  "idb": "^8.0.3",
@@ -124,21 +120,19 @@
124
120
  "observable-fns": "~0.6.1",
125
121
  "pako": "^2.1.0",
126
122
  "rollbar": "^3.1.0",
127
- "rollup": "^3.29.4 || ^4",
128
123
  "shallowequal": "~1.1.0",
129
124
  "store2": "~2.14.4",
130
125
  "tslib": "^2.8.1",
131
- "typescript": "~5.9.3",
126
+ "typescript": "~6.0.3",
132
127
  "uuid": "~14.0.0",
133
- "vite": "^8.0.11",
134
- "vitest": "^4.1.5",
128
+ "vite": "^8.0.13",
129
+ "vitest": "^4.1.6",
135
130
  "wasm-feature-detect": "~1.8.0",
136
131
  "web3-types": "~1.10.0",
137
132
  "webextension-polyfill": "^0.12.0",
138
133
  "winston": "~3.19.0",
139
134
  "winston-transport": "~4.9.0",
140
- "zod": "~4.4.3",
141
- "zone.js": "^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0"
135
+ "zod": "~4.4.3"
142
136
  },
143
137
  "peerDependencies": {
144
138
  "@bitauth/libauth": "~3.0",
@@ -149,15 +143,15 @@
149
143
  "@opentelemetry/context-async-hooks": "~2.7",
150
144
  "@opentelemetry/context-zone": "~2.7",
151
145
  "@opentelemetry/core": "~2.7",
152
- "@opentelemetry/exporter-prometheus": "~0.217",
153
- "@opentelemetry/exporter-trace-otlp-grpc": "~0.217",
154
- "@opentelemetry/exporter-trace-otlp-http": "~0.217",
146
+ "@opentelemetry/exporter-prometheus": "~0.218",
147
+ "@opentelemetry/exporter-trace-otlp-grpc": "~0.218",
148
+ "@opentelemetry/exporter-trace-otlp-http": "~0.218",
155
149
  "@opentelemetry/host-metrics": "~0.38",
156
- "@opentelemetry/instrumentation-runtime-node": "~0.30",
150
+ "@opentelemetry/instrumentation-runtime-node": "~0.31",
157
151
  "@opentelemetry/resources": "~2.7",
158
152
  "@opentelemetry/sdk-metrics": "~2.7",
159
153
  "@opentelemetry/sdk-trace-base": "^2.7",
160
- "@opentelemetry/semantic-conventions": "~1.40",
154
+ "@opentelemetry/semantic-conventions": "~1.41",
161
155
  "@scure/base": "~2.2",
162
156
  "@scure/bip39": "~2.2",
163
157
  "@xylabs/express": "^5.1",
@@ -190,11 +184,10 @@
190
184
  "@xyo-network/typechain": "^4.1",
191
185
  "@xyo-network/wallet": "~5.6",
192
186
  "@xyo-network/wallet-model": "^5.6",
193
- "@xyo-network/xl1-protocol-sdk": "~1.28",
187
+ "@xyo-network/xl1-protocol-sdk": "~1.30.1",
194
188
  "@xyo-network/xl1-sdk": "^1.28",
195
189
  "ajv": "^8.20",
196
190
  "async-mutex": "^0.5",
197
- "axios": "^1",
198
191
  "bn.js": "^5.2",
199
192
  "body-parser": "~2.2",
200
193
  "buffer": "^6.0",
@@ -207,7 +200,6 @@
207
200
  "ethers": "^6.16",
208
201
  "express": "^5.2",
209
202
  "express-mung": "~0.5",
210
- "firebase": "^12",
211
203
  "hash-wasm": "~4.12",
212
204
  "http-status-codes": "~2.3",
213
205
  "idb": "^8.0",
@@ -226,8 +218,7 @@
226
218
  "webextension-polyfill": "^0.12",
227
219
  "winston": "~3.19",
228
220
  "winston-transport": "~4.9",
229
- "zod": "~4.4",
230
- "zone.js": "^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0"
221
+ "zod": "~4.4"
231
222
  },
232
223
  "engines": {
233
224
  "node": ">=24"