@xyo-network/chain-services 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,26 +1,30 @@
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/BlockReward/EvmBlockRewardViewer.ts
5
- import { AbstractCreatable, assertEx, creatable, toEthAddress } from "@xylabs/sdk-js";
15
+ import {
16
+ AbstractCreatable,
17
+ assertEx,
18
+ creatable,
19
+ toEthAddress
20
+ } from "@xylabs/sdk-js";
6
21
  import { IXyoChainRewards__factory } from "@xyo-network/typechain";
7
- import { asAttoXL1, BlockRewardViewerMoniker } from "@xyo-network/xl1-sdk";
8
- function _ts_decorate(decorators, target, key, desc) {
9
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
- 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;
12
- return c > 3 && r && Object.defineProperty(target, key, r), r;
13
- }
14
- __name(_ts_decorate, "_ts_decorate");
15
- var EvmBlockRewardViewer = class _EvmBlockRewardViewer extends AbstractCreatable {
16
- static {
17
- __name(this, "EvmBlockRewardViewer");
18
- }
19
- static defaultMoniker = BlockRewardViewerMoniker;
20
- static monikers = [
21
- BlockRewardViewerMoniker
22
- ];
23
- moniker = _EvmBlockRewardViewer.defaultMoniker;
22
+ import {
23
+ asAttoXL1,
24
+ BlockRewardViewerMoniker
25
+ } from "@xyo-network/xl1-sdk";
26
+ var EvmBlockRewardViewer = class extends AbstractCreatable {
27
+ moniker = EvmBlockRewardViewer.defaultMoniker;
24
28
  _contractAddress;
25
29
  get chainContractViewer() {
26
30
  return assertEx(this.params.chainContractViewer, () => "chainContractViewer is required");
@@ -41,22 +45,19 @@ var EvmBlockRewardViewer = class _EvmBlockRewardViewer extends AbstractCreatable
41
45
  this._contractAddress = await this.chainContractViewer.rewardsContract();
42
46
  } catch (ex) {
43
47
  const error = ex;
44
- throw new Error(`Failed to get rewards contract address: ${error.message}`, {
45
- cause: ex
46
- });
48
+ throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex });
47
49
  }
48
50
  }
49
51
  };
