@xyo-network/xl1-cli 1.19.3 → 1.19.5

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 (2) hide show
  1. package/dist/cli-min.mjs +523 -250
  2. package/package.json +4 -4
package/dist/cli-min.mjs CHANGED
@@ -85431,14 +85431,16 @@ var SingleTimeConfigZod = union$1([
85431
85431
  object$4({ months: timeUnitSchema }),
85432
85432
  object$4({ years: timeUnitSchema })
85433
85433
  ]).describe("Time configuration with exactly one time unit");
85434
- tuple([
85434
+ var HydratedBlockZod = tuple([
85435
85435
  BlockBoundWitnessZod,
85436
85436
  array$1(PayloadZodLoose)
85437
85437
  ]);
85438
- tuple([
85438
+ var isHydratedBlock = zodIsFactory(HydratedBlockZod);
85439
+ var HydratedBlockWithHashMetaZod = tuple([
85439
85440
  WithHashMetaZod(BlockBoundWitnessZod),
85440
85441
  array$1(WithHashMetaZod(PayloadZodLoose))
85441
85442
  ]);
85443
+ var isHydratedBlockWithHashMeta = zodIsFactory(HydratedBlockWithHashMetaZod);
85442
85444
  tuple([
85443
85445
  WithStorageMetaZod(BlockBoundWitnessZod),
85444
85446
  array$1(WithStorageMetaZod(PayloadZodLoose))
@@ -86236,14 +86238,10 @@ var ProviderFactory = class _ProviderFactory {
86236
86238
  static withParams(creatableProvider2, dependencies, params, labels = {}) {
86237
86239
  return new _ProviderFactory(creatableProvider2, dependencies, params, labels);
86238
86240
  }
86239
- /** @deprecated use getInstance instead */
86240
- async create(params, start = true) {
86241
- return await this.getInstance(params, start);
86242
- }
86243
86241
  factory(dependencies, params, labels = {}) {
86244
86242
  return new _ProviderFactory(this.creatableProvider, dependencies, params, labels);
86245
86243
  }
86246
- async getInstance(params, start = true) {
86244
+ async getInstance(params, { start = true }) {
86247
86245
  let scopeObject = {};
86248
86246
  switch (this.scope) {
86249
86247
  case "global": {
@@ -86289,9 +86287,9 @@ var ProviderFactory = class _ProviderFactory {
86289
86287
  }
86290
86288
  return result;
86291
86289
  }
86292
- async tryGetInstance(params, start = true) {
86290
+ async tryGetInstance(params, options) {
86293
86291
  try {
86294
- return await this.getInstance(params, start);
86292
+ return await this.getInstance(params, options);
86295
86293
  } catch {
86296
86294
  return;
86297
86295
  }
@@ -86342,7 +86340,10 @@ var AbstractCreatableProvider = class extends AbstractCreatable {
86342
86340
  }
86343
86341
  }
86344
86342
  async locateAndCreate(moniker) {
86345
- return await this.locator?.getInstance(moniker);
86343
+ return await this.locator.getInstance(moniker);
86344
+ }
86345
+ async tryLocateAndCreate(moniker) {
86346
+ return await this.locator.tryGetInstance(moniker);
86346
86347
  }
86347
86348
  };
86348
86349
 
@@ -86354,8 +86355,6 @@ function creatableProvider() {
86354
86355
  var buildProviderFactory = (provider, labels) => {
86355
86356
  const factory = {
86356
86357
  monikers: provider.monikers,
86357
- // Copy static methods
86358
- create: provider.create.bind(provider),
86359
86358
  // Merge module & supplied labels
86360
86359
  labels: { ...provider.labels, ...labels },
86361
86360
  creatableProvider: provider.creatableProvider,
@@ -86426,14 +86425,10 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
86426
86425
  static standard(context) {
86427
86426
  return new _ProviderFactoryLocator(context, {});
86428
86427
  }
86429
- /** @deprecated use getInstance instead */
86430
- async create(moniker, params, labels) {
86431
- return await this.getInstance(moniker, params, labels);
86432
- }
86433
86428
  freeze() {
86434
86429
  this._frozen = true;
86435
86430
  }
86436
- async getInstance(moniker, params, labels) {
86431
+ async getInstance(moniker, params, { start = true, labels } = {}) {
86437
86432
  const resolvedParams = {
86438
86433
  ...params,
86439
86434
  context: {
@@ -86442,7 +86437,7 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
86442
86437
  }
86443
86438
  };
86444
86439
  const factory = this.locate(moniker, labels);
86445
- const result = await factory.getInstance(resolvedParams);
86440
+ const result = await factory.getInstance(resolvedParams, { start });
86446
86441
  return result;
86447
86442
  }
86448
86443
  /**
@@ -86488,9 +86483,9 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
86488
86483
  }
86489
86484
  return this;
86490
86485
  }
86491
- async tryGetInstance(moniker, params, labels) {
86486
+ async tryGetInstance(moniker, params, options) {
86492
86487
  try {
86493
- return await this.getInstance(moniker, params, labels);
86488
+ return await this.getInstance(moniker, params, options);
86494
86489
  } catch {
86495
86490
  return;
86496
86491
  }
@@ -88624,11 +88619,13 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
88624
88619
  this._chainContractViewer = await this.locator.getInstance(ChainContractViewerMoniker);
88625
88620
  }
88626
88621
  async qualifiedValidateBlock(block, config) {
88627
- return await this.qualifiedValidateBlocks([block], config);
88622
+ const result = await this.qualifiedValidateBlocks([block], config);
88623
+ return [result[0][0], result[1]];
88628
88624
  }
88629
88625
  async qualifiedValidateBlocks(blocks, config) {
88630
88626
  const { value, state } = config ?? {
88631
88627
  state: true};
88628
+ const blocksWithMeta = await Promise.all(blocks.map((b) => Promise.all([PayloadBuilder.addHashMeta(b[0]), PayloadBuilder.addHashMeta(b[1])])));
88632
88629
  const head = isChainQualifiedHeadConfig(config) ? assertEx(
88633
88630
  (await this.blockViewer.blockByHash(config.head))?.[0],
88634
88631
  () => `Specified a head that is not in the chain [${config.head}]`
@@ -88637,25 +88634,44 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
88637
88634
  const validateProtocol = value ? this.doValidateProtocol.bind(this) : void 0;
88638
88635
  const validateState = state ? this.doValidateState.bind(this) : void 0;
88639
88636
  const chainIdAtBlockNumber = (blockNumber) => this.chainContractViewer.chainIdAtBlockNumber(blockNumber);
88640
- return [(await Promise.all([
88641
- validateProtocol?.(blocks, chainIdAtBlockNumber),
88642
- validateState?.(blocks, chainIdAtBlockNumber)
88643
- ].filter(exists$2))).flat(), { head: headBlock._hash, range: asXL1BlockRange([0, headBlock.block], true) }];
88637
+ const qualification = { head: headBlock._hash, range: asXL1BlockRange([0, headBlock.block], true) };
88638
+ const [protocolResults, stateResults] = await Promise.all([
88639
+ validateProtocol?.(blocksWithMeta, chainIdAtBlockNumber),
88640
+ validateState?.(blocksWithMeta, chainIdAtBlockNumber)
88641
+ ]);
88642
+ const blockResults = blocksWithMeta.map((r, i) => {
88643
+ const errors = [];
88644
+ if (protocolResults && !isHydratedBlock(protocolResults[i])) {
88645
+ errors.push(...protocolResults[i]);
88646
+ }
88647
+ if (stateResults && !isHydratedBlock(stateResults[i])) {
88648
+ errors.push(...stateResults[i]);
88649
+ }
88650
+ return errors.length === 0 ? r : errors;
88651
+ });
88652
+ return [blockResults, qualification];
88653
+ }
88654
+ qualifiedValidateUncle(_blocks, _config) {
88655
+ throw new Error("Method not implemented.");
88644
88656
  }
88645
88657
  async validateBlock(block, config) {
88646
- return await this.validateBlocks([block], config);
88658
+ return (await this.validateBlocks([block], config))[0];
88647
88659
  }
88648
88660
  async validateBlocks(blocks, config) {
88649
88661
  return (await this.qualifiedValidateBlocks(blocks, config))[0];
88650
88662
  }
88663
+ async validateUncle(blocks, config) {
88664
+ return (await this.qualifiedValidateUncle(blocks, config))[0];
88665
+ }
88651
88666
  async doValidateProtocol(blocks, chainIdAtBlockNumber) {
88652
- return (await Promise.all(blocks.map(async (block) => {
88653
- return await this.params.protocol(
88667
+ return await Promise.all(blocks.map(async (block) => {
88668
+ const errors = await this.params.protocol(
88654
88669
  this.context,
88655
88670
  block,
88656
88671
  chainIdAtBlockNumber
88657
88672
  );
88658
- }))).flat();
88673
+ return errors.length === 0 ? block : errors;
88674
+ }));
88659
88675
  }
88660
88676
  async doValidateState(blocks, chainIdAtBlockNumber) {
88661
88677
  const windowedUncleChain = await this.updateWindowedChainCache();
@@ -88665,14 +88681,15 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
88665
88681
  this.logger?.warn(JSON.stringify(windowedUncleChain, null, 2));
88666
88682
  throw new Error(`No uncles or greater than one uncle found in block validation, which is not supported [${uncles.length}, ${blocks.length}]`);
88667
88683
  }
88668
- return (await Promise.all(uncles[0].map(async (block) => {
88669
- return await this.params.state(
88684
+ return await Promise.all(uncles[0].map(async (block) => {
88685
+ const errors = await this.params.state(
88670
88686
  this.context,
88671
88687
  block,
88672
88688
  chainIdAtBlockNumber,
88673
88689
  { accountBalance: this._accountBalanceViewer }
88674
88690
  );
88675
- }))).flat();
88691
+ return errors.length === 0 ? block : errors;
88692
+ }));
88676
88693
  }
88677
88694
  async updateWindowedChainCache() {
88678
88695
  this._uncleWindowedChainCache = await getWindowedChain(this.context, this.blockViewer, this.maxUncleWindowSize, this._uncleWindowedChainCache ?? []);
@@ -89104,6 +89121,18 @@ var SimpleXyoGatewayRunner = class _SimpleXyoGatewayRunner extends AbstractCreat
89104
89121
  };
89105
89122
  var SimpleMempoolRunner = class extends AbstractCreatableProvider {
89106
89123
  moniker = SimpleMempoolRunner.defaultMoniker;
89124
+ _blockValidationViewer;
89125
+ _chainContractViewer;
89126
+ _finalizationViewer;
89127
+ get blockValidationViewer() {
89128
+ return this._blockValidationViewer;
89129
+ }
89130
+ get chainContractViewer() {
89131
+ return this._chainContractViewer;
89132
+ }
89133
+ get finalizationViewer() {
89134
+ return this._finalizationViewer;
89135
+ }
89107
89136
  get pendingBlocksArchivist() {
89108
89137
  return this.params.pendingBlocksArchivist;
89109
89138
  }
@@ -89117,6 +89146,72 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
89117
89146
  pendingTransactionsArchivist: assertEx(params?.pendingTransactionsArchivist, () => "pendingTransactionsArchivist is required")
89118
89147
  };
89119
89148
  }
89149
+ async createHandler() {
89150
+ await super.createHandler();
89151
+ this._blockValidationViewer = await this.locator.getInstance(BlockValidationViewerMoniker);
89152
+ this._chainContractViewer = await this.locator.getInstance(ChainContractViewerMoniker);
89153
+ this._finalizationViewer = await this.locator.getInstance(FinalizationViewerMoniker);
89154
+ }
89155
+ async prunePendingBlocks({
89156
+ batchSize = 10,
89157
+ maxPrune = 1e3,
89158
+ maxCheck = 1e3
89159
+ } = {}) {
89160
+ let total = 0;
89161
+ let pruned = 0;
89162
+ let cursor;
89163
+ let batch = await this.pendingBlocksArchivist.next({
89164
+ limit: batchSize,
89165
+ cursor,
89166
+ order: "desc"
89167
+ });
89168
+ this.logger?.info(`Starting prunePendingBlocks with batchSize=${batchSize}, maxPrune=${maxPrune}, maxCheck=${maxCheck}`);
89169
+ while (batch.length > 0 && pruned < maxPrune && total < maxCheck) {
89170
+ const blocksAndBundles = await this.simpleValidationCheck(batch);
89171
+ const blocks = blocksAndBundles.map(([b]) => b);
89172
+ const bundles = blocksAndBundles.map(([_, p]) => p);
89173
+ let valid = blocks.map((b) => !!b);
89174
+ let remainingBlockMap = [];
89175
+ let remainingBlocks = blocks.map((b, i) => {
89176
+ if (b) {
89177
+ remainingBlockMap.push(i);
89178
+ return b;
89179
+ }
89180
+ }).filter(exists$2);
89181
+ assertEx(
89182
+ remainingBlockMap.length === remainingBlocks.length,
89183
+ () => `remainingBlockMap length should match remainingBlocks length [${remainingBlockMap.length}/${remainingBlocks.length}]`
89184
+ );
89185
+ const validationResults = remainingBlocks.map((b) => b);
89186
+ for (const [i, r] of validationResults.entries()) {
89187
+ const validated = isHydratedBlockWithHashMeta(r);
89188
+ if (!validated) {
89189
+ this.logger?.info(`Pruning block ${bundles[remainingBlockMap[i]]._hash} during block validation`);
89190
+ this.logger?.info(` - validation result: ${JSON.stringify(r, null, 2)}`);
89191
+ }
89192
+ valid[remainingBlockMap[i]] = validated;
89193
+ }
89194
+ const pruneHashes = bundles.map((p, i) => {
89195
+ if (!valid[i]) {
89196
+ return p._hash;
89197
+ }
89198
+ }).filter(exists$2);
89199
+ pruned += pruneHashes.length;
89200
+ total += batch.length;
89201
+ await this.pendingBlocksArchivist.delete(pruneHashes);
89202
+ cursor = batch.at(-1)?._sequence;
89203
+ batch = cursor ? await this.pendingBlocksArchivist.next({
89204
+ limit: batchSize,
89205
+ cursor,
89206
+ order: "desc"
89207
+ }) : [];
89208
+ }
89209
+ this.logger?.info(`prunePendingBlocks completed: pruned=${pruned}, totalChecked=${total}`);
89210
+ return [pruned, total];
89211
+ }
89212
+ prunePendingTransactions(_options) {
89213
+ throw new Error("Method not implemented.");
89214
+ }
89120
89215
  async submitBlocks(blocks) {
89121
89216
  const bundles = await Promise.all(blocks.map(async ([bw, payloads]) => {
89122
89217
  return hydratedBlockToPayloadBundle([
@@ -89137,9 +89232,27 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
89137
89232
  const inserted = await this.pendingTransactionsArchivist.insert(bundles);
89138
89233
  return inserted.map((p) => p._hash);
89139
89234
  }
89235
+ async simpleValidationCheck(payloads) {
89236
+ const headNumber = await this.finalizationViewer.headNumber();
89237
+ const chainId = await this.chainContractViewer.chainId();
89238
+ const blockBundles = await Promise.all(payloads.map(async (p) => {
89239
+ return [isPayloadBundle(p) ? await bundledPayloadToHydratedBlock(p) : void 0, p];
89240
+ }));
89241
+ return blockBundles.map(([block, bundle3]) => {
89242
+ const result = [block ? block[0].chain === chainId && block[0].block > headNumber && isSignedHydratedBlockWithHashMeta(block) ? block : void 0 : void 0, bundle3];
89243
+ if (result[0] === void 0) {
89244
+ this.logger?.info(`Pruning block bundle ${bundle3._hash} during simpleValidationCheck`);
89245
+ this.logger?.info(` - chainId match: ${block ? block[0].chain === chainId : "n/a"}`);
89246
+ this.logger?.info(` - headNumber check: ${block ? block[0].block > headNumber : "n/a"}`);
89247
+ this.logger?.info(` - isSignedHydratedBlockWithHashMeta: ${block ? isSignedHydratedBlockWithHashMeta(block) : "n/a"}`);
89248
+ this.logger?.info(` - block value: ${block ? JSON.stringify(block, null, 2) : "n/a"}`);
89249
+ }
89250
+ return result;
89251
+ });
89252
+ }
89140
89253
  };
89141
89254
  __publicField$4(SimpleMempoolRunner, "defaultMoniker", MempoolRunnerMoniker);
89142
- __publicField$4(SimpleMempoolRunner, "dependencies", [WindowedBlockViewerMoniker]);
89255
+ __publicField$4(SimpleMempoolRunner, "dependencies", [FinalizationViewerMoniker, BlockValidationViewerMoniker, ChainContractViewerMoniker]);
89143
89256
  __publicField$4(SimpleMempoolRunner, "monikers", [MempoolRunnerMoniker]);
89144
89257
  SimpleMempoolRunner = __decorateClass$4([
89145
89258
  creatableProvider()
@@ -89192,14 +89305,12 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
89192
89305
  });
89193
89306
  this.logger?.info(`Fetched pending transactions: ${bundles.length} bundles`);
89194
89307
  const filteredBundles = bundles.filter(isPayloadBundle).filter(isHashMeta);
89195
- this.logger?.info(`Filtered pending transactions: ${JSON.stringify(filteredBundles, null, 2)} filteredBundles`);
89196
89308
  const hydratedWithBundle = (await Promise.all(
89197
89309
  filteredBundles.map(async (bundle3) => {
89198
89310
  const tx = await bundledPayloadToHydratedTransaction$1(bundle3);
89199
89311
  return isDefined(tx) ? { bundle: bundle3, tx } : void 0;
89200
89312
  })
89201
89313
  )).filter(exists$2);
89202
- this.logger?.info(`Converted pending transactions: ${JSON.stringify(hydratedWithBundle.map((x) => x.tx), null, 2)} results`);
89203
89314
  const currentBlock = await this.windowedBlockViewer.currentBlock();
89204
89315
  const evaluated = await Promise.all(
89205
89316
  hydratedWithBundle.map(async ({ bundle: bundle3, tx }) => ({
@@ -96663,6 +96774,12 @@ var JsonRpcMempoolRunnerMethods = class extends AbstractJsonRpcRunner {
96663
96774
 
96664
96775
  // src/provider/runner/JsonRpcMempoolRunner/JsonRpcMempoolRunner.ts
96665
96776
  var JsonRpcMempoolRunner = class extends JsonRpcMempoolRunnerMethods {
96777
+ prunePendingBlocks(_options) {
96778
+ throw new Error("Method not implemented.");
96779
+ }
96780
+ prunePendingTransactions(_options) {
96781
+ throw new Error("Method not implemented.");
96782
+ }
96666
96783
  };
96667
96784
  __publicField$3(JsonRpcMempoolRunner, "defaultMoniker", MempoolRunnerMoniker);
96668
96785
  __publicField$3(JsonRpcMempoolRunner, "dependencies", []);
@@ -96679,12 +96796,16 @@ var JsonRpcXyoRunner = class extends AbstractJsonRpcRunner {
96679
96796
  async broadcastTransaction(transaction) {
96680
96797
  return await this.transport.sendRequest("xyoRunner_broadcastTransaction", [transaction]);
96681
96798
  }
96799
+ async createHandler() {
96800
+ await super.createHandler();
96801
+ this._mempoolRunner = await this.locateAndCreate(MempoolRunnerMoniker);
96802
+ }
96682
96803
  schemas() {
96683
96804
  return XyoRunnerRpcSchemas;
96684
96805
  }
96685
96806
  };
96686
96807
  __publicField$3(JsonRpcXyoRunner, "defaultMoniker", XyoRunnerMoniker);
96687
- __publicField$3(JsonRpcXyoRunner, "dependencies", []);
96808
+ __publicField$3(JsonRpcXyoRunner, "dependencies", [MempoolRunnerMoniker]);
96688
96809
  __publicField$3(JsonRpcXyoRunner, "monikers", [XyoRunnerMoniker]);
96689
96810
  JsonRpcXyoRunner = __decorateClass$3([
96690
96811
  creatableProvider()
@@ -201861,6 +201982,44 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
201861
201982
  ];
201862
201983
  }
201863
201984
  __name$e(createChain, "createChain");
201985
+ var EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32);
201986
+ var EthHashZod = string$2().regex(EthHashRegEx, {
201987
+ message: "Invalid address format"
201988
+ });
201989
+ var EvmStakeAddedEventNameZod = literal$2("StakeAdded");
201990
+ var EvmStakeRemovedEventNameZod = literal$2("StakeRemoved");
201991
+ var EvmStakeWithdrawnEventNameZod = literal$2("StakeWithdrawn");
201992
+ var EvmStakeEventNameZod = union$1([
201993
+ EvmStakeAddedEventNameZod,
201994
+ EvmStakeRemovedEventNameZod,
201995
+ EvmStakeWithdrawnEventNameZod
201996
+ ]);
201997
+ var EvmStakeEventArgsZod = tuple([
201998
+ EthAddressZod,
201999
+ EthAddressZod,
202000
+ bigint$1(),
202001
+ bigint$1()
202002
+ ]);
202003
+ var EvmStakeEventZod = object$4({
202004
+ address: EthAddressZod,
202005
+ args: EvmStakeEventArgsZod,
202006
+ blockHash: EthHashZod,
202007
+ blockNumber: number$3(),
202008
+ eventName: EvmStakeEventNameZod,
202009
+ transactionHash: EthHashZod,
202010
+ transactionIndex: number$3()
202011
+ });
202012
+ EvmStakeEventZod.extend({
202013
+ eventName: EvmStakeAddedEventNameZod
202014
+ });
202015
+ EvmStakeEventZod.extend({
202016
+ eventName: EvmStakeRemovedEventNameZod
202017
+ });
202018
+ EvmStakeEventZod.extend({
202019
+ eventName: EvmStakeWithdrawnEventNameZod
202020
+ });
202021
+
202022
+ // src/drivers/EvmStakeEventsViewer.ts
201864
202023
  function _ts_decorate$5(decorators, target, key, desc) {
201865
202024
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
201866
202025
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -201868,6 +202027,170 @@ function _ts_decorate$5(decorators, target, key, desc) {
201868
202027
  return c > 3 && r && Object.defineProperty(target, key, r), r;
201869
202028
  }
201870
202029
  __name$e(_ts_decorate$5, "_ts_decorate");
202030
+ var EvmStakeEventsViewer = class _EvmStakeEventsViewer extends AbstractCreatableProvider {
202031
+ static {
202032
+ __name$e(this, "EvmStakeEventsViewer");
202033
+ }
202034
+ static defaultMoniker = StakeEventsViewerMoniker;
202035
+ static dependencies = [];
202036
+ static monikers = [
202037
+ StakeEventsViewerMoniker
202038
+ ];
202039
+ moniker = _EvmStakeEventsViewer.defaultMoniker;
202040
+ eventCache = /* @__PURE__ */ new Map();
202041
+ get contract() {
202042
+ return assertEx(this.params.contract, () => new Error("Contract not defined"));
202043
+ }
202044
+ get deploymentBlock() {
202045
+ return this.params.deploymentBlock ?? 0;
202046
+ }
202047
+ async positionCount(range) {
202048
+ const events = await this.stakeEvents(range);
202049
+ const positionIds = events.map((e) => e.args.id);
202050
+ return Math.max(-1, ...positionIds) + 1;
202051
+ }
202052
+ stakeEvents(range = [
202053
+ 0,
202054
+ "latest"
202055
+ ], filter) {
202056
+ const allEvents = [
202057
+ ...this.eventCache.values()
202058
+ ];
202059
+ const result = allEvents.filter((e) => {
202060
+ if (range[1] !== "latest" && e.time > range[1]) {
202061
+ return false;
202062
+ }
202063
+ if (e.time < range[0]) {
202064
+ return false;
202065
+ }
202066
+ if (isDefined(filter?.name) && e.name !== filter.name) {
202067
+ return false;
202068
+ }
202069
+ if (isDefined(filter?.args?.id) && e.args.id !== filter.args.id) {
202070
+ return false;
202071
+ }
202072
+ if (isDefined(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
202073
+ return false;
202074
+ }
202075
+ if (isDefined(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
202076
+ return false;
202077
+ }
202078
+ return true;
202079
+ });
202080
+ return result;
202081
+ }
202082
+ onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
202083
+ const validatedEventResult = EvmStakeEventZod.safeParse(event);
202084
+ if (validatedEventResult.error) {
202085
+ this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`);
202086
+ this.logger?.warn(` - ${validatedEventResult.error.message}`);
202087
+ if (throwOnInvalid) {
202088
+ throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`);
202089
+ }
202090
+ return;
202091
+ }
202092
+ const validatedEvent = validatedEventResult.data;
202093
+ const { eventName, blockNumber } = validatedEvent;
202094
+ this.logger?.log(`Processing ${eventName} event for stake ID ${id} at block ${blockNumber}`);
202095
+ const cacheKey = `${Number(id)}|${eventName}|${staker}`;
202096
+ const existingStakeEvent = this.eventCache.get(cacheKey);
202097
+ const stakeEvent = {
202098
+ name: eventName,
202099
+ args: {
202100
+ id: Number(id),
202101
+ staked: toAddress(staked),
202102
+ staker: toAddress(staker),
202103
+ amount: asAttoXL1(amount)
202104
+ },
202105
+ time: blockNumber
202106
+ };
202107
+ if (isDefined(existingStakeEvent)) {
202108
+ this.logger?.warn(`Received ${eventName} event for stake ID ${id} that is already cached, updating cache...`);
202109
+ this.logger?.warn("1");
202110
+ this.logger?.warn("Previous event", existingStakeEvent);
202111
+ this.logger?.warn("2");
202112
+ this.logger?.warn("New event", stakeEvent);
202113
+ this.logger?.warn("3");
202114
+ }
202115
+ this.eventCache.set(cacheKey, stakeEvent);
202116
+ return stakeEvent;
202117
+ }
202118
+ async startHandler() {
202119
+ try {
202120
+ const currentEthBlock = assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to egt currentEthBlock"));
202121
+ await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
202122
+ this.onEventHandler(staked, staker, id, amount, event);
202123
+ });
202124
+ await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
202125
+ this.onEventHandler(staked, staker, id, amount, event);
202126
+ });
202127
+ await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
202128
+ this.onEventHandler(staked, staker, id, amount, event);
202129
+ });
202130
+ await this.loadHistoricalEvents(currentEthBlock);
202131
+ } catch (error) {
202132
+ this.logger?.error("EthereumChainStakeEvents failed to start:", error);
202133
+ throw error;
202134
+ }
202135
+ }
202136
+ async loadHistoricalEvents(currentEthBlock) {
202137
+ const allStakeEvents = (await Promise.all([
202138
+ this.stakeEventsNative([
202139
+ this.deploymentBlock,
202140
+ currentEthBlock
202141
+ ], {
202142
+ name: "StakeAdded"
202143
+ }),
202144
+ this.stakeEventsNative([
202145
+ this.deploymentBlock,
202146
+ currentEthBlock
202147
+ ], {
202148
+ name: "StakeRemoved"
202149
+ }),
202150
+ this.stakeEventsNative([
202151
+ this.deploymentBlock,
202152
+ currentEthBlock
202153
+ ], {
202154
+ name: "StakeWithdrawn"
202155
+ })
202156
+ ])).flat().toSorted((a, b) => a.time - b.time);
202157
+ console.warn(`Caching ${allStakeEvents.length} stake events from chain starting at block ${this.deploymentBlock}`);
202158
+ for (const event of allStakeEvents) {
202159
+ this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
202160
+ }
202161
+ }
202162
+ async stakeEventsNative(range = [
202163
+ 0,
202164
+ "latest"
202165
+ ], filter) {
202166
+ const name = filter?.name;
202167
+ if (isDefined(name)) {
202168
+ const stakedFilter = filter?.args?.staked;
202169
+ const stakerFilter = filter?.args?.staker;
202170
+ const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : void 0;
202171
+ const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : void 0;
202172
+ let ethEvents = [];
202173
+ const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
202174
+ ethEvents = await this.contract.queryFilter(ethFilter, range[0], range[1]);
202175
+ return ethEvents.map((e) => {
202176
+ assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
202177
+ return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
202178
+ }).filter(exists$2);
202179
+ } else {
202180
+ throw new Error("Only filtered stake events (by name) are supported");
202181
+ }
202182
+ }
202183
+ };
202184
+ EvmStakeEventsViewer = _ts_decorate$5([
202185
+ creatableProvider()
202186
+ ], EvmStakeEventsViewer);
202187
+ function _ts_decorate2$3(decorators, target, key, desc) {
202188
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
202189
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
202190
+ 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;
202191
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
202192
+ }
202193
+ __name$e(_ts_decorate2$3, "_ts_decorate");
201871
202194
  var ethStakeToStake = /* @__PURE__ */ __name$e((ethStake) => {
201872
202195
  const stake = {
201873
202196
  id: Number(ethStake.id),
@@ -201880,16 +202203,16 @@ var ethStakeToStake = /* @__PURE__ */ __name$e((ethStake) => {
201880
202203
  };
201881
202204
  return stake;
201882
202205
  }, "ethStakeToStake");
201883
- var EthereumChainStakeViewer = class _EthereumChainStakeViewer extends AbstractCreatableProvider {
202206
+ var EvmStakeViewer = class _EvmStakeViewer extends AbstractCreatableProvider {
201884
202207
  static {
201885
- __name$e(this, "EthereumChainStakeViewer");
202208
+ __name$e(this, "EvmStakeViewer");
201886
202209
  }
201887
202210
  static defaultMoniker = StakeViewerMoniker;
201888
202211
  static dependencies = [];
201889
202212
  static monikers = [
201890
202213
  StakeViewerMoniker
201891
202214
  ];
201892
- moniker = _EthereumChainStakeViewer.defaultMoniker;
202215
+ moniker = _EvmStakeViewer.defaultMoniker;
201893
202216
  _callMutex = new Mutex$1();
201894
202217
  _deploymentBlock = 0;
201895
202218
  _stakeCache = /* @__PURE__ */ new Map();
@@ -202090,174 +202413,9 @@ var EthereumChainStakeViewer = class _EthereumChainStakeViewer extends AbstractC
202090
202413
  }
202091
202414
  }
202092
202415
  };
202093
- EthereumChainStakeViewer = _ts_decorate$5([
202094
- creatableProvider()
202095
- ], EthereumChainStakeViewer);
202096
- function _ts_decorate2$3(decorators, target, key, desc) {
202097
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
202098
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
202099
- 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;
202100
- return c > 3 && r && Object.defineProperty(target, key, r), r;
202101
- }
202102
- __name$e(_ts_decorate2$3, "_ts_decorate");
202103
- var isStakeLogEventName = /* @__PURE__ */ __name$e((name) => {
202104
- return isString$1(name) && [
202105
- "StakeAdded",
202106
- "StakeRemoved",
202107
- "StakeWithdrawn"
202108
- ].includes(name);
202109
- }, "isStakeLogEventName");
202110
- var EthereumChainStakeEventsViewer = class _EthereumChainStakeEventsViewer extends AbstractCreatableProvider {
202111
- static {
202112
- __name$e(this, "EthereumChainStakeEventsViewer");
202113
- }
202114
- static defaultMoniker = StakeEventsViewerMoniker;
202115
- static dependencies = [];
202116
- static monikers = [
202117
- StakeEventsViewerMoniker
202118
- ];
202119
- moniker = _EthereumChainStakeEventsViewer.defaultMoniker;
202120
- eventCache = /* @__PURE__ */ new Map();
202121
- get contract() {
202122
- return assertEx(this.params.contract, () => new Error("Contract not defined"));
202123
- }
202124
- get deploymentBlock() {
202125
- return this.params.deploymentBlock ?? 0;
202126
- }
202127
- async positionCount(range) {
202128
- const events = await this.stakeEvents(range);
202129
- const positionIds = events.map((e) => e.args.id);
202130
- return Math.max(-1, ...positionIds) + 1;
202131
- }
202132
- stakeEvents(range = [
202133
- 0,
202134
- "latest"
202135
- ], filter) {
202136
- const allEvents = [
202137
- ...this.eventCache.values()
202138
- ];
202139
- const result = allEvents.filter((e) => {
202140
- if (range[1] !== "latest" && e.time > range[1]) {
202141
- return false;
202142
- }
202143
- if (e.time < range[0]) {
202144
- return false;
202145
- }
202146
- if (isDefined(filter?.name) && e.name !== filter.name) {
202147
- return false;
202148
- }
202149
- if (isDefined(filter?.args?.id) && e.args.id !== filter.args.id) {
202150
- return false;
202151
- }
202152
- if (isDefined(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
202153
- return false;
202154
- }
202155
- if (isDefined(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
202156
- return false;
202157
- }
202158
- return true;
202159
- });
202160
- return result;
202161
- }
202162
- onEventHandler(staked, staker, id, amount, { eventName, blockNumber }) {
202163
- if (blockNumber === void 0) {
202164
- this.logger?.warn(`Received ${eventName} event with ${blockNumber} blockNumber, ignoring...`);
202165
- return;
202166
- }
202167
- if (!isStakeLogEventName(eventName)) {
202168
- this.logger?.warn(`Received event with unsupported name '${eventName}'`);
202169
- return;
202170
- }
202171
- this.logger?.log(`Processing ${eventName} event for stake ID ${id} at block ${blockNumber}`);
202172
- const cacheKey = `${Number(id)}|${eventName}|${staker}`;
202173
- const existingStakeEvent = this.eventCache.get(cacheKey);
202174
- const stakeEvent = {
202175
- name: eventName,
202176
- args: {
202177
- id: Number(id),
202178
- staked: toAddress(staked),
202179
- staker: toAddress(staker),
202180
- amount: asAttoXL1(amount)
202181
- },
202182
- time: blockNumber
202183
- };
202184
- if (isDefined(existingStakeEvent)) {
202185
- this.logger?.warn(`Received ${eventName} event for stake ID ${id} that is already cached, updating cache...`);
202186
- this.logger?.warn("1");
202187
- this.logger?.warn("Previous event", existingStakeEvent);
202188
- this.logger?.warn("2");
202189
- this.logger?.warn("New event", stakeEvent);
202190
- this.logger?.warn("3");
202191
- }
202192
- this.eventCache.set(cacheKey, stakeEvent);
202193
- return stakeEvent;
202194
- }
202195
- async startHandler() {
202196
- try {
202197
- const currentEthBlock = assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to egt currentEthBlock"));
202198
- await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
202199
- this.onEventHandler(staked, staker, id, amount, event);
202200
- });
202201
- await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
202202
- this.onEventHandler(staked, staker, id, amount, event);
202203
- });
202204
- await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
202205
- this.onEventHandler(staked, staker, id, amount, event);
202206
- });
202207
- const allStakeEvents = (await Promise.all([
202208
- this.stakeEventsNative([
202209
- this.deploymentBlock,
202210
- currentEthBlock
202211
- ], {
202212
- name: "StakeAdded"
202213
- }),
202214
- this.stakeEventsNative([
202215
- this.deploymentBlock,
202216
- currentEthBlock
202217
- ], {
202218
- name: "StakeRemoved"
202219
- }),
202220
- this.stakeEventsNative([
202221
- this.deploymentBlock,
202222
- currentEthBlock
202223
- ], {
202224
- name: "StakeWithdrawn"
202225
- })
202226
- ])).flat().toSorted((a, b) => a.time - b.time);
202227
- console.warn(`Caching ${allStakeEvents.length} stake events from chain starting at block ${this.deploymentBlock}`);
202228
- for (const event of allStakeEvents) {
202229
- this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
202230
- }
202231
- } catch (error) {
202232
- this.logger?.error("EthereumChainStakeEvents failed to start:", error);
202233
- throw error;
202234
- }
202235
- }
202236
- async stakeEventsNative(range = [
202237
- 0,
202238
- "latest"
202239
- ], filter) {
202240
- const name = filter?.name;
202241
- if (isDefined(name)) {
202242
- const stakedFilter = filter?.args?.staked;
202243
- const stakerFilter = filter?.args?.staker;
202244
- const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : void 0;
202245
- const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : void 0;
202246
- let ethEvents = [];
202247
- const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
202248
- ethEvents = await this.contract.queryFilter(ethFilter, range[0], range[1]);
202249
- return ethEvents.map((e) => {
202250
- assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
202251
- return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e);
202252
- }).filter(exists$2);
202253
- } else {
202254
- throw new Error("Only filtered stake events (by name) are supported");
202255
- }
202256
- }
202257
- };
202258
- EthereumChainStakeEventsViewer = _ts_decorate2$3([
202416
+ EvmStakeViewer = _ts_decorate2$3([
202259
202417
  creatableProvider()
202260
- ], EthereumChainStakeEventsViewer);
202418
+ ], EvmStakeViewer);
202261
202419
  var AbstractEvmProvider = class extends AbstractCreatableProvider {
202262
202420
  static {
202263
202421
  __name$e(this, "AbstractEvmProvider");
@@ -202271,13 +202429,13 @@ var AbstractEvmProvider = class extends AbstractCreatableProvider {
202271
202429
  this._contract = this.connectContract(toEthAddress(this.params.address));
202272
202430
  }
202273
202431
  };
202274
- function _ts_decorate3$2(decorators, target, key, desc) {
202432
+ function _ts_decorate3$3(decorators, target, key, desc) {
202275
202433
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
202276
202434
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
202277
202435
  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;
202278
202436
  return c > 3 && r && Object.defineProperty(target, key, r), r;
202279
202437
  }
202280
- __name$e(_ts_decorate3$2, "_ts_decorate");
202438
+ __name$e(_ts_decorate3$3, "_ts_decorate");
202281
202439
  var EvmChainContractViewer = class _EvmChainContractViewer extends AbstractEvmProvider {
202282
202440
  static {
202283
202441
  __name$e(this, "EvmChainContractViewer");
@@ -202358,7 +202516,7 @@ var EvmChainContractViewer = class _EvmChainContractViewer extends AbstractEvmPr
202358
202516
  return IStakedXyoChain__factory.connect(address, this.params.runner);
202359
202517
  }
202360
202518
  };
202361
- EvmChainContractViewer = _ts_decorate3$2([
202519
+ EvmChainContractViewer = _ts_decorate3$3([
202362
202520
  creatableProvider()
202363
202521
  ], EvmChainContractViewer);
202364
202522
  function _ts_decorate4$1(decorators, target, key, desc) {
@@ -203365,13 +203523,13 @@ var BlockValidationDiviner = class extends AbstractDiviner {
203365
203523
  BlockValidationDiviner = _ts_decorate2$2([
203366
203524
  creatableModule()
203367
203525
  ], BlockValidationDiviner);
203368
- function _ts_decorate3$1(decorators, target, key, desc) {
203526
+ function _ts_decorate3$2(decorators, target, key, desc) {
203369
203527
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
203370
203528
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
203371
203529
  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;
203372
203530
  return c > 3 && r && Object.defineProperty(target, key, r), r;
203373
203531
  }
203374
- __name$b(_ts_decorate3$1, "_ts_decorate");
203532
+ __name$b(_ts_decorate3$2, "_ts_decorate");
203375
203533
  var HeadValidationDivinerConfigSchema = asSchema("network.xyo.diviner.chain.head.validation.config", true);
203376
203534
  var HeadValidationDiviner = class extends AbstractDiviner {
203377
203535
  static {
@@ -203481,7 +203639,7 @@ var HeadValidationDiviner = class extends AbstractDiviner {
203481
203639
  });
203482
203640
  }
203483
203641
  };
203484
- HeadValidationDiviner = _ts_decorate3$1([
203642
+ HeadValidationDiviner = _ts_decorate3$2([
203485
203643
  creatableModule()
203486
203644
  ], HeadValidationDiviner);
203487
203645
  async function processPendingBlocks({ blockViewer, context, finalizedArchivist, logger, mempoolViewer }) {
@@ -204752,13 +204910,13 @@ var createBootstrapHead = /* @__PURE__ */ __name$9(async (account, chainId, gene
204752
204910
  chain.push(producerDeclarationBlock);
204753
204911
  return chain;
204754
204912
  }, "createBootstrapHead");
204755
- function _ts_decorate3(decorators, target, key, desc) {
204913
+ function _ts_decorate3$1(decorators, target, key, desc) {
204756
204914
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
204757
204915
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
204758
204916
  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;
204759
204917
  return c > 3 && r && Object.defineProperty(target, key, r), r;
204760
204918
  }
204761
- __name$9(_ts_decorate3, "_ts_decorate");
204919
+ __name$9(_ts_decorate3$1, "_ts_decorate");
204762
204920
  var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService extends AbstractCreatableProvider {
204763
204921
  static {
204764
204922
  __name$9(this, "BaseNetworkStakeStepRewardService");
@@ -204824,7 +204982,7 @@ var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService
204824
204982
  throw new Error("Method [networkStakeStepRewardsForStepLevel] not implemented.");
204825
204983
  }
204826
204984
  };
204827
- BaseNetworkStakeStepRewardService = _ts_decorate3([
204985
+ BaseNetworkStakeStepRewardService = _ts_decorate3$1([
204828
204986
  creatableProvider()
204829
204987
  ], BaseNetworkStakeStepRewardService);
204830
204988
  var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name$9(async (payload) => {
@@ -205373,19 +205531,20 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
205373
205531
  this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
205374
205532
  this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`);
205375
205533
  const startValidate = Date.now();
205376
- const errors = await this.blockValidationViewer.validateBlock(block, {
205534
+ const validatedBlock = await this.blockValidationViewer.validateBlock(block, {
205377
205535
  head: head._hash
205378
205536
  });
205379
205537
  this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
205380
- if (errors.length > 0) {
205538
+ if (isSignedHydratedBlockWithHashMeta(validatedBlock)) {
205539
+ await this.mempoolRunner.submitBlocks([
205540
+ validatedBlock
205541
+ ]);
205542
+ return validatedBlock;
205543
+ } else {
205544
+ const errors = validatedBlock;
205381
205545
  this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
205382
205546
  const rejectedTransactions = block[1];
205383
205547
  await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
205384
- } else {
205385
- await this.mempoolRunner.submitBlocks([
205386
- block
205387
- ]);
205388
- return block;
205389
205548
  }
205390
205549
  } catch (error) {
205391
205550
  this.logger?.error(`Error proposing next valid block: ${error.message}`);
@@ -297280,8 +297439,8 @@ var __name$6 = (target, value) => __defProp$6(target, "name", { value, configura
297280
297439
  __name$6(this, "BalanceActor");
297281
297440
  }
297282
297441
  _updateMutex = new Mutex$1();
297283
- get balanceService() {
297284
- return assertEx(this.params.balance, () => "balanceService not set");
297442
+ get accountBalanceViewer() {
297443
+ return assertEx(this.params.accountBalanceViewer, () => "balanceService not set");
297285
297444
  }
297286
297445
  get blockViewer() {
297287
297446
  return assertEx(this.params.blockViewer, () => "blockViewer not set");
@@ -297302,7 +297461,7 @@ var __name$6 = (target, value) => __defProp$6(target, "name", { value, configura
297302
297461
  if (this._updateMutex.isLocked()) return;
297303
297462
  await this._updateMutex.runExclusive(async () => {
297304
297463
  const head = await this.blockViewer.currentBlockHash();
297305
- await this.balanceService.accountBalances([], {
297464
+ await this.accountBalanceViewer.accountBalances([], {
297306
297465
  head
297307
297466
  });
297308
297467
  });
@@ -297315,27 +297474,111 @@ function _ts_decorate$2(decorators, target, key, desc) {
297315
297474
  return c > 3 && r && Object.defineProperty(target, key, r), r;
297316
297475
  }
297317
297476
  __name$6(_ts_decorate$2, "_ts_decorate");
297477
+ var MempoolActor = class extends Actor {
297478
+ static {
297479
+ __name$6(this, "MempoolActor");
297480
+ }
297481
+ _blockTimerId = null;
297482
+ _blockTimerMutex = new Mutex$1();
297483
+ _transactionTimerId = null;
297484
+ _transactionTimerMutex = new Mutex$1();
297485
+ get mempoolRunner() {
297486
+ return this.params.mempoolRunner;
297487
+ }
297488
+ get pendingBlocksArchivist() {
297489
+ return this.params.pendingBlocksArchivist;
297490
+ }
297491
+ get pendingTransactionsArchivist() {
297492
+ return this.params.pendingTransactionsArchivist;
297493
+ }
297494
+ static async paramsHandler(params) {
297495
+ return {
297496
+ ...await super.paramsHandler(params),
297497
+ mempoolRunner: assertEx(params?.mempoolRunner, () => "mempoolRunner is required for MempoolActor"),
297498
+ pendingBlocksArchivist: assertEx(params?.pendingBlocksArchivist, () => "pendingBlocksArchivist is required for MempoolActor"),
297499
+ pendingTransactionsArchivist: assertEx(params?.pendingTransactionsArchivist, () => "pendingTransactionsArchivist is required for MempoolActor")
297500
+ };
297501
+ }
297502
+ async startHandler() {
297503
+ await super.startHandler();
297504
+ this.restartBlockTimer();
297505
+ }
297506
+ async stopHandler() {
297507
+ await super.stopHandler();
297508
+ this.stopBlockTimer();
297509
+ }
297510
+ restartBlockTimer() {
297511
+ this.stopBlockTimer();
297512
+ this._blockTimerId = setInterval(() => {
297513
+ if (this._blockTimerMutex.isLocked()) {
297514
+ return;
297515
+ }
297516
+ void this._blockTimerMutex.runExclusive(async () => {
297517
+ await this.mempoolRunner.prunePendingBlocks({
297518
+ batchSize: 50
297519
+ });
297520
+ });
297521
+ }, 1e3);
297522
+ }
297523
+ restartTransactionTimer() {
297524
+ this.stopTransactionTimer();
297525
+ this._transactionTimerId = setInterval(() => {
297526
+ if (this._transactionTimerMutex.isLocked()) {
297527
+ return;
297528
+ }
297529
+ void this._transactionTimerMutex.runExclusive(async () => {
297530
+ await this.mempoolRunner.prunePendingTransactions({
297531
+ batchSize: 50
297532
+ });
297533
+ });
297534
+ }, 1e3);
297535
+ }
297536
+ stopBlockTimer() {
297537
+ if (this._blockTimerId !== null) {
297538
+ clearInterval(this._blockTimerId);
297539
+ }
297540
+ this._blockTimerId = null;
297541
+ }
297542
+ stopTransactionTimer() {
297543
+ if (this._transactionTimerId !== null) {
297544
+ clearInterval(this._transactionTimerId);
297545
+ }
297546
+ this._transactionTimerId = null;
297547
+ }
297548
+ };
297549
+ MempoolActor = _ts_decorate$2([
297550
+ creatable()
297551
+ ], MempoolActor);
297552
+ function _ts_decorate2(decorators, target, key, desc) {
297553
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
297554
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
297555
+ 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;
297556
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
297557
+ }
297558
+ __name$6(_ts_decorate2, "_ts_decorate");
297318
297559
  var ValidatorActor = class extends Actor {
297319
297560
  static {
297320
297561
  __name$6(this, "ValidatorActor");
297321
297562
  }
297322
- _blockViewer;
297323
297563
  _lastValidatedBlock;
297324
297564
  _lastValidatedBlockHash;
297325
- _mempoolViewer;
297326
297565
  get blockViewer() {
297327
- return this._blockViewer;
297566
+ return this.params.blockViewer;
297328
297567
  }
297329
297568
  get finalizedArchivist() {
297330
297569
  return assertEx(this.params.finalizedArchivist, () => "finalizedArchivist not set");
297331
297570
  }
297332
297571
  get mempoolViewer() {
297333
- return this._mempoolViewer;
297572
+ return this.params.mempoolViewer;
297334
297573
  }
297335
- async createHandler() {
297336
- await super.createHandler();
297337
- this._blockViewer = assertEx(this.params.blockViewer ?? await this.locator?.getInstance(BlockViewerMoniker), () => "Unable to locate a BlockViewer");
297338
- this._mempoolViewer = assertEx(this.params.mempoolViewer ?? await this.locator?.getInstance(MempoolViewerMoniker), () => "Unable to locate a MempoolViewer");
297574
+ static async paramsHandler(params) {
297575
+ return {
297576
+ ...await super.paramsHandler(params),
297577
+ mempoolViewer: assertEx(params?.mempoolViewer, () => "mempoolViewer is required for ValidatorActor"),
297578
+ blockViewer: assertEx(params?.blockViewer, () => "blockViewer is required for ValidatorActor"),
297579
+ finalizedArchivist: assertEx(params?.finalizedArchivist, () => "finalizedArchivist is required for ValidatorActor"),
297580
+ account: assertEx(params?.account, () => "account is required for ValidatorActor")
297581
+ };
297339
297582
  }
297340
297583
  async startHandler() {
297341
297584
  await super.startHandler();
@@ -297372,7 +297615,7 @@ var ValidatorActor = class extends Actor {
297372
297615
  return valid;
297373
297616
  }
297374
297617
  };
297375
- ValidatorActor = _ts_decorate$2([
297618
+ ValidatorActor = _ts_decorate2([
297376
297619
  creatable()
297377
297620
  ], ValidatorActor);
297378
297621
  var DEFAULT_STORAGE_ROOT = path.join(process.cwd(), ".store");
@@ -297693,19 +297936,19 @@ async function initEvmChainStakeViewer(context, config, logger) {
297693
297936
  });
297694
297937
  const contractAddress = assertEx(config.chain.id, () => "Missing config.evm.chainId");
297695
297938
  const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider2);
297696
- const stakeEventsViewer = await EthereumChainStakeEventsViewer.create({
297939
+ const stakeEventsViewer = await EvmStakeEventsViewer.create({
297697
297940
  contract,
297698
297941
  logger,
297699
297942
  context
297700
297943
  });
297701
- assertEx(await stakeEventsViewer.start(), () => "Failed to start EthereumChainStakeEvents reader");
297702
- const stakeChainViewer = await EthereumChainStakeViewer.create({
297944
+ assertEx(await stakeEventsViewer.start(), () => "Failed to start EvmStakeEvents reader");
297945
+ const stakeChainViewer = await EvmStakeViewer.create({
297703
297946
  contract,
297704
297947
  stakeEventsViewer,
297705
297948
  logger,
297706
297949
  context
297707
297950
  });
297708
- assertEx(await stakeChainViewer.start(), () => "Failed to start EthereumChainStake viewer");
297951
+ assertEx(await stakeChainViewer.start(), () => "Failed to start EvmStake viewer");
297709
297952
  return stakeChainViewer;
297710
297953
  }
297711
297954
  __name$6(initEvmChainStakeViewer, "initEvmChainStakeViewer");
@@ -298127,13 +298370,13 @@ async function initRewardsRedemptionApiWallet({ config, logger }) {
298127
298370
  }, mnemonic);
298128
298371
  }
298129
298372
  __name$6(initRewardsRedemptionApiWallet, "initRewardsRedemptionApiWallet");
298130
- function _ts_decorate2(decorators, target, key, desc) {
298373
+ function _ts_decorate3(decorators, target, key, desc) {
298131
298374
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
298132
298375
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
298133
298376
  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;
298134
298377
  return c > 3 && r && Object.defineProperty(target, key, r), r;
298135
298378
  }
298136
- __name$6(_ts_decorate2, "_ts_decorate");
298379
+ __name$6(_ts_decorate3, "_ts_decorate");
298137
298380
  var Orchestrator = class extends AbstractCreatable {
298138
298381
  static {
298139
298382
  __name$6(this, "Orchestrator");
@@ -298186,7 +298429,7 @@ var Orchestrator = class extends AbstractCreatable {
298186
298429
  this.logger?.log("[Orchestrator] Stopped...");
298187
298430
  }
298188
298431
  };
298189
- Orchestrator = _ts_decorate2([
298432
+ Orchestrator = _ts_decorate3([
298190
298433
  creatable()
298191
298434
  ], Orchestrator);
298192
298435
 
@@ -298551,6 +298794,10 @@ async function getServer$3(params) {
298551
298794
  node,
298552
298795
  chainId
298553
298796
  });
298797
+ locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
298798
+ state: validateHydratedBlockState,
298799
+ protocol: validateHydratedBlock
298800
+ }));
298554
298801
  if (canUseEvmProvider({
298555
298802
  config
298556
298803
  })) {
@@ -298560,12 +298807,12 @@ async function getServer$3(params) {
298560
298807
  });
298561
298808
  const contractAddress = assertEx(config.chain.id, () => "Missing config.chain.chainId");
298562
298809
  const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider);
298563
- locator.register(EthereumChainStakeEventsViewer.factory(EthereumChainStakeEventsViewer.dependencies, {
298810
+ locator.register(EvmStakeEventsViewer.factory(EvmStakeEventsViewer.dependencies, {
298564
298811
  contract
298565
298812
  }));
298566
- const stakeEventsViewer = await locator.getInstance(EthereumChainStakeEventsViewer.defaultMoniker);
298567
- assertEx(await stakeEventsViewer.start(), () => "Failed to start EthereumChainStakeEventsViewer");
298568
- locator.register(EthereumChainStakeViewer.factory(EthereumChainStakeViewer.dependencies, {
298813
+ const stakeEventsViewer = await locator.getInstance(EvmStakeEventsViewer.defaultMoniker);
298814
+ assertEx(await stakeEventsViewer.start(), () => "Failed to start EvmStakeEventsViewer");
298815
+ locator.register(EvmStakeViewer.factory(EvmStakeViewer.dependencies, {
298569
298816
  contract,
298570
298817
  stakeEventsViewer
298571
298818
  }));
@@ -298573,6 +298820,9 @@ async function getServer$3(params) {
298573
298820
  address: asAddress(contractAddress, true),
298574
298821
  runner: provider
298575
298822
  }));
298823
+ locator.register(SimpleTimeSyncViewer.factory(SimpleTimeSyncViewer.dependencies, {
298824
+ ethProvider: provider
298825
+ }));
298576
298826
  }
298577
298827
  const apiContext = {
298578
298828
  ...initContext,
@@ -298590,14 +298840,29 @@ async function getServer$3(params) {
298590
298840
  assertEx(await accountBalanceViewer.start(), () => "Failed to start AccountBalanceViewer");
298591
298841
  const xyoViewer = await locator.getInstance(XyoViewerMoniker);
298592
298842
  assertEx(await xyoViewer.start(), () => "Failed to start XyoViewer");
298843
+ const mempoolViewer = await locator.getInstance(MempoolViewerMoniker);
298844
+ assertEx(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
298845
+ const mempoolRunner = await locator.getInstance(MempoolRunnerMoniker);
298846
+ assertEx(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
298593
298847
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
298594
- const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
298848
+ const validatorActor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
298595
298849
  id: "validator-mempool-server",
298596
298850
  account: wallet,
298597
298851
  context: locator.context,
298598
- finalizedArchivist: writableChainArchivist
298852
+ finalizedArchivist: writableChainArchivist,
298853
+ mempoolViewer,
298854
+ blockViewer
298599
298855
  });
298600
- await actor?.start();
298856
+ await validatorActor?.start();
298857
+ const mempoolActor = config.mempool.enabled ? void 0 : await MempoolActor.create({
298858
+ id: "mempool-mempool-server",
298859
+ account: wallet,
298860
+ context: locator.context,
298861
+ mempoolRunner,
298862
+ pendingBlocksArchivist,
298863
+ pendingTransactionsArchivist
298864
+ });
298865
+ await mempoolActor?.start();
298601
298866
  const app = await getApp$3(apiContext);
298602
298867
  const server = app.listen(port, hostname$3, () => logger?.log(`[API] Server listening at http://${hostname$3}:${port}`));
298603
298868
  server.setTimeout(2e4);
@@ -342442,6 +342707,10 @@ var getApp$1 = /* @__PURE__ */ __name$2((context) => {
342442
342707
  var hostname$1 = "::";
342443
342708
  var getProviderFactoryLocator = /* @__PURE__ */ __name$2((context, finalizedArchivist, pendingTransactionsArchivist, pendingBlocksArchivist) => {
342444
342709
  const locator = new ProviderFactoryLocator(context);
342710
+ locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
342711
+ state: validateHydratedBlockState,
342712
+ protocol: validateHydratedBlock
342713
+ }));
342445
342714
  locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
342446
342715
  pendingTransactionsArchivist,
342447
342716
  pendingBlocksArchivist
@@ -342513,12 +342782,16 @@ var getServer$1 = /* @__PURE__ */ __name$2(async (context) => {
342513
342782
  assertEx(await blockViewer.start(), () => "Failed to start BlockViewer");
342514
342783
  const blk = await blockViewer.currentBlock();
342515
342784
  assertEx(blk, () => "No blocks found after initialization");
342785
+ const mempoolViewer = await locator.getInstance(MempoolViewerMoniker);
342786
+ assertEx(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
342516
342787
  console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
342517
342788
  const actor = await ValidatorActor.create({
342518
342789
  id: "validator-mempool-server",
342519
342790
  account: wallet,
342520
342791
  context: locator.context,
342521
- finalizedArchivist: writableChainArchivist
342792
+ finalizedArchivist: writableChainArchivist,
342793
+ blockViewer,
342794
+ mempoolViewer
342522
342795
  });
342523
342796
  await actor.start();
342524
342797
  const app = getApp$1(mempoolContext);
@@ -350214,7 +350487,7 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
350214
350487
 
350215
350488
  // src/runCLI.ts
350216
350489
  var configuration;
350217
- var version = isDefined("1.19.2") ? "1.19.2" : "unknown";
350490
+ var version = isDefined("1.19.4") ? "1.19.4" : "unknown";
350218
350491
  var getContextFromConfig = /* @__PURE__ */ __name(async (configuration2) => {
350219
350492
  const logger = initLogger(configuration2);
350220
350493
  const orchestrator = await Orchestrator.create({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/xl1-cli",
3
- "version": "1.19.3",
3
+ "version": "1.19.5",
4
4
  "description": "XYO Layer One CLI",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -75,15 +75,15 @@
75
75
  "@xyo-network/payload-model": "~5.3.2",
76
76
  "@xyo-network/wallet": "~5.3.2",
77
77
  "@xyo-network/wallet-model": "~5.3.2",
78
- "@xyo-network/xl1-cli-lib": "~1.19.3",
79
- "@xyo-network/xl1-sdk": "~1.20.9",
78
+ "@xyo-network/xl1-cli-lib": "~1.19.5",
79
+ "@xyo-network/xl1-sdk": "~1.21.10",
80
80
  "async-mutex": "~0.5.0",
81
81
  "dotenv": "~17.2.3",
82
82
  "eslint": "^9.39.2",
83
83
  "ethers": "^6.16.0",
84
84
  "nodemon": "~3.1.11",
85
85
  "rimraf": "~6.1.2",
86
- "rollup": "~4.57.0",
86
+ "rollup": "~4.57.1",
87
87
  "typescript": "~5.9.3",
88
88
  "vitest": "~4.0.18",
89
89
  "vitest-mock-extended": "~3.1.0",