50
- EvmBlockRewardViewer = _ts_decorate([
52
+ __publicField(EvmBlockRewardViewer, "defaultMoniker", BlockRewardViewerMoniker);
53
+ __publicField(EvmBlockRewardViewer, "monikers", [BlockRewardViewerMoniker]);
54
+ EvmBlockRewardViewer = __decorateClass([
51
55
  creatable()
52
56
  ], EvmBlockRewardViewer);
53
57
 
54
58
  // src/ChainValidator/XyoValidator.ts
55
59
  import { AbstractCreatableProvider, BlockViewerMoniker } from "@xyo-network/xl1-sdk";
56
60
  var XyoValidator = class extends AbstractCreatableProvider {
57
- static {
58
- __name(this, "XyoValidator");
59
- }
60
61
  moniker = "Validator";
61
62
  _blockViewer;
62
63
  // get address() {
@@ -97,24 +98,12 @@ var XyoValidator = class extends AbstractCreatableProvider {
97
98
  // src/Election/BaseElectionService.ts
98
99
  import { assertEx as assertEx2 } from "@xylabs/sdk-js";
99
100
  import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
100
- import { AbstractCreatableProvider as AbstractCreatableProvider2, creatableProvider } from "@xyo-network/xl1-sdk";
101
- function _ts_decorate2(decorators, target, key, desc) {
102
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
103
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
104
- 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;
105
- return c > 3 && r && Object.defineProperty(target, key, r), r;
106
- }
107
- __name(_ts_decorate2, "_ts_decorate");
108
- var BaseElectionService = class _BaseElectionService extends AbstractCreatableProvider2 {
109
- static {
110
- __name(this, "BaseElectionService");
111
- }
112
- static defaultMoniker = "Election";
113
- static dependencies = [];
114
- static monikers = [
115
- "Election"
116
- ];
117
- moniker = _BaseElectionService.defaultMoniker;
101
+ import {
102
+ AbstractCreatableProvider as AbstractCreatableProvider2,
103
+ creatableProvider
104
+ } from "@xyo-network/xl1-sdk";
105
+ var BaseElectionService = class extends AbstractCreatableProvider2 {
106
+ moniker = BaseElectionService.defaultMoniker;
118
107
  get blockViewer() {
119
108
  return assertEx2(this.params.blockViewer, () => "No block viewer");
120
109
  }
@@ -139,32 +128,51 @@ var BaseElectionService = class _BaseElectionService extends AbstractCreatablePr
139
128
  return creatorArray.slice(0, maxSize);
140
129
  }
141
130
  };
142
- BaseElectionService = _ts_decorate2([
131
+ __publicField(BaseElectionService, "defaultMoniker", "Election");
132
+ __publicField(BaseElectionService, "dependencies", []);
133
+ __publicField(BaseElectionService, "monikers", ["Election"]);
134
+ BaseElectionService = __decorateClass([
143
135
  creatableProvider()
144
136
  ], BaseElectionService);
145
137
 
146
138
  // src/implementation/head/createBootstrapHead.ts
147
139
  import { buildNextBlock, createGenesisBlock } from "@xyo-network/chain-protocol";
148
140
  import { createDeclarationIntent } from "@xyo-network/xl1-sdk";
149
- var createBootstrapHead = /* @__PURE__ */ __name(async (account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress) => {
141
+ var createBootstrapHead = async (account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress) => {
150
142
  const chain = [];
151
143
  const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress);
152
144
  chain.push(genesisBlock);
153
- const producerDeclarationPayload = createDeclarationIntent(account.address, "producer", genesisBlock[0].block, genesisBlock[0].block + 1e4);
154
- const producerDeclarationBlock = await buildNextBlock(genesisBlock[0], [], [
155
- producerDeclarationPayload
156
- ], [
157
- account
158
- ]);
145
+ const producerDeclarationPayload = createDeclarationIntent(
146
+ account.address,
147
+ "producer",
148
+ genesisBlock[0].block,
149
+ genesisBlock[0].block + 1e4
150
+ );
151
+ const producerDeclarationBlock = await buildNextBlock(
152
+ genesisBlock[0],
153
+ [],
154
+ [producerDeclarationPayload],
155
+ [account]
156
+ );
159
157
  chain.push(producerDeclarationBlock);
160
158
  return chain;
161
- }, "createBootstrapHead");
159
+ };
162
160
 
163
161
  // src/implementation/processPendingBlocks.ts
164
162
  import { assertEx as assertEx3, isDefined } from "@xylabs/sdk-js";
165
163
  import { ChainHeadSelector } from "@xyo-network/chain-analyze";
166
164
  import { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from "@xyo-network/xl1-sdk";
167
- async function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner }) {
165
+ async function processPendingBlocks({
166
+ blockValidationViewer,
167
+ blockViewer,
168
+ context,
169
+ logger,
170
+ mempoolViewer,
171
+ finalizationRunner,
172
+ allowedProducers,
173
+ minCandidates,
174
+ deadLetterQueueRunner
175
+ }) {
168
176
  const start = Date.now();
169
177
  const currentBlock = await blockViewer.currentBlock();
170
178
  const headSelector = new ChainHeadSelector({
@@ -172,9 +180,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
172
180
  logger,
173
181
  mempoolViewer,
174
182
  blockViewer,
175
- windowedFinalizedChain: [
176
- currentBlock
177
- ],
183
+ windowedFinalizedChain: [currentBlock],
178
184
  allowedProducers,
179
185
  minCandidates
180
186
  });
@@ -192,12 +198,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
192
198
  const candidateBlocks = bestHeadChain.filter((b) => {
193
199
  return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true;
194
200
  });
195
- const validationResults = await Promise.all(candidateBlocks.map((candidateBlock) => blockValidationViewer.validateBlocks([
196
- candidateBlock
197
- ], {
198
- value: true,
199
- state: true
200
- })));
201
+ const validationResults = await Promise.all(candidateBlocks.map((candidateBlock) => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })));
201
202
  const blocksToFinalize = [];
202
203
  for (const [i, block] of candidateBlocks.entries()) {
203
204
  const result = validationResults[i][0];
@@ -210,12 +211,7 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
210
211
  hash: block[0]._hash,
211
212
  name: "BlockValidationError",
212
213
  message: String(e.message ?? e)
213
- })) : [
214
- {
215
- hash: block[0]._hash,
216
- name: "BlockValidationError"
217
- }
218
- ];
214
+ })) : [{ hash: block[0]._hash, name: "BlockValidationError" }];
219
215
  await deadLetterQueueRunner.rejectBlock({
220
216
  schema: BlockRejectionSchema,
221
217
  block,
@@ -236,27 +232,15 @@ async function processPendingBlocks({ blockValidationViewer, blockViewer, contex
236
232
  logger?.info("No head found to validate", currentBlock?.[0]._hash);
237
233
  }
238
234
  }
239
- __name(processPendingBlocks, "processPendingBlocks");
240
235
 
241
236
  // src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
242
- import { AbstractCreatableProvider as AbstractCreatableProvider3, creatableProvider as creatableProvider2, NetworkStakeStepRewardViewerMoniker } from "@xyo-network/xl1-sdk";
243
- function _ts_decorate3(decorators, target, key, desc) {
244
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
245
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
246
- 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;
247
- return c > 3 && r && Object.defineProperty(target, key, r), r;
248
- }
249
- __name(_ts_decorate3, "_ts_decorate");
250
- var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService extends AbstractCreatableProvider3 {
251
- static {
252
- __name(this, "BaseNetworkStakeStepRewardService");
253
- }
254
- static defaultMoniker = NetworkStakeStepRewardViewerMoniker;
255
- static dependencies = [];
256
- static monikers = [
257
- NetworkStakeStepRewardViewerMoniker
258
- ];
259
- moniker = _BaseNetworkStakeStepRewardService.defaultMoniker;
237
+ import {
238
+ AbstractCreatableProvider as AbstractCreatableProvider3,
239
+ creatableProvider as creatableProvider2,
240
+ NetworkStakeStepRewardViewerMoniker
241
+ } from "@xyo-network/xl1-sdk";
242
+ var BaseNetworkStakeStepRewardService = class extends AbstractCreatableProvider3 {
243
+ moniker = BaseNetworkStakeStepRewardService.defaultMoniker;
260
244
  networkStakeStepRewardAddressHistory(_address) {
261
245
  throw new Error("Method [networkStakeStepRewardAddressHistory] not implemented.");
262
246
  }
@@ -312,28 +296,62 @@ var BaseNetworkStakeStepRewardService = class _BaseNetworkStakeStepRewardService
312
296
  throw new Error("Method [networkStakeStepRewardsForStepLevel] not implemented.");
313
297
  }
314
298
  };
315
- BaseNetworkStakeStepRewardService = _ts_decorate3([
299
+ __publicField(BaseNetworkStakeStepRewardService, "defaultMoniker", NetworkStakeStepRewardViewerMoniker);
300
+ __publicField(BaseNetworkStakeStepRewardService, "dependencies", []);
301
+ __publicField(BaseNetworkStakeStepRewardService, "monikers", [NetworkStakeStepRewardViewerMoniker]);
302
+ BaseNetworkStakeStepRewardService = __decorateClass([
316
303
  creatableProvider2()
317
304
  ], BaseNetworkStakeStepRewardService);
318
305
 
319
306
  // src/simple/block/runner/SimpleBlockRunner.ts
320
- import { assertEx as assertEx5, exists, hexToBigInt, isDefined as isDefined2 } from "@xylabs/sdk-js";
307
+ import {
308
+ assertEx as assertEx5,
309
+ exists,
310
+ hexToBigInt,
311
+ isDefined as isDefined2
312
+ } from "@xylabs/sdk-js";
321
313
  import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
322
314
  import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
323
- import { MemoryArchivist, PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
324
- import { AbstractCreatableProvider as AbstractCreatableProvider4, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1, BlockNumberSchema, BlockRejectionSchema as BlockRejectionSchema2, BlockRewardViewerMoniker as BlockRewardViewerMoniker2, BlockRunnerMoniker, BlockValidationViewerMoniker, creatableProvider as creatableProvider3, createDeclarationIntent as createDeclarationIntent2, DeadLetterQueueRunnerMoniker, defaultRewardRatio, FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta as isSignedHydratedBlockWithHashMeta2, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker, TransactionRejectionSchema, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-sdk";
315
+ import {
316
+ MemoryArchivist,
317
+ PayloadBuilder as PayloadBuilder2
318
+ } from "@xyo-network/sdk-js";
319
+ import {
320
+ AbstractCreatableProvider as AbstractCreatableProvider4,
321
+ AccountBalanceViewerMoniker,
322
+ asBlockBoundWitness,
323
+ AttoXL1,
324
+ BlockNumberSchema,
325
+ BlockRejectionSchema as BlockRejectionSchema2,
326
+ BlockRewardViewerMoniker as BlockRewardViewerMoniker2,
327
+ BlockRunnerMoniker,
328
+ BlockValidationViewerMoniker,
329
+ creatableProvider as creatableProvider3,
330
+ createDeclarationIntent as createDeclarationIntent2,
331
+ DeadLetterQueueRunnerMoniker,
332
+ defaultRewardRatio,
333
+ FinalizationViewerMoniker,
334
+ isSignedHydratedBlockWithHashMeta as isSignedHydratedBlockWithHashMeta2,
335
+ MempoolRunnerMoniker,
336
+ MempoolViewerMoniker,
337
+ TimeSyncViewerMoniker,
338
+ TransactionRejectionSchema,
339
+ XYO_STEP_REWARD_ADDRESS
340
+ } from "@xyo-network/xl1-sdk";
325
341
 
326
342
  // src/simple/block/runner/generateTransactionFeeTransfers.ts
327
343
  import { hexFromBigInt } from "@xylabs/sdk-js";
328
344
  import { assertEx as assertEx4 } from "@xylabs/sdk-js";
329
345
  import { PayloadBuilder } from "@xyo-network/sdk-js";
330
- import { HydratedTransactionWrapper, transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-sdk";
346
+ import {
347
+ HydratedTransactionWrapper,
348
+ transactionRequiredGas,
349
+ TransferSchema,
350
+ XYO_ZERO_ADDRESS
351
+ } from "@xyo-network/xl1-sdk";
331
352
  async function generateTransactionFeeTransfers(address, transactions) {
332
353
  const txs = await Promise.all(transactions.map(async (tx) => {
333
- return HydratedTransactionWrapper.parse([
334
- await PayloadBuilder.addStorageMeta(tx[0]),
335
- await PayloadBuilder.addStorageMeta(tx[1])
336
- ]);
354
+ return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])]);
337
355
  }));
338
356
  const txBaseFeeCosts = {};
339
357
  for (const tx of txs) {
@@ -363,39 +381,67 @@ async function generateTransactionFeeTransfers(address, transactions) {
363
381
  }
364
382
  return payloads;
365
383
  }
366
- __name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
367
384
 
368
- // src/simple/block/runner/SimpleBlockRunner.ts
369
- function _ts_decorate4(decorators, target, key, desc) {
370
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
371
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
372
- 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;
373
- return c > 3 && r && Object.defineProperty(target, key, r), r;
385
+ // src/simple/block/runner/identifyOffendingTransactions.ts
386
+ import {
387
+ HydratedTransactionWrapper as HydratedTransactionWrapper2,
388
+ netBalancesForPayloads,
389
+ transactionRequiredGas as transactionRequiredGas2
390
+ } from "@xyo-network/xl1-sdk";
391
+ async function scoreTransaction(tx) {
392
+ const wrapper = await HydratedTransactionWrapper2.parse(tx);
393
+ const from = wrapper.boundWitness.from;
394
+ const gasPrice = wrapper.fees.gasPrice;
395
+ const gasCost = transactionRequiredGas2(tx) * gasPrice;
396
+ const baseCost = wrapper.fees.base;
397
+ const netBalances = netBalancesForPayloads({ singletons: {} }, tx[1]);
398
+ const fromNet = netBalances[from] ?? 0n;
399
+ const transferOut = fromNet < 0n ? -fromNet : 0n;
400
+ return { cost: gasCost + baseCost + transferOut, gasPrice };
401
+ }
402
+ async function identifyOffendingTransactions(args) {
403
+ const { errors, candidateTransactions } = args;
404
+ const candidateHashes = new Set(candidateTransactions.map((tx) => tx[0]._hash));
405
+ const txInvalidHashes = /* @__PURE__ */ new Set();
406
+ for (const error of errors) {
407
+ if (candidateHashes.has(error.hash)) txInvalidHashes.add(error.hash);
408
+ const cause = error.cause;
409
+ if (cause?.hash && candidateHashes.has(cause.hash)) txInvalidHashes.add(cause.hash);
410
+ }
411
+ if (txInvalidHashes.size > 0) {
412
+ return { offendingHashes: [...txInvalidHashes], reason: "tx-invalid" };
413
+ }
414
+ const balanceOffenderHashes = /* @__PURE__ */ new Set();
415
+ for (const error of errors) {
416
+ const offendingHashes = error.offendingTransactionHashes ?? [];
417
+ for (const hash of offendingHashes) {
418
+ if (candidateHashes.has(hash)) balanceOffenderHashes.add(hash);
419
+ }
420
+ }
421
+ if (balanceOffenderHashes.size === 0) {
422
+ return { offendingHashes: [], reason: "unknown" };
423
+ }
424
+ const offenders = candidateTransactions.filter((tx) => balanceOffenderHashes.has(tx[0]._hash));
425
+ const scored = await Promise.all(offenders.map(async (tx) => ({ tx, ...await scoreTransaction(tx) })));
426
+ scored.sort((a, b) => {
427
+ if (a.cost !== b.cost) return a.cost < b.cost ? 1 : -1;
428
+ if (a.gasPrice !== b.gasPrice) return a.gasPrice < b.gasPrice ? -1 : 1;
429
+ return a.tx[0]._hash < b.tx[0]._hash ? -1 : 1;
430
+ });
431
+ return { offendingHashes: [scored[0].tx[0]._hash], reason: "block-balance" };
374
432
  }
375
- __name(_ts_decorate4, "_ts_decorate");
433
+
434
+ // src/simple/block/runner/SimpleBlockRunner.ts
376
435
  var DEFAULT_BLOCK_SIZE = 10;
377
436
  var XYO_PRODUCER_REDECLARATION_DURATION = 100;
378
437
  var XYO_PRODUCER_REDECLARATION_WINDOW = 100;
379
- var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvider4 {
380
- static {
381
- __name(this, "SimpleBlockRunner");
382
- }
383
- static defaultMoniker = BlockRunnerMoniker;
384
- static dependencies = [
385
- AccountBalanceViewerMoniker,
386
- BlockRewardViewerMoniker2,
387
- BlockValidationViewerMoniker,
388
- FinalizationViewerMoniker,
389
- MempoolRunnerMoniker,
390
- MempoolViewerMoniker,
391
- TimeSyncViewerMoniker
392
- ];
393
- static monikers = [
394
- BlockRunnerMoniker
395
- ];
396
- moniker = _SimpleBlockRunner.defaultMoniker;
438
+ var SimpleBlockRunner = class extends AbstractCreatableProvider4 {
439
+ moniker = SimpleBlockRunner.defaultMoniker;
397
440
  _blockRewardDiviner;
398
441
  _deadLetterQueueRunner;
442
+ // TODO(producer-exclusion-set): uncapped for v1. If memory grows in long-running producers,
443
+ // add FIFO eviction or a TTL keyed off block number.
444
+ _excludedTransactionHashes = /* @__PURE__ */ new Set();
399
445
  _lastRedeclarationBlock;
400
446
  _rejectedTransactionsArchivist;
401
447
  _account;
@@ -409,22 +455,22 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
409
455
  _rewardAddress;
410
456
  _timeSyncViewer;
411
457
  /**
412
- * The default block size for a block
413
- */
458
+ * The default block size for a block
459
+ */
414
460
  static get DefaultBlockSize() {
415
461
  return DEFAULT_BLOCK_SIZE;
416
462
  }
417
463
  /**
418
- * The amount of time for which the producer will redeclare
419
- * their intent to continue producing blocks
420
- */
464
+ * The amount of time for which the producer will redeclare
465
+ * their intent to continue producing blocks
466
+ */
421
467
  static get RedeclarationDuration() {
422
468
  return XYO_PRODUCER_REDECLARATION_DURATION;
423
469
  }
424
470
  /**
425
- * The number of blocks within which the producer will redeclare
426
- * their intent to continue producing blocks
427
- */
471
+ * The number of blocks within which the producer will redeclare
472
+ * their intent to continue producing blocks
473
+ */
428
474
  static get RedeclarationWindow() {
429
475
  return XYO_PRODUCER_REDECLARATION_WINDOW;
430
476
  }
@@ -506,30 +552,24 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
506
552
  }
507
553
  });
508
554
  }
509
- const blockId = new PayloadBuilder2({
510
- schema: BlockNumberSchema
511
- }).fields({
512
- block
513
- }).build();
514
- const rewards = await this._blockRewardDiviner.divine([
515
- blockId
516
- ]);
555
+ const blockId = new PayloadBuilder2({ schema: BlockNumberSchema }).fields({ block }).build();
556
+ const rewards = await this._blockRewardDiviner.divine([blockId]);
517
557
  return rewards;
518
558
  }
519
559
  /**
520
- * Handles the producer redeclaration logic
521
- * @param head The current head block
522
- * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
523
- */
560
+ * Handles the producer redeclaration logic
561
+ * @param head The current head block
562
+ * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
563
+ */
524
564
  getProducerRedeclaration(head) {
525
565
  if (this.params.disableIntentRedeclaration) return;
526
566
  const currentBlock = head.block;
527
567
  if (isDefined2(this._lastRedeclarationBlock)) {
528
- const lastDeclarationExpiry = this._lastRedeclarationBlock + _SimpleBlockRunner.RedeclarationDuration;
568
+ const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration;
529
569
  if (currentBlock < lastDeclarationExpiry) return;
530
570
  }
531
571
  this._lastRedeclarationBlock = currentBlock;
532
- return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock + _SimpleBlockRunner.RedeclarationDuration);
572
+ return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration);
533
573
  }
534
574
  async proposeNextValidBlock(head, validateBalances = false, force = false) {
535
575
  return await this.spanAsync("proposeNextValidBlock", async () => {
@@ -537,17 +577,16 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
537
577
  const { block: previousBlock } = assertEx5(asBlockBoundWitness(head), () => "Invalid head block");
538
578
  const nextBlock = previousBlock + 1;
539
579
  const chainId = await this.finalizationViewer.chainId();
540
- const pendingTransactions = await this.mempoolViewer.pendingTransactions({
541
- limit: _SimpleBlockRunner.DefaultBlockSize
542
- });
580
+ const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize });
581
+ const pendingTransactions = pendingTransactionsRaw.filter((tx) => !this._excludedTransactionHashes.has(tx[0]._hash));
543
582
  const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId);
544
583
  this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`);
545
- const blockPayloads = [];
584
+ const nonTxPayloads = [];
546
585
  const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
547
- if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
586
+ if (producerRedeclarationPayload) nonTxPayloads.push(producerRedeclarationPayload);
548
587
  if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return;
549
588
  const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
550
- blockPayloads.push(...rewardTransferPayloads);
589
+ nonTxPayloads.push(...rewardTransferPayloads);
551
590
  const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
552
591
  const timeStart = Date.now();
553
592
  const timePayload = await this.generateTimePayload();
@@ -555,48 +594,22 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
555
594
  if (timeDuration > 100) {
556
595
  this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
557
596
  }
558
- const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
559
- blockPayloads.push(...fundedTransfers, timePayload);
560
- this.logger?.info(`Building block ${head.block + 1}`);
561
- const startBuild = Date.now();
562
- const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([
563
- XYO_STEP_REWARD_ADDRESS
564
- ]))[XYO_STEP_REWARD_ADDRESS];
565
- const block = await buildNextBlock2(head, fundedNextBlockTransactions, blockPayloads, [
566
- this.account
567
- ], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance, void 0, chainId);
568
- this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
569
- this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`);
570
- const startValidate = Date.now();
571
- const validatedBlock = await this.blockValidationViewer.validateBlock(block, {
572
- head: head._hash
597
+ const [initialFundedTransactions, initialFundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
598
+ const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS];
599
+ const result = await this.runBuildValidateRetryLoop({
600
+ head,
601
+ chainId,
602
+ stepRewardPoolBalance,
603
+ nonTxPayloads,
604
+ timePayload,
605
+ initialFundedTransactions,
606
+ initialFundedTransfers
573
607
  });
574
- this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
575
- if (isSignedHydratedBlockWithHashMeta2(validatedBlock)) {
576
- await this.mempoolRunner.submitBlocks([
577
- validatedBlock
578
- ]);
579
- return validatedBlock;
580
- } else {
581
- const errors = validatedBlock;
582
- this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
583
- if (this._deadLetterQueueRunner) {
584
- const rejectionErrors = errors.map((e) => ({
585
- hash: block[0]._hash,
586
- name: "BlockValidationError",
587
- message: String(e.message ?? e)
588
- }));
589
- await this._deadLetterQueueRunner.rejectBlock({
590
- schema: BlockRejectionSchema2,
591
- block,
592
- errors: rejectionErrors,
593
- rejector: "producer"
594
- });
595
- } else {
596
- const rejectedTransactions = block[1];
597
- await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
598
- }
608
+ if (isSignedHydratedBlockWithHashMeta2(result.block)) {
609
+ await this.mempoolRunner.submitBlocks([result.block]);
610
+ return result.block;
599
611
  }
612
+ if (result.block) await this.rejectExhaustedBlock(result.block, result.errors);
600
613
  } catch (error) {
601
614
  this.logger?.error(`Error proposing next valid block: ${error.message}`);
602
615
  throw error;
@@ -611,9 +624,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
611
624
  if (!transfer) return;
612
625
  const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
613
626
  if (validateBalances) {
614
- const balance = (await this.accountBalanceViewer.accountBalances([
615
- transfer.from
616
- ]))[transfer.from] ?? AttoXL1(0n);
627
+ const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n);
617
628
  if (balance >= totalTransferCost) {
618
629
  fundedTransfers.push(transfer);
619
630
  return tx;
@@ -623,19 +634,16 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
623
634
  return tx;
624
635
  }
625
636
  }))).filter(exists);
626
- return [
627
- fundedTransactions,
628
- fundedTransfers
629
- ];
637
+ return [fundedTransactions, fundedTransfers];
630
638
  }
631
639
  async generateTimePayload() {
632
640
  return await this.timeSyncViewer.currentTimePayload();
633
641
  }
634
642
  /**
635
- * Check if a heartbeat block is required based on network activity.
636
- * @param head The current head block
637
- * @returns True if a heartbeat is required, false otherwise
638
- */
643
+ * Check if a heartbeat block is required based on network activity.
644
+ * @param head The current head block
645
+ * @returns True if a heartbeat is required, false otherwise
646
+ */
639
647
  heartbeatRequired(head) {
640
648
  const epoch = head.$epoch;
641
649
  if (isDefined2(epoch) && Date.now() - epoch > this.heartbeatInterval) {
@@ -643,6 +651,24 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
643
651
  }
644
652
  return false;
645
653
  }
654
+ async rejectExhaustedBlock(block, errors) {
655
+ this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
656
+ if (this._deadLetterQueueRunner) {
657
+ const rejectionErrors = errors.map((e) => ({
658
+ hash: block[0]._hash,
659
+ name: "BlockValidationError",
660
+ message: String(e.message ?? e)
661
+ }));
662
+ await this._deadLetterQueueRunner.rejectBlock({
663
+ schema: BlockRejectionSchema2,
664
+ block,
665
+ errors: rejectionErrors,
666
+ rejector: "producer"
667
+ });
668
+ } else {
669
+ await this.rejectedTransactionsArchivist.insert(block[1]);
670
+ }
671
+ }
646
672
  // Partition pending transactions by chain-ID match; route mismatches to the transaction DLQ.
647
673
  async rejectWrongChainTransactions(transactions, chainId) {
648
674
  const localChain = chainId.toLowerCase();
@@ -661,33 +687,82 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
661
687
  await (dlq ? Promise.all(mismatched.map((tx) => dlq.rejectTransaction({
662
688
  schema: TransactionRejectionSchema,
663
689
  transaction: tx,
664
- errors: [
665
- {
666
- hash: tx[0]._hash,
667
- name: "TransactionChainMismatch",
668
- message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`
669
- }
670
- ],
690
+ errors: [{
691
+ hash: tx[0]._hash,
692
+ name: "TransactionChainMismatch",
693
+ message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`
694
+ }],
671
695
  rejector: "producer"
672
696
  }))) : this.rejectedTransactionsArchivist.insert(mismatched.map((tx) => tx[0])));
673
697
  }
674
698
  return matched;
675
699
  }
700
+ async runBuildValidateRetryLoop(args) {
701
+ const {
702
+ chainId,
703
+ head,
704
+ initialFundedTransactions,
705
+ initialFundedTransfers,
706
+ nonTxPayloads,
707
+ stepRewardPoolBalance,
708
+ timePayload
709
+ } = args;
710
+ const maxAttempts = Math.max(1, initialFundedTransactions.length);
711
+ let candidateTransactions = initialFundedTransactions;
712
+ let candidateTransfers = initialFundedTransfers;
713
+ let lastBlock;
714
+ let lastErrors = [];
715
+ for (let attempt = 0; attempt <= maxAttempts; attempt++) {
716
+ const blockPayloads = [...nonTxPayloads, ...candidateTransfers, timePayload];
717
+ this.logger?.info(`Building block ${head.block + 1}${attempt > 0 ? ` (retry ${attempt})` : ""}`);
718
+ lastBlock = await buildNextBlock2(
719
+ head,
720
+ candidateTransactions,
721
+ blockPayloads,
722
+ [this.account],
723
+ XYO_STEP_REWARD_ADDRESS,
724
+ stepRewardPoolBalance,
725
+ void 0,
726
+ chainId
727
+ );
728
+ const validated = await this.blockValidationViewer.validateBlock(lastBlock, { head: head._hash });
729
+ if (isSignedHydratedBlockWithHashMeta2(validated)) {
730
+ return { block: validated, errors: [] };
731
+ }
732
+ lastErrors = validated;
733
+ if (attempt === maxAttempts) break;
734
+ const { offendingHashes, reason } = await identifyOffendingTransactions({ candidateTransactions, errors: validated });
735
+ if (offendingHashes.length === 0 || reason === "unknown") break;
736
+ for (const offendingHash of offendingHashes) this._excludedTransactionHashes.add(offendingHash);
737
+ const offendingSet = new Set(offendingHashes);
738
+ candidateTransactions = candidateTransactions.filter((tx) => !offendingSet.has(tx[0]._hash));
739
+ const remainingFromAddresses = new Set(candidateTransactions.map((tx) => tx[0].from));
740
+ candidateTransfers = (await generateTransactionFeeTransfers(this.address, candidateTransactions)).filter((t) => remainingFromAddresses.has(t.from));
741
+ this.logger?.warn(`Block validation failed (attempt ${attempt + 1}); excluded ${offendingHashes.length} tx(s), retrying`);
742
+ }
743
+ return { block: lastBlock, errors: lastErrors };
744
+ }
676
745
  };
677
- SimpleBlockRunner = _ts_decorate4([
746
+ __publicField(SimpleBlockRunner, "defaultMoniker", BlockRunnerMoniker);
747
+ __publicField(SimpleBlockRunner, "dependencies", [
748
+ AccountBalanceViewerMoniker,
749
+ BlockRewardViewerMoniker2,
750
+ BlockValidationViewerMoniker,
751
+ FinalizationViewerMoniker,
752
+ MempoolRunnerMoniker,
753
+ MempoolViewerMoniker,
754
+ TimeSyncViewerMoniker
755
+ ]);
756
+ __publicField(SimpleBlockRunner, "monikers", [BlockRunnerMoniker]);
757
+ SimpleBlockRunner = __decorateClass([
678
758
  creatableProvider3()
679
759
  ], SimpleBlockRunner);
680
760
 
681
761
  // src/StepStake/BaseStepStakeService.ts
682
762
  import { AbstractCreatableProvider as AbstractCreatableProvider5, StepStakeViewerMoniker } from "@xyo-network/xl1-sdk";
683
763
  var AbstractStepStakeService = class _AbstractStepStakeService extends AbstractCreatableProvider5 {
684
- static {
685
- __name(this, "AbstractStepStakeService");
686
- }
687
764
  static defaultMoniker = StepStakeViewerMoniker;
688
- static monikers = [
689
- StepStakeViewerMoniker
690
- ];
765
+ static monikers = [StepStakeViewerMoniker];
691
766
  moniker = _AbstractStepStakeService.defaultMoniker;
692
767
  stepStake(_step) {
693
768
  throw new Error("Method [stepStake] not implemented.");
@@ -709,4 +784,4 @@ export {
709
784
  createBootstrapHead,
710
785
  processPendingBlocks
711
786
  };
712
- //# sourceMappingURL=index.mjs.map
787
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/implementation/processPendingBlocks.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { CreatableParams } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable,\n assertEx, creatable, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport type {\n AttoXL1, BlockRewardViewer,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n asAttoXL1,\n BlockRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex })\n }\n }\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n type BlockBoundWitness,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, this.context)\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: AccountInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import type { Address, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { ChainHeadSelector } from '@xyo-network/chain-analyze'\nimport type {\n BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer,\n} from '@xyo-network/xl1-sdk'\nimport { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\n// type FinalizedBlockAttributes = { producer: Address }\n\ninterface ProcessPendingBlocksParams {\n allowedProducers?: Address[]\n blockValidationViewer: BlockValidationViewer\n blockViewer: BlockViewer\n context: BaseContext\n deadLetterQueueRunner?: DeadLetterQueueRunner\n finalizationRunner: FinalizationRunner\n logger?: Logger\n mempoolViewer: MempoolViewer\n minCandidates?: number\n}\n\n// eslint-disable-next-line complexity\nexport async function processPendingBlocks({\n blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner,\n}: ProcessPendingBlocksParams) {\n const start = Date.now()\n\n const currentBlock = await blockViewer.currentBlock()\n\n const headSelector = new ChainHeadSelector({\n context, logger, mempoolViewer, blockViewer, windowedFinalizedChain: [currentBlock], allowedProducers, minCandidates,\n })\n\n // Use the head selector to find the best head or fallback to the starting head\n const bestHeadChain = await headSelector.findBestHead()\n\n // If we found a head\n if (isDefined(bestHeadChain) && bestHeadChain.length > 0) {\n const oldHeadBlock = currentBlock[0]\n const newHydratedHeadBlock = assertEx(bestHeadChain.at(-1), () => 'Missing best head block [processPendingBlocks]')\n const newHeadBlock = newHydratedHeadBlock[0]\n // let finalizedBlocksAttributes: FinalizedBlockAttributes[] = []\n\n // Synchronize the best head with the outArchivist all the way\n // back to the last finalized block\n\n logger?.debug('Validating new HeadBlock head from (block) ', oldHeadBlock?.block, 'to', newHeadBlock.block)\n logger?.debug('Validating new HeadBlock head from (hash) ', oldHeadBlock?._hash, 'to', newHeadBlock._hash)\n\n if (newHeadBlock._hash === oldHeadBlock?._hash) {\n logger?.debug('No new blocks found', oldHeadBlock?.block, 'to', newHeadBlock.block)\n return\n }\n\n // Store the items to be committed in the correct order\n const candidateBlocks = bestHeadChain.filter((b) => {\n return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true\n })\n\n // Validate candidate blocks before finalizing\n const validationResults = await Promise.all(candidateBlocks.map(candidateBlock => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })))\n const blocksToFinalize: typeof candidateBlocks = []\n for (const [i, block] of candidateBlocks.entries()) {\n const result = validationResults[i][0]\n if (isSignedHydratedBlockWithHashMeta(result)) {\n blocksToFinalize.push(block)\n } else {\n logger?.error('Block validation failed', block[0].block, block[0]._hash, JSON.stringify(result, null, 2))\n if (deadLetterQueueRunner) {\n const errors = Array.isArray(result)\n ? result.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n : [{ hash: block[0]._hash, name: 'BlockValidationError' }]\n await deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors, rejector: 'validator',\n })\n }\n }\n }\n\n logger?.info('Validated new HeadBlock head from (block) in', `${Date.now() - start}ms`, newHeadBlock.block, 'to', oldHeadBlock?.block)\n logger?.info('Validated new HeadBlock head from (hash) in', `${Date.now() - start}ms`, newHeadBlock._hash, 'to', oldHeadBlock?._hash)\n\n if (blocksToFinalize.length > 0) {\n await finalizationRunner.finalizeBlocks(blocksToFinalize)\n }\n\n // Prevent us from rechecking the same head\n await headSelector.finalizeChainFragment(blocksToFinalize)\n\n // this._startingHead = newHydratedHeadBlock\n\n // Return the finalized payloads\n return blocksToFinalize\n } else {\n // If no head was found, return an empty array\n logger?.info('No head found to validate', currentBlock?.[0]._hash)\n }\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1,\n NetworkStakeStepRewardService,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider,\n creatableProvider, NetworkStakeStepRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import type {\n Address, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, exists, hexToBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { BlockRewardDiviner } from '@xyo-network/chain-modules'\nimport { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport type {\n AccountInstance,\n ArchivistInstance, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer, AllowedBlockPayload, BlockBoundWitness,\n BlockNumberPayload, BlockRewardViewer, BlockRunner, BlockValidationViewer, ChainId, ChainStakeIntent, CreatableProviderParams,\n DeadLetterQueueRunner,\n FinalizationViewer,\n HydratedBlockStateValidationFunction, MempoolRunner, MempoolViewer,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, SignedHydratedTransactionWithHashMeta, TimeSyncViewer, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1,\n BlockNumberSchema, BlockRejectionSchema, BlockRewardViewerMoniker, BlockRunnerMoniker,\n BlockValidationViewerMoniker, creatableProvider, createDeclarationIntent, DeadLetterQueueRunnerMoniker, defaultRewardRatio,\n FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker,\n TransactionRejectionSchema, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 100\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 100\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n disableIntentRedeclaration?: boolean\n heartbeatInterval?: number\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _deadLetterQueueRunner?: DeadLetterQueueRunner\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _finalizationViewer?: FinalizationViewer\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get finalizationViewer() {\n return this._finalizationViewer!\n }\n\n protected get heartbeatInterval() {\n return this.params.heartbeatInterval ?? 3_600_000\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 pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? (await MemoryArchivist.create())\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._finalizationViewer = await this.locateAndCreate<FinalizationViewer>(FinalizationViewerMoniker)\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n this._deadLetterQueueRunner = await this.locator.tryGetInstance<DeadLetterQueueRunner>(DeadLetterQueueRunnerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n if (this.params.disableIntentRedeclaration) return\n const currentBlock = head.block\n // Only redeclare when the previous declaration has expired\n if (isDefined(this._lastRedeclarationBlock)) {\n const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration\n if (currentBlock < lastDeclarationExpiry) return\n }\n this._lastRedeclarationBlock = currentBlock\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n // eslint-disable-next-line max-statements\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const chainId = await this.finalizationViewer.chainId()\n const pendingTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId)\n\n this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n blockPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(\n head,\n fundedNextBlockTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n chainId,\n )\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n const startValidate = Date.now()\n const validatedBlock = await this.blockValidationViewer.validateBlock(block, { head: head._hash })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (isSignedHydratedBlockWithHashMeta(validatedBlock)) {\n await this.mempoolRunner.submitBlocks([validatedBlock])\n return validatedBlock\n } else {\n const errors = validatedBlock\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n if (this._deadLetterQueueRunner) {\n const rejectionErrors = errors.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n await this._deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors: rejectionErrors, rejector: 'producer',\n })\n } else {\n const rejectedTransactions = block[1]\n await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n }\n }\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, this.context)\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch) && Date.now() - epoch > this.heartbeatInterval) {\n return true\n }\n return false\n }\n\n // Partition pending transactions by chain-ID match; route mismatches to the transaction DLQ.\n private async rejectWrongChainTransactions(\n transactions: SignedHydratedTransactionWithHashMeta[],\n chainId: ChainId,\n ): Promise<SignedHydratedTransactionWithHashMeta[]> {\n const localChain = chainId.toLowerCase()\n const matched: SignedHydratedTransactionWithHashMeta[] = []\n const mismatched: SignedHydratedTransactionWithHashMeta[] = []\n for (const tx of transactions) {\n if (tx[0].chain.toLowerCase() === localChain) {\n matched.push(tx)\n } else {\n mismatched.push(tx)\n }\n }\n if (mismatched.length > 0) {\n this.logger?.warn(`Rejecting ${mismatched.length} transaction(s) targeting non-local chain`)\n const dlq = this._deadLetterQueueRunner\n await (dlq\n ? Promise.all(mismatched.map(tx => dlq.rejectTransaction({\n schema: TransactionRejectionSchema,\n transaction: tx,\n errors: [{\n hash: tx[0]._hash,\n name: 'TransactionChainMismatch',\n message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`,\n }],\n rejector: 'producer',\n })))\n : this.rejectedTransactionsArchivist.insert(mismatched.map(tx => tx[0])))\n }\n return matched\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":"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","names":["AbstractCreatable","assertEx","creatable","toEthAddress","IXyoChainRewards__factory","asAttoXL1","BlockRewardViewerMoniker","EvmBlockRewardViewer","AbstractCreatable","defaultMoniker","BlockRewardViewerMoniker","monikers","moniker","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","IXyoChainRewards__factory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","cause","AbstractCreatableProvider","BlockViewerMoniker","XyoValidator","AbstractCreatableProvider","moniker","_blockViewer","blockViewer","createHandler","locator","getInstance","BlockViewerMoniker","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","AbstractCreatableProvider","creatableProvider","BaseElectionService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","context","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","buildNextBlock","createGenesisBlock","createDeclarationIntent","createBootstrapHead","account","chainId","genesisBlockRewardAmount","genesisBlockRewardAddress","chain","genesisBlock","createGenesisBlock","push","producerDeclarationPayload","createDeclarationIntent","address","block","producerDeclarationBlock","buildNextBlock","assertEx","isDefined","ChainHeadSelector","BlockRejectionSchema","isSignedHydratedBlockWithHashMeta","processPendingBlocks","blockValidationViewer","blockViewer","context","logger","mempoolViewer","finalizationRunner","allowedProducers","minCandidates","deadLetterQueueRunner","start","Date","now","currentBlock","headSelector","ChainHeadSelector","windowedFinalizedChain","bestHeadChain","findBestHead","isDefined","length","oldHeadBlock","newHydratedHeadBlock","assertEx","at","newHeadBlock","debug","block","_hash","candidateBlocks","filter","b","validationResults","Promise","all","map","candidateBlock","validateBlocks","value","state","blocksToFinalize","i","entries","result","isSignedHydratedBlockWithHashMeta","push","error","JSON","stringify","errors","Array","isArray","e","hash","name","message","String","rejectBlock","schema","BlockRejectionSchema","rejector","info","finalizeBlocks","finalizeChainFragment","AbstractCreatableProvider","creatableProvider","NetworkStakeStepRewardViewerMoniker","BaseNetworkStakeStepRewardService","AbstractCreatableProvider","defaultMoniker","NetworkStakeStepRewardViewerMoniker","dependencies","monikers","moniker","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","assertEx","exists","hexToBigInt","isDefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","MemoryArchivist","PayloadBuilder","AbstractCreatableProvider","AccountBalanceViewerMoniker","asBlockBoundWitness","AttoXL1","BlockNumberSchema","BlockRejectionSchema","BlockRewardViewerMoniker","BlockRunnerMoniker","BlockValidationViewerMoniker","creatableProvider","createDeclarationIntent","DeadLetterQueueRunnerMoniker","defaultRewardRatio","FinalizationViewerMoniker","isSignedHydratedBlockWithHashMeta","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","TransactionRejectionSchema","XYO_STEP_REWARD_ADDRESS","hexFromBigInt","assertEx","PayloadBuilder","HydratedTransactionWrapper","transactionRequiredGas","TransferSchema","XYO_ZERO_ADDRESS","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunner","AbstractCreatableProvider","defaultMoniker","BlockRunnerMoniker","dependencies","AccountBalanceViewerMoniker","BlockRewardViewerMoniker","BlockValidationViewerMoniker","FinalizationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","monikers","moniker","_blockRewardDiviner","_deadLetterQueueRunner","_lastRedeclarationBlock","_rejectedTransactionsArchivist","_account","_accountBalanceViewer","_address","_blockRewardViewer","_blockValidationViewer","_finalizationViewer","_mempoolRunner","_mempoolViewer","_rewardAddress","_timeSyncViewer","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","account","accountBalanceViewer","address","blockRewardViewer","blockValidationViewer","finalizationViewer","heartbeatInterval","params","mempoolRunner","mempoolViewer","rejectedTransactionsArchivist","rewardAddress","timeSyncViewer","createHandler","MemoryArchivist","create","assertEx","locateAndCreate","locator","getInstance","tryGetInstance","DeadLetterQueueRunnerMoniker","next","head","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","config","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","disableIntentRedeclaration","currentBlock","isDefined","lastDeclarationExpiry","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","chainId","pendingTransactions","limit","nextBlockTransactions","rejectWrongChainTransactions","logger","log","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","fundedNextBlockTransactions","fundedTransfers","filterByFunded","info","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","undefined","startValidate","validatedBlock","validateBlock","_hash","isSignedHydratedBlockWithHashMeta","submitBlocks","errors","at","message","rejectionErrors","map","e","hash","name","String","rejectBlock","BlockRejectionSchema","rejector","rejectedTransactions","insert","error","context","txs","transfers","fundedTransactions","Promise","all","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","currentTimePayload","epoch","$epoch","transactions","localChain","toLowerCase","matched","mismatched","chain","dlq","rejectTransaction","TransactionRejectionSchema","transaction","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/BlockReward/EvmBlockRewardViewer.ts", "../../src/ChainValidator/XyoValidator.ts", "../../src/Election/BaseElectionService.ts", "../../src/implementation/head/createBootstrapHead.ts", "../../src/implementation/processPendingBlocks.ts", "../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts", "../../src/simple/block/runner/SimpleBlockRunner.ts", "../../src/simple/block/runner/generateTransactionFeeTransfers.ts", "../../src/simple/block/runner/identifyOffendingTransactions.ts", "../../src/StepStake/BaseStepStakeService.ts"],
4
+ "sourcesContent": ["import type { CreatableParams } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable,\n assertEx, creatable, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport type {\n AttoXL1, BlockRewardViewer,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n asAttoXL1,\n BlockRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`, { cause: ex })\n }\n }\n}\n", "import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n", "import type { Address, Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport type { WithHashMeta } from '@xyo-network/sdk-js'\nimport {\n AbstractCreatableProvider,\n type BlockBoundWitness,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, this.context)\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n", "import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: AccountInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n", "import type { Address, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { ChainHeadSelector } from '@xyo-network/chain-analyze'\nimport type {\n BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer,\n} from '@xyo-network/xl1-sdk'\nimport { BlockRejectionSchema, isSignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\n// type FinalizedBlockAttributes = { producer: Address }\n\ninterface ProcessPendingBlocksParams {\n allowedProducers?: Address[]\n blockValidationViewer: BlockValidationViewer\n blockViewer: BlockViewer\n context: BaseContext\n deadLetterQueueRunner?: DeadLetterQueueRunner\n finalizationRunner: FinalizationRunner\n logger?: Logger\n mempoolViewer: MempoolViewer\n minCandidates?: number\n}\n\n// eslint-disable-next-line complexity\nexport async function processPendingBlocks({\n blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, minCandidates, deadLetterQueueRunner,\n}: ProcessPendingBlocksParams) {\n const start = Date.now()\n\n const currentBlock = await blockViewer.currentBlock()\n\n const headSelector = new ChainHeadSelector({\n context, logger, mempoolViewer, blockViewer, windowedFinalizedChain: [currentBlock], allowedProducers, minCandidates,\n })\n\n // Use the head selector to find the best head or fallback to the starting head\n const bestHeadChain = await headSelector.findBestHead()\n\n // If we found a head\n if (isDefined(bestHeadChain) && bestHeadChain.length > 0) {\n const oldHeadBlock = currentBlock[0]\n const newHydratedHeadBlock = assertEx(bestHeadChain.at(-1), () => 'Missing best head block [processPendingBlocks]')\n const newHeadBlock = newHydratedHeadBlock[0]\n // let finalizedBlocksAttributes: FinalizedBlockAttributes[] = []\n\n // Synchronize the best head with the outArchivist all the way\n // back to the last finalized block\n\n logger?.debug('Validating new HeadBlock head from (block) ', oldHeadBlock?.block, 'to', newHeadBlock.block)\n logger?.debug('Validating new HeadBlock head from (hash) ', oldHeadBlock?._hash, 'to', newHeadBlock._hash)\n\n if (newHeadBlock._hash === oldHeadBlock?._hash) {\n logger?.debug('No new blocks found', oldHeadBlock?.block, 'to', newHeadBlock.block)\n return\n }\n\n // Store the items to be committed in the correct order\n const candidateBlocks = bestHeadChain.filter((b) => {\n return isDefined(oldHeadBlock) ? b[0].block > oldHeadBlock.block : true\n })\n\n // Validate candidate blocks before finalizing\n const validationResults = await Promise.all(candidateBlocks.map(candidateBlock => blockValidationViewer.validateBlocks([candidateBlock], { value: true, state: true })))\n const blocksToFinalize: typeof candidateBlocks = []\n for (const [i, block] of candidateBlocks.entries()) {\n const result = validationResults[i][0]\n if (isSignedHydratedBlockWithHashMeta(result)) {\n blocksToFinalize.push(block)\n } else {\n logger?.error('Block validation failed', block[0].block, block[0]._hash, JSON.stringify(result, null, 2))\n if (deadLetterQueueRunner) {\n const errors = Array.isArray(result)\n ? result.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n : [{ hash: block[0]._hash, name: 'BlockValidationError' }]\n await deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors, rejector: 'validator',\n })\n }\n }\n }\n\n logger?.info('Validated new HeadBlock head from (block) in', `${Date.now() - start}ms`, newHeadBlock.block, 'to', oldHeadBlock?.block)\n logger?.info('Validated new HeadBlock head from (hash) in', `${Date.now() - start}ms`, newHeadBlock._hash, 'to', oldHeadBlock?._hash)\n\n if (blocksToFinalize.length > 0) {\n await finalizationRunner.finalizeBlocks(blocksToFinalize)\n }\n\n // Prevent us from rechecking the same head\n await headSelector.finalizeChainFragment(blocksToFinalize)\n\n // this._startingHead = newHydratedHeadBlock\n\n // Return the finalized payloads\n return blocksToFinalize\n } else {\n // If no head was found, return an empty array\n logger?.info('No head found to validate', currentBlock?.[0]._hash)\n }\n}\n", "import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1,\n NetworkStakeStepRewardService,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider,\n creatableProvider, NetworkStakeStepRewardViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n", "import type {\n Address, Hash, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, exists, hexToBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { BlockRewardDiviner } from '@xyo-network/chain-modules'\nimport { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport type {\n AccountInstance,\n ArchivistInstance, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AccountBalanceViewer, AllowedBlockPayload, BlockBoundWitness,\n BlockNumberPayload, BlockRewardViewer, BlockRunner, BlockValidationViewer, ChainId, ChainStakeIntent, CreatableProviderParams,\n DeadLetterQueueRunner,\n FinalizationViewer,\n HydratedBlockStateValidationFunction, HydratedBlockValidationError, MempoolRunner, MempoolViewer,\n SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta,\n TimePayload, TimeSyncViewer, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AbstractCreatableProvider, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1,\n BlockNumberSchema, BlockRejectionSchema, BlockRewardViewerMoniker, BlockRunnerMoniker,\n BlockValidationViewerMoniker, creatableProvider, createDeclarationIntent, DeadLetterQueueRunnerMoniker, defaultRewardRatio,\n FinalizationViewerMoniker, isSignedHydratedBlockWithHashMeta, MempoolRunnerMoniker, MempoolViewerMoniker, TimeSyncViewerMoniker,\n TransactionRejectionSchema, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\nimport { identifyOffendingTransactions } from './identifyOffendingTransactions.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 100\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 100\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n disableIntentRedeclaration?: boolean\n heartbeatInterval?: number\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n FinalizationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _deadLetterQueueRunner?: DeadLetterQueueRunner\n // TODO(producer-exclusion-set): uncapped for v1. If memory grows in long-running producers,\n // add FIFO eviction or a TTL keyed off block number.\n protected _excludedTransactionHashes = new Set<Hash>()\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _finalizationViewer?: FinalizationViewer\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get finalizationViewer() {\n return this._finalizationViewer!\n }\n\n protected get heartbeatInterval() {\n return this.params.heartbeatInterval ?? 3_600_000\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 pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? (await MemoryArchivist.create())\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._finalizationViewer = await this.locateAndCreate<FinalizationViewer>(FinalizationViewerMoniker)\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n this._deadLetterQueueRunner = await this.locator.tryGetInstance<DeadLetterQueueRunner>(DeadLetterQueueRunnerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n if (this.params.disableIntentRedeclaration) return\n const currentBlock = head.block\n // Only redeclare when the previous declaration has expired\n if (isDefined(this._lastRedeclarationBlock)) {\n const lastDeclarationExpiry = this._lastRedeclarationBlock + SimpleBlockRunner.RedeclarationDuration\n if (currentBlock < lastDeclarationExpiry) return\n }\n this._lastRedeclarationBlock = currentBlock\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const chainId = await this.finalizationViewer.chainId()\n const pendingTransactionsRaw = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const pendingTransactions = pendingTransactionsRaw.filter(tx => !this._excludedTransactionHashes.has(tx[0]._hash))\n const nextBlockTransactions = await this.rejectWrongChainTransactions(pendingTransactions, chainId)\n\n this.logger?.log(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const nonTxPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) nonTxPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n nonTxPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [initialFundedTransactions, initialFundedTransfers]\n = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n\n const result = await this.runBuildValidateRetryLoop({\n head,\n chainId,\n stepRewardPoolBalance,\n nonTxPayloads,\n timePayload,\n initialFundedTransactions,\n initialFundedTransfers,\n })\n if (isSignedHydratedBlockWithHashMeta(result.block)) {\n await this.mempoolRunner.submitBlocks([result.block])\n return result.block\n }\n if (result.block) await this.rejectExhaustedBlock(result.block, result.errors)\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, this.context)\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransactionWithHashMeta[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransactionWithHashMeta[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch) && Date.now() - epoch > this.heartbeatInterval) {\n return true\n }\n return false\n }\n\n private async rejectExhaustedBlock(\n block: SignedHydratedBlockWithHashMeta,\n errors: HydratedBlockValidationError[],\n ): Promise<void> {\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n if (this._deadLetterQueueRunner) {\n const rejectionErrors = errors.map(e => ({\n hash: block[0]._hash, name: 'BlockValidationError', message: String(e.message ?? e),\n }))\n await this._deadLetterQueueRunner.rejectBlock({\n schema: BlockRejectionSchema, block, errors: rejectionErrors, rejector: 'producer',\n })\n } else {\n await this.rejectedTransactionsArchivist.insert(block[1])\n }\n }\n\n // Partition pending transactions by chain-ID match; route mismatches to the transaction DLQ.\n private async rejectWrongChainTransactions(\n transactions: SignedHydratedTransactionWithHashMeta[],\n chainId: ChainId,\n ): Promise<SignedHydratedTransactionWithHashMeta[]> {\n const localChain = chainId.toLowerCase()\n const matched: SignedHydratedTransactionWithHashMeta[] = []\n const mismatched: SignedHydratedTransactionWithHashMeta[] = []\n for (const tx of transactions) {\n if (tx[0].chain.toLowerCase() === localChain) {\n matched.push(tx)\n } else {\n mismatched.push(tx)\n }\n }\n if (mismatched.length > 0) {\n this.logger?.warn(`Rejecting ${mismatched.length} transaction(s) targeting non-local chain`)\n const dlq = this._deadLetterQueueRunner\n await (dlq\n ? Promise.all(mismatched.map(tx => dlq.rejectTransaction({\n schema: TransactionRejectionSchema,\n transaction: tx,\n errors: [{\n hash: tx[0]._hash,\n name: 'TransactionChainMismatch',\n message: `Transaction chain ${tx[0].chain} does not match local chain ${localChain}`,\n }],\n rejector: 'producer',\n })))\n : this.rejectedTransactionsArchivist.insert(mismatched.map(tx => tx[0])))\n }\n return matched\n }\n\n private async runBuildValidateRetryLoop(args: {\n chainId: ChainId\n head: WithHashMeta<BlockBoundWitness>\n initialFundedTransactions: SignedHydratedTransactionWithHashMeta[]\n initialFundedTransfers: Transfer[]\n nonTxPayloads: AllowedBlockPayload[]\n stepRewardPoolBalance: AttoXL1\n timePayload: TimePayload\n }): Promise<{\n block: SignedHydratedBlockWithHashMeta | undefined\n errors: HydratedBlockValidationError[]\n }> {\n const {\n chainId, head, initialFundedTransactions, initialFundedTransfers,\n nonTxPayloads, stepRewardPoolBalance, timePayload,\n } = args\n const maxAttempts = Math.max(1, initialFundedTransactions.length)\n let candidateTransactions = initialFundedTransactions\n let candidateTransfers = initialFundedTransfers\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined\n let lastErrors: HydratedBlockValidationError[] = []\n\n for (let attempt = 0; attempt <= maxAttempts; attempt++) {\n const blockPayloads = [...nonTxPayloads, ...candidateTransfers, timePayload]\n this.logger?.info(`Building block ${head.block + 1}${attempt > 0 ? ` (retry ${attempt})` : ''}`)\n lastBlock = await buildNextBlock(\n head,\n candidateTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n chainId,\n )\n const validated = await this.blockValidationViewer.validateBlock(lastBlock, { head: head._hash })\n if (isSignedHydratedBlockWithHashMeta(validated)) {\n return { block: validated, errors: [] }\n }\n lastErrors = validated\n if (attempt === maxAttempts) break\n const { offendingHashes, reason } = await identifyOffendingTransactions({ candidateTransactions, errors: validated })\n if (offendingHashes.length === 0 || reason === 'unknown') break\n for (const offendingHash of offendingHashes) this._excludedTransactionHashes.add(offendingHash)\n const offendingSet = new Set<Hash>(offendingHashes)\n candidateTransactions = candidateTransactions.filter(tx => !offendingSet.has(tx[0]._hash))\n const remainingFromAddresses = new Set<Address>(candidateTransactions.map(tx => tx[0].from))\n candidateTransfers = (await generateTransactionFeeTransfers(this.address, candidateTransactions))\n .filter(t => remainingFromAddresses.has(t.from))\n this.logger?.warn(`Block validation failed (attempt ${attempt + 1}); excluded ${offendingHashes.length} tx(s), retrying`)\n }\n return { block: lastBlock, errors: lastErrors }\n }\n}\n", "import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { HydratedBlockValidationError, SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n netBalancesForPayloads,\n transactionRequiredGas,\n} from '@xyo-network/xl1-sdk'\n\nexport type OffendingTxReason = 'block-balance' | 'tx-invalid' | 'unknown'\n\nexport interface OffendingTxResult {\n offendingHashes: Hash[]\n reason: OffendingTxReason\n}\n\ninterface TxScore {\n cost: bigint\n gasPrice: bigint\n}\n\nasync function scoreTransaction(tx: SignedHydratedTransactionWithHashMeta): Promise<TxScore> {\n const wrapper = await HydratedTransactionWrapper.parse(tx)\n const from = wrapper.boundWitness.from\n const gasPrice = wrapper.fees.gasPrice\n const gasCost = transactionRequiredGas(tx) * gasPrice\n const baseCost = wrapper.fees.base\n const netBalances = netBalancesForPayloads({ singletons: {} }, tx[1])\n const fromNet = netBalances[from] ?? 0n\n const transferOut = fromNet < 0n ? -fromNet : 0n\n return { cost: gasCost + baseCost + transferOut, gasPrice }\n}\n\nexport async function identifyOffendingTransactions(args: {\n candidateTransactions: SignedHydratedTransactionWithHashMeta[]\n errors: HydratedBlockValidationError[]\n}): Promise<OffendingTxResult> {\n const { errors, candidateTransactions } = args\n const candidateHashes = new Set<Hash>(candidateTransactions.map(tx => tx[0]._hash))\n\n const txInvalidHashes = new Set<Hash>()\n for (const error of errors) {\n if (candidateHashes.has(error.hash)) txInvalidHashes.add(error.hash)\n const cause = error.cause as { hash?: Hash } | undefined\n if (cause?.hash && candidateHashes.has(cause.hash)) txInvalidHashes.add(cause.hash)\n }\n if (txInvalidHashes.size > 0) {\n return { offendingHashes: [...txInvalidHashes], reason: 'tx-invalid' }\n }\n\n const balanceOffenderHashes = new Set<Hash>()\n for (const error of errors) {\n const offendingHashes = (error as { offendingTransactionHashes?: Hash[] }).offendingTransactionHashes ?? []\n for (const hash of offendingHashes) {\n if (candidateHashes.has(hash)) balanceOffenderHashes.add(hash)\n }\n }\n if (balanceOffenderHashes.size === 0) {\n return { offendingHashes: [], reason: 'unknown' }\n }\n\n const offenders = candidateTransactions.filter(tx => balanceOffenderHashes.has(tx[0]._hash))\n const scored = await Promise.all(offenders.map(async tx => ({ tx, ...(await scoreTransaction(tx)) })))\n scored.sort((a, b) => {\n if (a.cost !== b.cost) return a.cost < b.cost ? 1 : -1\n if (a.gasPrice !== b.gasPrice) return a.gasPrice < b.gasPrice ? -1 : 1\n return a.tx[0]._hash < b.tx[0]._hash ? -1 : 1\n })\n return { offendingHashes: [scored[0].tx[0]._hash], reason: 'block-balance' }\n}\n", "import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["assertEx", "AbstractCreatableProvider", "AbstractCreatableProvider", "assertEx", "assertEx", "AbstractCreatableProvider", "creatableProvider", "AbstractCreatableProvider", "creatableProvider", "assertEx", "isDefined", "buildNextBlock", "PayloadBuilder", "AbstractCreatableProvider", "BlockRejectionSchema", "BlockRewardViewerMoniker", "creatableProvider", "createDeclarationIntent", "isSignedHydratedBlockWithHashMeta", "assertEx", "HydratedTransactionWrapper", "transactionRequiredGas", "AbstractCreatableProvider", "assertEx", "BlockRewardViewerMoniker", "PayloadBuilder", "isDefined", "createDeclarationIntent", "isSignedHydratedBlockWithHashMeta", "transfer", "BlockRejectionSchema", "buildNextBlock", "creatableProvider", "AbstractCreatableProvider"]
7
+ }
@@ -31,6 +31,7 @@ export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleB
31
31
  moniker: "BlockRunner";
32
32
  protected _blockRewardDiviner?: BlockRewardDiviner;
33
33
  protected _deadLetterQueueRunner?: DeadLetterQueueRunner;
34
+ protected _excludedTransactionHashes: Set<import("@xylabs/sdk-js").BrandedHash>;
34
35
  protected _lastRedeclarationBlock?: number;
35
36
  protected _rejectedTransactionsArchivist?: ArchivistInstance;
36
37
  private _account?;
@@ -125,6 +126,8 @@ export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleB
125
126
  * @returns True if a heartbeat is required, false otherwise
126
127
  */
127
128
  private heartbeatRequired;
129
+ private rejectExhaustedBlock;
128
130
  private rejectWrongChainTransactions;
131
+ private runBuildValidateRetryLoop;
129
132
  }
130
133
  //# sourceMappingURL=SimpleBlockRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../src/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../src/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Hash } from '@xylabs/sdk-js';
2
+ import type { HydratedBlockValidationError, SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk';
3
+ export type OffendingTxReason = 'block-balance' | 'tx-invalid' | 'unknown';
4
+ export interface OffendingTxResult {
5
+ offendingHashes: Hash[];
6
+ reason: OffendingTxReason;
7
+ }
8
+ export declare function identifyOffendingTransactions(args: {
9
+ candidateTransactions: SignedHydratedTransactionWithHashMeta[];
10
+ errors: HydratedBlockValidationError[];
11
+ }): Promise<OffendingTxResult>;
12
+ //# sourceMappingURL=identifyOffendingTransactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifyOffendingTransactions.d.ts","sourceRoot":"","sources":["../../../../../src/simple/block/runner/identifyOffendingTransactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,4BAA4B,EAAE,qCAAqC,EAAE,MAAM,sBAAsB,CAAA;AAO/G,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,YAAY,GAAG,SAAS,CAAA;AAE1E,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,IAAI,EAAE,CAAA;IACvB,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAmBD,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,qBAAqB,EAAE,qCAAqC,EAAE,CAAA;IAC9D,MAAM,EAAE,4BAA4B,EAAE,CAAA;CACvC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-services",
3
- "version": "1.22.0",
3
+ "version": "1.23.2",
4
4
  "description": "XYO Layer One SDK Services",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -34,27 +34,26 @@
34
34
  "README.md"
35
35
  ],
36
36
  "dependencies": {
37
- "@xyo-network/chain-analyze": "~1.22.0",
38
- "@xyo-network/chain-utils": "~1.22.0",
39
- "@xyo-network/chain-modules": "~1.22.0",
40
- "@xyo-network/chain-protocol": "~1.22.0"
37
+ "@xyo-network/chain-analyze": "~1.23.2",
38
+ "@xyo-network/chain-modules": "~1.23.2",
39
+ "@xyo-network/chain-protocol": "~1.23.2",
40
+ "@xyo-network/chain-utils": "~1.23.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@bitauth/libauth": "~3.0.0",
44
- "@metamask/json-rpc-engine": "^10.4.0",
44
+ "@metamask/json-rpc-engine": "^10.5.0",
45
45
  "@metamask/providers": "^22.1.1",
46
46
  "@metamask/utils": "~11.11.0",
47
47
  "@opentelemetry/api": "^1.9.1",
48
48
  "@opentelemetry/sdk-trace-base": "^2.7.1",
49
49
  "@scure/base": "~2.2.0",
50
50
  "@scure/bip39": "~2.2.0",
51
- "@types/node": ">=18",
52
51
  "@xylabs/fetch": "~5.1.2",
53
52
  "@xylabs/geo": "^5.1.2",
54
53
  "@xylabs/sdk-js": "^5.1.2",
55
54
  "@xylabs/threads": "~5.1.2",
56
- "@xylabs/toolchain": "~7.13.22",
57
- "@xylabs/tsconfig": "~7.13.22",
55
+ "@xylabs/toolchain": "~8.0.4",
56
+ "@xylabs/tsconfig": "~8.0.4",
58
57
  "@xylabs/vitest-extended": "~5.1.2",
59
58
  "@xyo-network/account": "~5.6.2",
60
59
  "@xyo-network/account-model": "~5.6.3",
@@ -76,11 +75,9 @@
76
75
  "@xyo-network/typechain": "^4.1.3",
77
76
  "@xyo-network/wallet": "~5.6.2",
78
77
  "@xyo-network/wallet-model": "^5.6.3",
79
- "@xyo-network/xl1-sdk": "^1.28.5",
80
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0",
78
+ "@xyo-network/xl1-sdk": "^1.30.2",
81
79
  "ajv": "^8.20.0",
82
80
  "async-mutex": "^0.5.0",
83
- "axios": "^1",
84
81
  "bn.js": "^5.2.3",
85
82
  "buffer": "^6.0.3",
86
83
  "chalk": "^5.6.2",
@@ -88,25 +85,23 @@
88
85
  "debug": "~4.4.3",
89
86
  "eslint": "^10.3.0",
90
87
  "ethers": "^6.16.0",
91
- "firebase": "^12",
92
88
  "hash-wasm": "~4.12.0",
93
89
  "idb": "^8.0.3",
94
90
  "lru-cache": "^11.3.6",
95
91
  "mapbox-gl": "^3.23.1",
96
92
  "observable-fns": "~0.6.1",
97
93
  "pako": "^2.1.0",
98
- "rollup": "^3.29.4 || ^4",
99
94
  "shallowequal": "~1.1.0",
100
95
  "store2": "~2.14.4",
101
96
  "tslib": "^2.8.1",
102
- "typescript": "~5.9.3",
97
+ "typescript": "~6.0.3",
103
98
  "uuid": "~14.0.0",
104
- "vite": "^8.0.11",
105
- "vitest": "^4.1.5",
99
+ "vite": "^8.0.13",
100
+ "vitest": "^4.1.6",
106
101
  "wasm-feature-detect": "~1.8.0",
107
102
  "webextension-polyfill": "^0.12.0",
108
103
  "zod": "~4.4.3",
109
- "@xyo-network/chain-validation": "~1.22.0"
104
+ "@xyo-network/chain-validation": "~1.23.2"
110
105
  },
111
106
  "peerDependencies": {
112
107
  "@bitauth/libauth": "~3.0",
@@ -144,14 +139,12 @@
144
139
  "@xyo-network/xl1-sdk": "^1.28",
145
140
  "ajv": "^8.20",
146
141
  "async-mutex": "^0.5",
147
- "axios": "^1",
148
142
  "bn.js": "^5.2",
149
143
  "buffer": "^6.0",
150
144
  "chalk": "^5.6",
151
145
  "cosmiconfig": "^9.0",
152
146
  "debug": "~4.4",
153
147
  "ethers": "^6.16",
154
- "firebase": "^12",
155
148
  "hash-wasm": "~4.12",
156
149
  "idb": "^8.0",
157
150
  "lru-cache": "^11.3",