@xyo-network/chain-services 1.15.22 → 1.15.23

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 +1 @@
1
- {"version":3,"file":"BaseBlockProducerService.d.ts","sourceRoot":"","sources":["../../../src/BlockProducer/BaseBlockProducerService.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EACR,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EACL,kBAAkB,EACnB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EACL,uBAAuB,EACO,iBAAiB,EAAyC,oBAAoB,EAC5G,gBAAgB,EAAsB,aAAa,EAAE,0BAA0B,EAA6B,kBAAkB,EAC9H,uBAAuB,EAAE,QAAQ,EAElC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D;;GAEG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAEpD,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,cAAc,EAAE,uBAAuB,CAAA;IACvC,0BAA0B,EAAE,0BAA0B,CAAA;IACtD,6BAA6B,EAAE,iBAAiB,CAAA;IAChD,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,EAAE,uBAAuB,CAAA;CAC9B;AAED,qBACa,wBAAyB,SAAQ,WAAW,CAAC,8BAA8B,CAAE,YAAW,oBAAoB;IACvH,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAE7D;;OAEG;IACH,MAAM,KAAK,gBAAgB,IAAI,MAAM,CAEpC;IAED;;;OAGG;IACH,MAAM,KAAK,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;OAGG;IACH,MAAM,KAAK,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAI,OAAO;;;;OAEV;IAED,SAAS,KAAK,OAAO,yDAEpB;IAED,SAAS,KAAK,cAAc,4BAE3B;IAED,SAAS,KAAK,cAAc;;;;uDAE3B;IAED,SAAS,KAAK,OAAO;;;;;;OAEpB;IAED,SAAS,KAAK,eAAe,wDAE5B;IAED,SAAS,KAAK,0BAA0B,+BAEvC;IAED,SAAS,KAAK,6BAA6B,0SAE1C;IAED,SAAS,KAAK,aAAa,IAAI,OAAO,CAErC;IAED,SAAS,KAAK,aAAa,2DAE1B;IAED,SAAS,KAAK,kBAAkB,IAAI,kBAAkB,CAErD;IAED,SAAS,KAAK,IAAI,IAAI,uBAAuB,CAE5C;IAED,SAAS,KAAK,0BAA0B,+EAEvC;IAEK,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;cAWxE,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmB3E;;;;OAIG;cACa,wBAAwB,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;cAiBzG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YAqD/H,cAAc;YAyBd,mBAAmB;IAgBjC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAU1B"}
1
+ {"version":3,"file":"BaseBlockProducerService.d.ts","sourceRoot":"","sources":["../../../src/BlockProducer/BaseBlockProducerService.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,OAAO,EACR,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EACL,kBAAkB,EACnB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EACL,uBAAuB,EACO,iBAAiB,EAAyC,oBAAoB,EAC5G,gBAAgB,EAAsB,aAAa,EAAE,0BAA0B,EAA6B,kBAAkB,EAC9H,uBAAuB,EAAE,QAAQ,EAElC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D;;GAEG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAEpD,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,cAAc,EAAE,uBAAuB,CAAA;IACvC,0BAA0B,EAAE,0BAA0B,CAAA;IACtD,6BAA6B,EAAE,iBAAiB,CAAA;IAChD,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,EAAE,uBAAuB,CAAA;CAC9B;AAED,qBACa,wBAAyB,SAAQ,WAAW,CAAC,8BAA8B,CAAE,YAAW,oBAAoB;IACvH,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAE7D;;OAEG;IACH,MAAM,KAAK,gBAAgB,IAAI,MAAM,CAEpC;IAED;;;OAGG;IACH,MAAM,KAAK,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;OAGG;IACH,MAAM,KAAK,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAI,OAAO;;;;OAEV;IAED,SAAS,KAAK,OAAO,yDAEpB;IAED,SAAS,KAAK,cAAc,4BAE3B;IAED,SAAS,KAAK,cAAc;;;;uDAE3B;IAED,SAAS,KAAK,OAAO;;;;;;OAEpB;IAED,SAAS,KAAK,eAAe,wDAE5B;IAED,SAAS,KAAK,0BAA0B,+BAEvC;IAED,SAAS,KAAK,6BAA6B,0SAE1C;IAED,SAAS,KAAK,aAAa,IAAI,OAAO,CAErC;IAED,SAAS,KAAK,aAAa,2DAE1B;IAED,SAAS,KAAK,kBAAkB,IAAI,kBAAkB,CAErD;IAED,SAAS,KAAK,IAAI,IAAI,uBAAuB,CAE5C;IAED,SAAS,KAAK,0BAA0B,+EAEvC;IAEK,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;cAgBxE,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmB3E;;;;OAIG;cACa,wBAAwB,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;cAiBzG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YA+D/H,cAAc;YAyBd,mBAAmB;IAgBjC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAU1B"}
@@ -1,4 +1,5 @@
1
1
  import { Address, Hash } from '@xylabs/hex';
2
+ import { WithHashStorageMeta } from '@xyo-network/payload-model';
2
3
  import type { ChainBlockNumberIteratorService, ChainStakeViewer, StakeIntentService } from '@xyo-network/xl1-protocol';
3
4
  import { BlockBoundWitness, ElectionService } from '@xyo-network/xl1-protocol';
4
5
  import { BaseService } from '../BaseService.ts';
@@ -12,7 +13,7 @@ export declare class BaseElectionService extends BaseService<BaseElectionService
12
13
  get chainIterator(): ChainBlockNumberIteratorService;
13
14
  get chainStakeViewer(): ChainStakeViewer;
14
15
  get stakeIntentService(): StakeIntentService;
15
- getCreatorCommitteeForNextBlock(current: BlockBoundWitness): Promise<Address[]>;
16
+ getCreatorCommitteeForNextBlock(current: WithHashStorageMeta<BlockBoundWitness>): Promise<Address[]>;
16
17
  protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize?: number): Address[];
17
18
  }
18
19
  //# sourceMappingURL=BaseElectionService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseElectionService.d.ts","sourceRoot":"","sources":["../../../src/Election/BaseElectionService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,KAAK,EACV,+BAA+B,EAAE,gBAAgB,EAAE,kBAAkB,EACtE,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,aAAa,CAAC,EAAE,+BAA+B,CAAA;IAC/C,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;AAED,qBACa,mBAAoB,SAAQ,WAAW,CAAC,0BAA0B,CAAE,YAAW,eAAe;IACzG,IAAI,aAAa,oCAEhB;IAED,IAAI,gBAAgB,qBAEnB;IAED,IAAI,kBAAkB,uBAErB;IAEK,+BAA+B,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IASrF,SAAS,CAAC,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,SAAI,GAAG,OAAO,EAAE;CAM3G"}
1
+ {"version":3,"file":"BaseElectionService.d.ts","sourceRoot":"","sources":["../../../src/Election/BaseElectionService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EACV,+BAA+B,EAAE,gBAAgB,EAAE,kBAAkB,EACtE,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,aAAa,CAAC,EAAE,+BAA+B,CAAA;IAC/C,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;AAED,qBACa,mBAAoB,SAAQ,WAAW,CAAC,0BAA0B,CAAE,YAAW,eAAe;IACzG,IAAI,aAAa,oCAEhB;IAED,IAAI,gBAAgB,qBAEnB;IAED,IAAI,kBAAkB,uBAErB;IAEK,+BAA+B,CAAC,OAAO,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAS1G,SAAS,CAAC,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,SAAI,GAAG,OAAO,EAAE;CAM3G"}
@@ -325,7 +325,12 @@ var BaseBlockProducerService = class _BaseBlockProducerService extends BaseServi
325
325
  }
326
326
  async next(head) {
327
327
  if (head.chain !== this.chainId) return;
328
+ const leadersStart = Date.now();
328
329
  const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head);
330
+ const leadersDuration = Date.now() - leadersStart;
331
+ if (leadersDuration > 100) {
332
+ this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map((l) => l.slice(0, 6)).join(", ")}`);
333
+ }
329
334
  if (!leaders.includes(this.address)) return;
330
335
  return this.proposeNextValidBlock(head);
331
336
  }
@@ -372,7 +377,12 @@ var BaseBlockProducerService = class _BaseBlockProducerService extends BaseServi
372
377
  return await this.spanAsync("proposeNextValidBlock", async () => {
373
378
  const { block: previousBlock } = assertEx4(asBlockBoundWitness(head), () => "Invalid head block");
374
379
  const nextBlock = previousBlock + 1;
380
+ const nextBlockTransactionsStart = Date.now();
375
381
  const nextBlockTransactions = await this.pendingTransactionsService.getPendingTransactions(head._hash, _BaseBlockProducerService.DefaultBlockSize);
382
+ const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
383
+ if (nextBlockTransactionsDuration > 200) {
384
+ this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
385
+ }
376
386
  const blockPayloads = [];
377
387
  const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
378
388
  if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
@@ -380,7 +390,12 @@ var BaseBlockProducerService = class _BaseBlockProducerService extends BaseServi
380
390
  const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
381
391
  blockPayloads.push(...rewardTransferPayloads);
382
392
  const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
393
+ const timeStart = Date.now();
383
394
  const timePayload = await this.generateTimePayload(head);
395
+ const timeDuration = Date.now() - timeStart;
396
+ if (timeDuration > 100) {
397
+ this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
398
+ }
384
399
  const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
385
400
  blockPayloads.push(...fundedTransfers, timePayload);
386
401
  this.logger?.info(`Building block ${head.block + 1}`);
@@ -875,7 +890,6 @@ XyoValidator = _ts_decorate8([
875
890
  import { assertEx as assertEx10 } from "@xylabs/assert";
876
891
  import { creatable as creatable9 } from "@xylabs/creatable";
877
892
  import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
878
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
879
893
  function _ts_decorate9(decorators, target, key, desc) {
880
894
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
881
895
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -900,7 +914,7 @@ var BaseElectionService = class extends BaseService {
900
914
  return await this.spanAsync("getCreatorCommitteeForNextBlock", async () => {
901
915
  const nextBlock = current.block + 1;
902
916
  const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, "producer");
903
- const previousBlockHash = await PayloadBuilder4.hash(current);
917
+ const previousBlockHash = current._hash;
904
918
  return this.generateCreatorCommittee(candidates, previousBlockHash);
905
919
  });
906
920
  }
@@ -1002,10 +1016,10 @@ import { TransactionJsonSchemaValidator, validateTransaction } from "@xyo-networ
1002
1016
  import { Mutex as Mutex2 } from "async-mutex";
1003
1017
 
1004
1018
  // src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
1005
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1019
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
1006
1020
  import { asTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
1007
1021
  var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
1008
- const withStorageMeta = await PayloadBuilder5.addStorageMeta(payload.payloads);
1022
+ const withStorageMeta = await PayloadBuilder4.addStorageMeta(payload.payloads);
1009
1023
  const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find((p) => p._hash === payload.root));
1010
1024
  if (tx) {
1011
1025
  return [
@@ -1016,7 +1030,7 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
1016
1030
  }, "bundledPayloadToHydratedTransaction");
1017
1031
 
1018
1032
  // src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
1019
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1033
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1020
1034
  import { PayloadBundleSchema } from "@xyo-network/payload-model";
1021
1035
  import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
1022
1036
  var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
@@ -1024,8 +1038,8 @@ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) =>
1024
1038
  return bundle(root, transaction);
1025
1039
  }, "hydratedTransactionToPayloadBundle");
1026
1040
  var bundle = /* @__PURE__ */ __name((root, transaction) => {
1027
- const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder6.omitStorageMeta(p));
1028
- return new PayloadBuilder6({
1041
+ const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder5.omitStorageMeta(p));
1042
+ return new PayloadBuilder5({
1029
1043
  schema: PayloadBundleSchema
1030
1044
  }).fields({
1031
1045
  payloads,
@@ -1311,7 +1325,7 @@ import { asAddress } from "@xylabs/hex";
1311
1325
  import { isUndefined as isUndefined3 } from "@xylabs/typeof";
1312
1326
  import { analyzeChain, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
1313
1327
  import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
1314
- import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
1328
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1315
1329
  import { asBlockBoundWitness as asBlockBoundWitness3, asBlockBoundWitnessWithStorageMeta as asBlockBoundWitnessWithStorageMeta2, asChainIndexingServiceStateWithStorageMeta, asChainStakeIntent as asChainStakeIntent2, ChainIndexingServiceStateSchema, isChainIndexingServiceState } from "@xyo-network/xl1-protocol";
1316
1330
  import { readPayloadMapFromStore as readPayloadMapFromStore3 } from "@xyo-network/xl1-protocol-sdk";
1317
1331
  import { Mutex as Mutex3 } from "async-mutex";
@@ -1362,7 +1376,7 @@ var XyoStakeIntentService = class extends BaseService {
1362
1376
  });
1363
1377
  const head = await this.chainIterator.head();
1364
1378
  if (isUndefined3(head)) return;
1365
- const headHash = await PayloadBuilder7.hash(head);
1379
+ const headHash = await PayloadBuilder6.hash(head);
1366
1380
  await this.recoverState(headHash);
1367
1381
  }
1368
1382
  async getDeclaredCandidateRanges(address, intent) {
@@ -1427,7 +1441,7 @@ var XyoStakeIntentService = class extends BaseService {
1427
1441
  }
1428
1442
  async persistState(current) {
1429
1443
  const state = this._producers.serialize();
1430
- const payload = new PayloadBuilder7({
1444
+ const payload = new PayloadBuilder6({
1431
1445
  schema: ChainIndexingServiceStateSchema
1432
1446
  }).fields({
1433
1447
  endBlockHash: current,
@@ -1479,7 +1493,7 @@ var XyoStakeIntentService = class extends BaseService {
1479
1493
  return await this.spanAsync("updateIndex", async () => {
1480
1494
  const currentHead = await this.chainIterator.head();
1481
1495
  if (isUndefined3(currentHead)) return;
1482
- const currentHeadHash = await PayloadBuilder7.hash(currentHead);
1496
+ const currentHeadHash = await PayloadBuilder6.hash(currentHead);
1483
1497
  const chainMap = readPayloadMapFromStore3(this.chainArchivist);
1484
1498
  const result = await analyzeChain({
1485
1499
  chainMap
@@ -1536,7 +1550,7 @@ BaseStepStakeService = _ts_decorate13([
1536
1550
  import { assertEx as assertEx13 } from "@xylabs/assert";
1537
1551
  import { creatable as creatable14 } from "@xylabs/creatable";
1538
1552
  import { asHash } from "@xylabs/hex";
1539
- import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
1553
+ import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
1540
1554
  import { asTimePayload, TimeSchema as TimeSchema2 } from "@xyo-network/xl1-protocol";
1541
1555
  function _ts_decorate14(decorators, target, key, desc) {
1542
1556
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -1620,7 +1634,7 @@ var BaseTimeSyncService = class extends BaseService {
1620
1634
  const head = await this.chainIterator.head();
1621
1635
  return [
1622
1636
  head.block,
1623
- await PayloadBuilder8.hash(head)
1637
+ await PayloadBuilder7.hash(head)
1624
1638
  ];
1625
1639
  }
1626
1640
  case "epoch": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/AccountBalance/BaseAccountBalanceService.ts","../../src/BaseService.ts","../../src/AccountTransfers/accountTransfersServiceFromArchivist.ts","../../src/AccountTransfers/BaseAccountTransfersService.ts","../../src/BlockProducer/BaseBlockProducerService.ts","../../src/BlockProducer/generateTransactionFeeTransfers.ts","../../src/BlockReward/BaseBlockRewardService.ts","../../src/BlockReward/EvmBlockRewardService.ts","../../src/BlockReward/MemoryBlockRewardService.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainService/Evm/Evm.ts","../../src/ChainService/Memory/Memory.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts","../../src/Time/BaseTimeSyncService.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock, LruCacheMap } from '@xyo-network/chain-protocol'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { AccountBalanceServiceV2, ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { BaseAccountBalanceService } from './BaseAccountBalanceService.ts'\n\nexport const accountBalancesServiceFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceServiceV2> => {\n const summaryMap = new LruCacheMap<string, BalancesStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async () => {\n const head = await findMostRecentBlock(archivist)\n return assertEx(head?._hash, () => 'No head found in chainArchivist')\n }\n const service = await BaseAccountBalanceService.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n })\n return service\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { spanRootAsync } from '@xylabs/telemetry'\nimport {\n AccountBalanceServiceV2,\n AttoXL1,\n} from '@xyo-network/xl1-protocol'\nimport {\n balancesSummary,\n BalanceStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseAccountBalanceServiceParams extends BaseServiceParams {\n context: BalanceStepSummaryContext\n}\n\n@creatable()\nexport class BaseAccountBalanceService extends BaseService<BaseAccountBalanceServiceParams> implements AccountBalanceServiceV2 {\n async balances(head: Hash, address: Address[]): Promise<Partial<Record<Address, AttoXL1>>> {\n return await spanRootAsync('balances', async () => {\n const summary = await balancesSummary(\n this.params.context,\n )\n const result: Record<Address, AttoXL1> = {}\n for (const addr of address) {\n const summaryBalance = summary[addr] ?? 0n\n result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance)\n }\n return result\n })\n }\n}\n","import { AbstractCreatable, creatable } from '@xylabs/creatable'\nimport type { EventData } from '@xylabs/events'\nimport { Hash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { spanRoot, spanRootAsync } from '@xylabs/telemetry'\nimport type { ServiceInterface } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n@creatable()\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>\n extends AbstractCreatable<TParams, TEventData> implements ServiceInterface {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: Partial<TParams>) {\n if (this.singletons[this.name]) throw new Error(`Singleton already initialized for ${this.name}`)\n return this.singletonInitMutex.runExclusive(async () => {\n return await this.create(params) as TService\n })\n }\n\n paramsHandler(params?: Partial<TParams>): TParams {\n return params as TParams\n }\n\n span<T>(name: string, fn: () => T): T {\n return spanRoot(name, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanRootAsync(name, fn, this.tracer)\n }\n\n sync(_head: Hash): Promise<void> {\n throw new Error('Method not implemented.')\n }\n}\n\nexport abstract class BaseAccountableService<\n TParams extends BaseAccountableServiceParams = BaseAccountableServiceParams,\n> extends BaseService<TParams> {\n // Base class for services that have an account\n}\n\nexport interface CreatableService<T extends BaseService = BaseService> extends ServiceInterface {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>\n}\n\nexport function creatableService<T extends BaseService = BaseService>() {\n return <U extends CreatableService<T>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock, LruCacheMap } from '@xyo-network/chain-protocol'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { AccountTransfersService, ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type { TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { BaseAccountTransfersService } from './BaseAccountTransfersService.ts'\n\nexport const accountTransfersServiceFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountTransfersService> => {\n const summaryMap = new LruCacheMap<string, TransfersStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async () => {\n const head = await findMostRecentBlock(archivist)\n return assertEx(head?._hash, () => 'No head found in chainArchivist')\n }\n const service = await BaseAccountTransfersService.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n })\n return service\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { spanRootAsync } from '@xylabs/telemetry'\nimport {\n AccountTransfersService,\n AttoXL1,\n} from '@xyo-network/xl1-protocol'\nimport {\n TransfersStepSummaryContext,\n transfersSummary,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseAccountTransferServiceParams extends BaseServiceParams {\n context: TransfersStepSummaryContext\n}\n\n@creatable()\nexport class BaseAccountTransfersService extends BaseService<BaseAccountTransferServiceParams> implements AccountTransfersService {\n async transfer(head: Hash, address: Address): Promise<AttoXL1> {\n return (await this.transfers(head, [address]))[address] ?? AttoXL1(0n)\n }\n\n async transfers(head: Hash, addresses: Address[]): Promise<Partial<Record<Address, AttoXL1>>> {\n return await spanRootAsync('transfers', async () => {\n const summary = await transfersSummary(this.params.context)\n const result: Record<Address, AttoXL1> = {}\n for (const addr of addresses) {\n const summaryBalance = summary[addr] ?? 0n\n result[addr] = AttoXL1(summaryBalance)\n }\n return result\n })\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { exists } from '@xylabs/exists'\nimport {\n Address, Hex, hexToBigInt, toHex,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock, createDeclarationIntent } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n AccountBalanceServiceV2, AllowedBlockPayload,\n asBlockBoundWitness, AttoXL1, BlockBoundWitness, BlockNumberPayload, BlockNumberSchema, BlockProducerService,\n ChainStakeIntent, defaultRewardRatio, HydratedBlock, PendingTransactionsService, SignedHydratedTransaction, StakeIntentService, TimePayload, TimeSchema,\n TimeSyncViewInterfaceV2, Transfer,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { XyoValidatorParams } from '../ChainValidator/index.ts'\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 = 10_000\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 = 500\n\nexport interface BaseBlockProducerServiceParams extends XyoValidatorParams {\n balanceService: AccountBalanceServiceV2\n pendingTransactionsService: PendingTransactionsService\n rejectedTransactionsArchivist: ArchivistInstance\n rewardAddress: Address\n time: TimeSyncViewInterfaceV2\n}\n\n@creatable()\nexport class BaseBlockProducerService extends BaseService<BaseBlockProducerServiceParams> implements BlockProducerService {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\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 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 balanceService() {\n return assertEx(this.params.balanceService, () => 'balanceService is required')\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\n }\n\n protected get chainId() {\n return assertEx(this.params.chainId, () => 'chainId is required')\n }\n\n protected get electionService() {\n return assertEx(this.params.electionService, () => 'electionService is required')\n }\n\n protected get pendingTransactionsService() {\n return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n }\n\n protected get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected bundled transactions archivist')\n }\n\n protected get rewardAddress(): Address {\n return assertEx(this.params.rewardAddress, () => 'No reward address provided')\n }\n\n protected get rewardService() {\n return assertEx(this.params.rewardService, () => 'rewardService is required')\n }\n\n protected get stakeIntentService(): StakeIntentService {\n return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n }\n\n protected get time(): TimeSyncViewInterfaceV2 {\n return assertEx(this.params.time, () => 'No TimeSyncViewInterface provided')\n }\n\n protected get validateHydratedBlockState() {\n return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n }\n\n async next(head: WithStorageMeta<BlockBoundWitness>): Promise<HydratedBlock | undefined> {\n // If the block is for another chain, ignore\n if (head.chain !== this.chainId) return\n const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\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 this.proposeNextValidBlock(head)\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 blockRewardService: this.rewardService,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n const blockHex = assertEx(toHex(block), () => 'Failed to convert block to hex')\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block: blockHex }).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 async getProducerRedeclaration(head: WithStorageMeta<BlockBoundWitness>): Promise<ChainStakeIntent | undefined> {\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n if (!lastRange) return\n const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + BaseBlockProducerService.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithStorageMeta<BlockBoundWitness>, validateBalances = false): Promise<HydratedBlock | undefined> {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactions = await this.pendingTransactionsService.getPendingTransactions(head._hash, BaseBlockProducerService.DefaultBlockSize)\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 (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) 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 timePayload = await this.generateTimePayload(head)\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.balanceService.balances(head._hash, [XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance)\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 errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceService })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (errors.length > 0) {\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n const rejectedTransactions = block[1]\n await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n } else {\n return block\n }\n })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithStorageMeta<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.balanceService.balances(head._hash, [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(head: WithStorageMeta<BlockBoundWitness>) {\n const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')\n const ethereumHash = assertEx(ethHashOrNull, () => 'No ethereum hash available from time sync service')\n const timePayload: TimePayload = {\n schema: TimeSchema,\n // note, this is for the previous block\n xl1: head.block,\n // note, this is for the previous block\n xl1Hash: head._hash,\n ethereum,\n ethereumHash,\n epoch: Date.now(),\n }\n return timePayload\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: WithStorageMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { type Address, hexFromBigInt } from '@xylabs/hex'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\nimport { HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\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 { creatable } from '@xylabs/creatable'\nimport { Promisable } from '@xylabs/promise'\nimport { BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseBlockRewardServiceParams extends BaseServiceParams {}\n\n@creatable()\nexport class BaseBlockRewardService<TParams extends BaseBlockRewardServiceParams = BaseBlockRewardServiceParams>\n extends BaseService<TParams> implements BlockRewardService {\n getRewardForBlock(_blockNumber: bigint): Promisable<bigint> {\n throw new Error('getRewardForBlock method must be implemented in derived classes')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { toEthAddress } from '@xylabs/hex'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport { BlockRewardService, ChainService } from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers/providers'\n\nimport { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'\n\nexport interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams {\n account: AccountInstance\n chainService?: ChainService\n provider?: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardService extends BaseBlockRewardService<EvmBlockRewardServiceParams> implements BlockRewardService {\n protected _contractAddress: string | undefined\n\n protected get chainService() {\n return assertEx(this.params.chainService, () => 'chainService 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 override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainService.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n\n override async getRewardForBlock(blockNumber: bigint): Promise<bigint> {\n const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider)\n return await contract.calcBlockReward(blockNumber)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { toFixedPoint } from '@xylabs/decimal-precision'\nimport { Promisable } from '@xylabs/promise'\nimport { rewardFromBlockNumber } from '@xyo-network/chain-protocol'\nimport { BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'\n\nexport interface MemoryBlockRewardServiceParams extends BaseBlockRewardServiceParams {\n creatorReward?: bigint\n initialStepReward?: bigint\n minRewardPerBlock?: bigint\n stepFactorDenominator?: bigint\n stepFactorNumerator?: bigint\n stepSize?: bigint\n}\n\n@creatable()\nexport class MemoryBlockRewardService<TParams extends MemoryBlockRewardServiceParams = MemoryBlockRewardServiceParams>\n extends BaseBlockRewardService<TParams> implements BlockRewardService {\n protected readonly rewardFromBlockNumber = rewardFromBlockNumber(18)\n\n get creatorReward() {\n return assertEx(this.params.creatorReward, () => 'creatorReward is required')\n }\n\n get initialReward() {\n return assertEx(this.params.initialStepReward, () => 'initialStepReward is required')\n }\n\n get minRewardPerBlock() {\n return assertEx(this.params.minRewardPerBlock, () => 'minRewardPerBlock is required')\n }\n\n get stepFactorDenominator() {\n return assertEx(this.params.stepFactorDenominator, () => 'stepFactorDenominator is required')\n }\n\n get stepFactorNumerator() {\n return assertEx(this.params.stepFactorNumerator, () => 'stepFactorNumerator is required')\n }\n\n get stepSize() {\n return assertEx(this.params.stepSize, () => 'stepSize is required')\n }\n\n static override async paramsHandler<T extends MemoryBlockRewardService['params']>(\n inParams?: Partial<T>,\n ): Promise<T> {\n return {\n ...await super.paramsHandler(inParams),\n creatorReward: inParams?.creatorReward ?? toFixedPoint(20_000_000_000n),\n initialStepReward: inParams?.initialStepReward ?? toFixedPoint(3000n),\n minRewardPerBlock: inParams?.minRewardPerBlock ?? toFixedPoint(30n),\n stepFactorDenominator: inParams?.stepFactorDenominator ?? 100n,\n stepFactorNumerator: inParams?.stepFactorNumerator ?? 90n,\n stepSize: inParams?.stepSize ?? 1_000_000n,\n } as T\n }\n\n override getRewardForBlock(blockNumber: bigint): Promisable<bigint> {\n return this.rewardFromBlockNumber(\n blockNumber,\n this.initialReward,\n this.stepSize,\n this.stepFactorNumerator,\n this.stepFactorDenominator,\n this.minRewardPerBlock,\n this.creatorReward,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hex } from '@xylabs/hex'\nimport {\n isDefined, isNull, isUndefined,\n} from '@xylabs/typeof'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BlockBoundWitness, ChainIteratorServiceEventData, EventingChainBlockNumberIteratorService,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, isBlockBoundWitnessWithHashStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport type { PayloadMapRead } from '@xyo-network/xl1-protocol-sdk'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport type { XyoChainIteratorParams } from './model/index.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorServiceEventData>\n implements EventingChainBlockNumberIteratorService {\n protected _blocksByBlockNumber = new LRUCache<number, WithStorageMeta<BlockBoundWitness>>({ max: 10_000 })\n protected _currentHead: WithStorageMeta<BlockBoundWitness> | undefined\n\n get chainId(): Hex { return assertEx(this._currentHead?.chain ?? this.params?.head?.chain, () => 'Current head is not set') }\n\n get chainMap(): PayloadMapRead<WithStorageMeta<Payload>> { return assertEx(this.params.chainMap) }\n\n async get(block: number): Promise<WithStorageMeta<BlockBoundWitness>> {\n const head = await this.head()\n // if(isUndefined(head)) return undefined\n // Bail early if the block requested is newer than the current head\n assertEx(head.block >= block, () => `Block requested is newer than the current head [${block}]`)\n const cached = this._blocksByBlockNumber.get(block)\n if (cached) return cached\n // Start at the current head and traverse backwards until the requested block is found\n const startingBlock = head\n const currentBlockHash = await PayloadBuilder.hash(startingBlock)\n let currentBlock = (await this.chainMap.get(currentBlockHash))\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitnessWithHashStorageMeta(currentBlock)) {\n this._blocksByBlockNumber.set(currentBlock.block, currentBlock)\n if (currentBlock.block === block) {\n return currentBlock\n }\n const { previous } = currentBlock\n if (isNull(previous)) break\n currentBlock = (await this.chainMap.get(previous))\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<WithStorageMeta<BlockBoundWitness>> {\n if (isDefined(this._currentHead)) return this._currentHead\n if (isDefined(this.params.head)) {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head)\n this._currentHead = newHead\n return newHead\n }\n throw new Error('Head is not set')\n }\n\n async next(block: number): Promise<WithStorageMeta<BlockBoundWitness> | undefined> {\n const currentBlock = block\n const nextBlockNumber = currentBlock + 1\n return await this.get(nextBlockNumber)\n }\n\n // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)\n // and then communicate via method name and documentation\n async previous(block: number | undefined = undefined, count: number = 1): Promise<WithStorageMeta<BlockBoundWitness>[]> {\n const results: WithStorageMeta<BlockBoundWitness>[] = []\n let currentBlock: WithStorageMeta<BlockBoundWitness> | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (isDefined(currentBlock) && (results.length < count)) {\n if (isBlockBoundWitnessWithHashStorageMeta(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock as BlockBoundWitness\n if (isNull(previous)) break\n const nextBlock = await this.chainMap.get(previous)\n currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock)\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`)\n }\n }\n return results\n }\n\n async updateHead(head: BlockBoundWitness): Promise<void> {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head)\n this._currentHead = newHead\n void this.emit('headUpdated', { blocks: [newHead] })\n }\n\n private async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head: BlockBoundWitness): Promise<WithStorageMeta<BlockBoundWitness>> {\n const hash = await PayloadBuilder.hash(head)\n const stored = (await this.chainMap.get(hash))\n const newHead = asBlockBoundWitnessWithStorageMeta(stored)\n if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`)\n return newHead\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress, toEthAddress } from '@xylabs/hex'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { ChainService } from '@xyo-network/xl1-protocol'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface EvmChainServiceParams extends BaseServiceParams {\n contract: StakedXyoChain\n id: Address\n runner: ContractRunner\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\nexport class EvmChainService extends BaseService<EvmChainServiceParams> implements ChainService {\n get chainId(): Address {\n return assertEx(this.params.id)\n }\n\n get contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(this.chainId),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n get runner(): ContractRunner {\n return assertEx(this.params.runner)\n }\n\n async active(): Promise<bigint> {\n return await this.contract.active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await this.contract.activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await this.contract.activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await this.contract.addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await this.contract.forkedAtBlockNumber()\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await this.contract.forkedAtHash()\n }\n\n async forkedChainId(): Promise<Address> {\n return toAddress(await this.contract.forkedChainId())\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await this.contract.minWithdrawalBlocks()\n }\n\n async pending(): Promise<bigint> {\n return await this.contract.pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await this.contract.pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await this.contract.removeStake(slot)\n await result.wait()\n return true\n }\n\n async rewardsContract(): Promise<string> {\n return await this.contract.rewardsContract()\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await this.contract.stakingTokenAddress()\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await this.contract.withdrawStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawn(): Promise<bigint> {\n return await this.contract.withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await this.contract.withdrawnByStaker(getAddress(staker))\n }\n}\n","import type { Address } from '@xylabs/hex'\nimport { ZERO_ADDRESS } from '@xylabs/hex'\nimport type { ChainService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface MemoryChainServiceParams extends BaseServiceParams {}\n\n/**\n * A class that represents a chain stake as backed in memory\n */\nexport class MemoryChainService extends BaseService<MemoryChainServiceParams> implements ChainService {\n protected _simulatedStake: bigint = 1n\n\n get chainId(): Address {\n return ZERO_ADDRESS\n }\n\n async active(): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaked(_staked: Address): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaker(_address: string): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async addStake(_staked: string, _amount: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n override createHandler(): void {\n const { minStake } = this.params.config.producer\n this._simulatedStake = BigInt(minStake)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedChainId(): Promise<Address> {\n return await Promise.resolve(ZERO_ADDRESS)\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await Promise.resolve(1n)\n }\n\n async pending(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async pendingByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async removeStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async rewardsContract(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async withdrawStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async withdrawn(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async withdrawnByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { Promisable } from '@xylabs/promise'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n BlockBoundWitness,\n BlockRewardService,\n ChainId,\n ElectionService,\n HydratedBlockStateValidationFunctionV2,\n SignedHydratedTransactionWithStorageMeta,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n account: AccountInstance\n chainArchivist: ReadArchivist\n chainId: ChainId\n electionService: ElectionService\n pendingBundledTransactionsArchivist: ArchivistInstance\n rewardService: BlockRewardService\n stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunctionV2\n}\n\n@creatable()\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends BaseService<TParams> implements Validator {\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 chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\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 rewardService() {\n return assertEx(this.params.rewardService, () => 'rewardService is required')\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.chainArchivist.get([tx._hash])).length > 0) 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 { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ChainBlockNumberIteratorService, ChainStakeViewer, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { BlockBoundWitness, ElectionService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n chainIterator?: ChainBlockNumberIteratorService\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatable()\nexport class BaseElectionService extends BaseService<BaseElectionServicesParams> implements ElectionService {\n get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'No chain iterator')\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: 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 = await PayloadBuilder.hash(current)\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n })\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 { creatable } from '@xylabs/creatable'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseNetworkStakeStepRewardService extends BaseService<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [bigint, bigint]>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n}\n","import { ValueType } from '@opentelemetry/api'\nimport { filterAs, filterAsync } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Hash } from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock } from '@xyo-network/chain-protocol'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitnessWithHashStorageMeta, ChainId, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta, PendingTransactionsService,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport { TransactionJsonSchemaValidator, validateTransaction } from '@xyo-network/xl1-validation'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist?: ArchivistInstance\n chainId?: ChainId\n pendingBundledTransactionsArchivist?: ArchivistInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n}\n\n@creatable()\nexport class BasePendingTransactionsService extends BaseService<BasePendingTransactionsServiceParams> implements PendingTransactionsService {\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainId() {\n return assertEx(this.params.chainId, () => 'No chain id')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n async getPendingTransactions(head: Hash, limit: number): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), asBlockBoundWitnessWithHashStorageMeta)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(lastHead.block + 1))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), asBlockBoundWitnessWithHashStorageMeta)\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(lastHead.block + 1))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: number) =>\n ([txBw]: SignedHydratedTransactionWithStorageMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: number) =>\n ([txBw]: SignedHydratedTransactionWithStorageMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { asTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithStorageMeta | undefined> => {\n const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)\n const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withStorageMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/hex'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithStorageMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithStorageMeta) => {\n const payloads = flattenHydratedTransaction(transaction).flatMap(p => PayloadBuilder.omitStorageMeta(p))\n return new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema })\n .fields({ payloads, root })\n .build()\n}\n","import { filterAs } from '@xylabs/array'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { asOptionalBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContains } from '@xyo-network/boundwitness-validator'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type {\n BlockBoundWitness, ChainStakeIntent, Intent,\n} from '@xyo-network/xl1-protocol'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'\n\nexport const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness, archivist: ArchivistInstance, intent: Intent): Promise<ChainStakeIntent[]> => {\n // Get payloads in block\n const blockData = await archivist.get(block.payload_hashes)\n // Filter Payloads in block to BoundWitnesses\n const bwsFromBlock = filterAs(blockData, asOptionalBoundWitness)\n // Filter to BoundWitnesses with StakeIntent payloads\n const bwsFromBlockWithDeclarations = bwsFromBlock.filter(bw => payloadSchemasContains(bw, ChainStakeIntentSchema))\n // Filter to only valid signed BWs\n const validBlockBwsWithDeclarations = await filterToValidSignedBoundWitnesses(bwsFromBlockWithDeclarations)\n return (await Promise.all(validBlockBwsWithDeclarations.map(async (bw) => {\n // Get staked intent hashes from signed declarations\n const stakeIntentHashes = validBlockBwsWithDeclarations\n .flatMap(mapBoundWitnessToStakeIntentHashes)\n .filter(exists)\n // Get staked intent payloads\n const payloads = await archivist.get(stakeIntentHashes)\n // Filter payloads to staked intents\n const stakeIntents = filterAs(payloads, asChainStakeIntent)\n // that are producers\n .filter(p => p.intent === intent)\n // where the issuer of the intent is also the signer of this BW\n .filter(p => bw.addresses.includes(p.from))\n\n return stakeIntents\n }))).flat()\n}\n\nconst filterToValidSignedBoundWitnesses = async (bws: BoundWitness[]): Promise<BoundWitness[]> => {\n const validBwIndexes = await Promise.all(bws.map(bw => BoundWitnessWrapper.parse(bw).getValid()))\n return bws.filter((_, index) => validBwIndexes[index])\n}\n\nconst mapBoundWitnessToStakeIntentHashes = (bw: BoundWitness): (Hash | undefined)[] => {\n return bw.payload_schemas.map((schema, index) => schema === ChainStakeIntentSchema ? bw.payload_hashes[index] : undefined)\n}\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport {\n Address, asAddress, Hash,\n} from '@xylabs/hex'\nimport { isUndefined } from '@xylabs/typeof'\nimport { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n analyzeChain, ChainStakeIntentAnalyzer,\n isChainSummaryStakeIntent,\n} from '@xyo-network/chain-analyze'\nimport {\n DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS,\n findFirstMatching, IntervalMap,\n SerializedIntervalMap,\n} from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { EventingChainBlockNumberIteratorService, Intent } from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta,\n asChainIndexingServiceStateWithStorageMeta,\n asChainStakeIntent, ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n isChainIndexingServiceState,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIterator?: EventingChainBlockNumberIteratorService\n chainStakeViewer?: ChainStakeViewer\n stakeIntentStateArchivist?: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\nconst STATE_PERSISTENCE_INTERVAL = 60n\n\nconst ACTIVE_STAKE_TTL = 1000 * 60 * 60 * 2 // 2 hours in milliseconds\nconst NO_ACTIVE_STAKE_TTL = 1000 * 2 // 2 seconds in milliseconds\nconst STAKE_CACHE_MAX_ENTRIES = 10_000\n\n@creatable()\nexport class XyoStakeIntentService extends BaseService<XyoStakeIntentServiceParams> implements StakeIntentService {\n // TODO: Use hash instead of block number to handle chain reorgs\n protected _lastIndexedBlockHash: Hash | undefined = undefined\n // TODO: Interval tree per declaration (bank, validator, etc.)\n // NOTE: Ideally move to DataIntervalTree to handle declared\n // ranges as it enables range queries in O(min(n, k * log n)) time,\n // where k is the number of intervals in the output list time\n // Currently using set based because it's simpler, equivalent\n // in performance for small sets, and (most importantly) easily\n // persisted so we can recover state on restart.\n protected _producers: IntervalMap<Address> = new IntervalMap()\n protected _stakeCache = new LRUCache<Address, bigint>({ max: STAKE_CACHE_MAX_ENTRIES })\n protected _updateMutex = new Mutex()\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist not set')\n }\n\n override async createHandler() {\n this.chainIterator.on('headUpdated', async () => {\n await this.updateIndex()\n })\n const head = await this.chainIterator.head()\n if (isUndefined(head)) return\n const headHash = await PayloadBuilder.hash(head)\n await this.recoverState(headHash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)\n const results = this._producers.get(address)\n return results ?? []\n }\n\n async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {\n return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {\n assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n const currentBlock = assertEx(asBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)\n const currentBlockNum = currentBlock.block\n // Find last state before current head (in case of rollback, we indexed past it on an uncle chain, etc.)\n const opts: ArchivistNextOptions = { ...DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS }\n while (true) {\n const predicate = (p: WithStorageMeta<Payload>) => {\n const state = asChainIndexingServiceStateWithStorageMeta(p)\n return state ? true : false\n }\n const state = await findFirstMatching(this.stakeIntentStateArchivist, predicate, opts)\n if (isChainIndexingServiceState<SerializedIntervalMap>(state)) {\n const indexed = (await this.chainArchivist.get([state.endBlockHash]))?.[0]\n const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed)\n if (indexedBlock) {\n const indexedBlockNum = indexedBlock.block\n if (indexedBlockNum <= currentBlockNum) {\n const data = state.state as SerializedIntervalMap\n this._producers = new IntervalMap(data)\n this._lastIndexedBlockHash = indexedBlock._hash\n break\n }\n }\n } else {\n // No state found, start from genesis\n break\n }\n opts.open = true\n }\n }\n\n private async updateIndex(displayProgress = false): Promise<void> {\n if (this._updateMutex.isLocked()) {\n return\n }\n await this._updateMutex.runExclusive(async () => {\n return await this.spanAsync('updateIndex', async () => {\n const currentHead = await this.chainIterator.head()\n if (isUndefined(currentHead)) return\n const currentHeadHash = await PayloadBuilder.hash(currentHead)\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n })\n })\n }\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n StepIdentity,\n StepStakeService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\n@creatable()\nexport class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeService {\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { asHash, Hash } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n asTimePayload,\n EventingChainBlockNumberIteratorService, TimeDomain, TimePayload, TimeSchema,\n TimeSyncServiceV2,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface TimeProvider {\n currentTime(): Promise<[string, number]>\n}\n\nexport interface BaseTimeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncServiceV2 {\n get chainArchivist() {\n return this.params.chainArchivist\n }\n\n get chainIterator() {\n return this.params.chainIterator\n }\n\n get ethProvider() {\n return this.params.ethProvider\n }\n\n async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {\n switch (fromDomain) {\n case 'xl1': {\n const block = assertEx(await this.chainIterator.get(from), () => 'Block not found')\n const timeSchemaIndex = block.payload_schemas.indexOf(TimeSchema)\n const hash = timeSchemaIndex === -1 ? undefined : block.payload_hashes[timeSchemaIndex]\n const [payload] = hash === undefined ? [] : await this.chainArchivist.get([hash])\n const timePayload = asTimePayload(payload)\n if (timePayload === undefined) return 0\n switch (toDomain) {\n case 'xl1': {\n return timePayload.xl1 ?? 0\n }\n case 'epoch': {\n return timePayload.epoch ?? 0\n }\n case 'ethereum': {\n return timePayload.ethereum ?? 0\n }\n default: {\n throw new Error(`Unsupported to toDomain: ${toDomain}`)\n }\n }\n }\n default: {\n throw new Error(`Unsupported from fromDomain: ${fromDomain}`)\n }\n }\n }\n\n async currentTime(domain: TimeDomain): Promise<[string, number]> {\n switch (domain) {\n case 'xl1': {\n return ['xl1', (await this.chainIterator.head()).block]\n }\n case 'epoch': {\n return ['epoch', Date.now()]\n }\n case 'ethereum': {\n return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]\n }\n default: {\n throw new Error(`Unknown time domain: ${domain}`)\n }\n }\n }\n\n async currentTimeAndHash(domain: TimeDomain): Promise<[number, Hash | null]> {\n switch (domain) {\n case 'xl1': {\n const head = await this.chainIterator.head()\n return [head.block, await PayloadBuilder.hash(head)]\n }\n case 'epoch': {\n return [Date.now(), null]\n }\n case 'ethereum': {\n const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')\n const blockNumber = (await provider.getBlockNumber()) ?? 0\n const block = await provider.getBlock(blockNumber)\n const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)\n return [blockNumber, blockHash]\n }\n default: {\n throw new Error(`Unknown time domain: ${domain}`)\n }\n }\n }\n\n currentTimePayload(): Promisable<TimePayload> {\n throw new Error('Method not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","findMostRecentBlock","LruCacheMap","StepSizes","readPayloadMapFromStore","Semaphore","creatable","spanRootAsync","AttoXL1","balancesSummary","AbstractCreatable","creatable","spanRoot","spanRootAsync","Mutex","BaseService","AbstractCreatable","singletonInitMutex","Mutex","singletons","globalThis","initSingleton","params","name","Error","runExclusive","create","paramsHandler","span","fn","spanRoot","tracer","spanAsync","spanRootAsync","sync","_head","BaseAccountableService","creatableService","constructor","BaseAccountBalanceService","BaseService","balances","head","address","spanRootAsync","summary","balancesSummary","params","context","result","addr","summaryBalance","AttoXL1","accountBalancesServiceFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","chainMap","readPayloadMapFromStore","headFunc","head","findMostRecentBlock","assertEx","_hash","service","BaseAccountBalanceService","create","context","store","stepSemaphores","StepSizes","map","Semaphore","assertEx","findMostRecentBlock","LruCacheMap","StepSizes","readPayloadMapFromStore","Semaphore","creatable","spanRootAsync","AttoXL1","transfersSummary","BaseAccountTransfersService","BaseService","transfer","head","address","transfers","AttoXL1","addresses","spanRootAsync","summary","transfersSummary","params","context","result","addr","summaryBalance","accountTransfersServiceFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","chainMap","readPayloadMapFromStore","headFunc","head","findMostRecentBlock","assertEx","_hash","service","BaseAccountTransfersService","create","context","store","stepSemaphores","StepSizes","map","Semaphore","assertEx","creatable","exists","hexToBigInt","toHex","isDefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","createDeclarationIntent","PayloadBuilder","asBlockBoundWitness","AttoXL1","BlockNumberSchema","defaultRewardRatio","TimeSchema","XYO_STEP_REWARD_ADDRESS","assertEx","hexFromBigInt","PayloadBuilder","TransferSchema","XYO_ZERO_ADDRESS","transactionRequiredGas","HydratedTransactionWrapper","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","BaseBlockProducerService","BaseService","_blockRewardDiviner","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","address","account","assertEx","params","balanceService","chainArchivist","chainId","electionService","pendingTransactionsService","rejectedTransactionsArchivist","rewardAddress","rewardService","stakeIntentService","time","validateHydratedBlockState","next","head","chain","leaders","getCreatorCommitteeForNextBlock","includes","proposeNextValidBlock","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","create","blockRewardService","config","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockHex","toHex","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","producer","disableIntentRedeclaration","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","currentBlock","timeToProducerExpiration","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactions","getPendingTransactions","_hash","blockPayloads","producerRedeclarationPayload","push","length","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timePayload","generateTimePayload","fundedNextBlockTransactions","fundedTransfers","filterByFunded","logger","info","startBuild","Date","now","stepRewardPoolBalance","balances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","startValidate","errors","accountBalance","warn","message","rejectedTransactions","insert","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","ethereum","ethHashOrNull","currentTimeAndHash","ethereumHash","TimeSchema","xl1","xl1Hash","epoch","$epoch","isDefined","heartbeatInterval","creatable","BaseBlockRewardService","BaseService","getRewardForBlock","_blockNumber","Error","assertEx","creatable","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","EvmBlockRewardService","BaseBlockRewardService","_contractAddress","chainService","assertEx","params","contractAddress","provider","createHandler","rewardsContract","ex","error","Error","message","getRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","calcBlockReward","assertEx","creatable","toFixedPoint","rewardFromBlockNumber","MemoryBlockRewardService","BaseBlockRewardService","rewardFromBlockNumber","creatorReward","assertEx","params","initialReward","initialStepReward","minRewardPerBlock","stepFactorDenominator","stepFactorNumerator","stepSize","paramsHandler","inParams","toFixedPoint","getRewardForBlock","blockNumber","assertEx","isDefined","isNull","isUndefined","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","isBlockBoundWitnessWithHashStorageMeta","LRUCache","ChainBlockNumberIterationService","BaseService","_blocksByBlockNumber","LRUCache","max","_currentHead","chainId","assertEx","chain","params","head","chainMap","get","block","cached","startingBlock","currentBlockHash","PayloadBuilder","hash","currentBlock","isDefined","asBlockBoundWitness","_hash","isBlockBoundWitnessWithHashStorageMeta","set","previous","isNull","Error","newHead","getBoundWitnessAsBlockBoundWitnessWithStorageMeta","next","nextBlockNumber","undefined","count","results","length","push","nextBlock","asBlockBoundWitnessWithStorageMeta","updateHead","emit","blocks","stored","isUndefined","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","getAddress","EvmChainService","BaseService","chainId","assertEx","params","id","contract","undefined","StakedXyoChainFactory","connect","toEthAddress","runner","active","activeByStaked","staked","activeByAddressStaked","getAddress","activeByStaker","address","addStake","amount","result","wait","forkedAtBlockNumber","forkedAtHash","forkedChainId","toAddress","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","ZERO_ADDRESS","MemoryChainService","BaseService","_simulatedStake","chainId","ZERO_ADDRESS","active","Promise","resolve","activeByStaked","_staked","activeByStaker","_address","addStake","_amount","createHandler","minStake","params","config","producer","BigInt","forkedAtBlockNumber","forkedAtHash","forkedChainId","minWithdrawalBlocks","pending","pendingByStaker","_staker","removeStake","_slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","assertEx","creatable","XyoValidator","BaseService","address","account","assertEx","params","chainArchivist","chainInfo","chainId","electionService","pendingBundledTransactionsArchivist","rewardService","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","get","_hash","length","Promise","resolve","assertEx","creatable","hexToLast4BytesInt","shuffleWithSeed","PayloadBuilder","BaseElectionService","BaseService","chainIterator","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","PayloadBuilder","hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","creatable","BaseNetworkStakeStepRewardService","BaseService","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","ValueType","filterAs","filterAsync","assertEx","creatable","exists","forget","isDefined","isUndefined","MemoryArchivist","findMostRecentBlock","asBlockBoundWitnessWithHashStorageMeta","isTransactionBoundWitnessWithStorageMeta","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asTransactionBoundWitnessWithStorageMeta","bundledPayloadToHydratedTransaction","payload","withStorageMeta","PayloadBuilder","addStorageMeta","payloads","tx","asTransactionBoundWitnessWithStorageMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","BaseService","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","chainId","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","getPendingTransactions","head","limit","spanAsync","runExclusive","lastHead","filterAs","get","asBlockBoundWitnessWithHashStorageMeta","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","next","order","at","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","block","txValidationResults","validateTransaction","validTransactions","errors","push","logger","log","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","warn","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","filterAs","exists","asOptionalBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filterAs","asOptionalBoundWitness","bwsFromBlockWithDeclarations","filter","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","filterAs","assertEx","creatable","asAddress","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainIndexingServiceStateWithStorageMeta","asChainStakeIntent","ChainIndexingServiceStateSchema","isChainIndexingServiceState","readPayloadMapFromStore","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","chainArchivist","assertEx","params","chainIterator","chainStakeViewer","stakeIntentStateArchivist","createHandler","on","updateIndex","head","isUndefined","headHash","PayloadBuilder","hash","recoverState","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","minStake","config","producer","BigInt","isStakedForBlock","includes","startHandler","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","currentBlock","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","_hash","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","creatable","BaseStepStakeService","BaseService","stepStake","_step","Error","stepStakeForAddress","_address","assertEx","creatable","asHash","PayloadBuilder","asTimePayload","TimeSchema","BaseTimeSyncService","BaseService","chainArchivist","params","chainIterator","ethProvider","convertTime","fromDomain","toDomain","from","block","assertEx","get","timeSchemaIndex","payload_schemas","indexOf","TimeSchema","hash","undefined","payload_hashes","payload","timePayload","asTimePayload","xl1","epoch","ethereum","Error","currentTime","domain","head","Date","now","getBlockNumber","currentTimeAndHash","PayloadBuilder","provider","blockNumber","getBlock","blockHash","asHash","currentTimePayload"]}
1
+ {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/AccountBalance/BaseAccountBalanceService.ts","../../src/BaseService.ts","../../src/AccountTransfers/accountTransfersServiceFromArchivist.ts","../../src/AccountTransfers/BaseAccountTransfersService.ts","../../src/BlockProducer/BaseBlockProducerService.ts","../../src/BlockProducer/generateTransactionFeeTransfers.ts","../../src/BlockReward/BaseBlockRewardService.ts","../../src/BlockReward/EvmBlockRewardService.ts","../../src/BlockReward/MemoryBlockRewardService.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainService/Evm/Evm.ts","../../src/ChainService/Memory/Memory.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts","../../src/Time/BaseTimeSyncService.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock, LruCacheMap } from '@xyo-network/chain-protocol'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { AccountBalanceServiceV2, ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { BaseAccountBalanceService } from './BaseAccountBalanceService.ts'\n\nexport const accountBalancesServiceFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceServiceV2> => {\n const summaryMap = new LruCacheMap<string, BalancesStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async () => {\n const head = await findMostRecentBlock(archivist)\n return assertEx(head?._hash, () => 'No head found in chainArchivist')\n }\n const service = await BaseAccountBalanceService.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n })\n return service\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { spanRootAsync } from '@xylabs/telemetry'\nimport {\n AccountBalanceServiceV2,\n AttoXL1,\n} from '@xyo-network/xl1-protocol'\nimport {\n balancesSummary,\n BalanceStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseAccountBalanceServiceParams extends BaseServiceParams {\n context: BalanceStepSummaryContext\n}\n\n@creatable()\nexport class BaseAccountBalanceService extends BaseService<BaseAccountBalanceServiceParams> implements AccountBalanceServiceV2 {\n async balances(head: Hash, address: Address[]): Promise<Partial<Record<Address, AttoXL1>>> {\n return await spanRootAsync('balances', async () => {\n const summary = await balancesSummary(\n this.params.context,\n )\n const result: Record<Address, AttoXL1> = {}\n for (const addr of address) {\n const summaryBalance = summary[addr] ?? 0n\n result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance)\n }\n return result\n })\n }\n}\n","import { AbstractCreatable, creatable } from '@xylabs/creatable'\nimport type { EventData } from '@xylabs/events'\nimport { Hash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { spanRoot, spanRootAsync } from '@xylabs/telemetry'\nimport type { ServiceInterface } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n@creatable()\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>\n extends AbstractCreatable<TParams, TEventData> implements ServiceInterface {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: Partial<TParams>) {\n if (this.singletons[this.name]) throw new Error(`Singleton already initialized for ${this.name}`)\n return this.singletonInitMutex.runExclusive(async () => {\n return await this.create(params) as TService\n })\n }\n\n paramsHandler(params?: Partial<TParams>): TParams {\n return params as TParams\n }\n\n span<T>(name: string, fn: () => T): T {\n return spanRoot(name, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanRootAsync(name, fn, this.tracer)\n }\n\n sync(_head: Hash): Promise<void> {\n throw new Error('Method not implemented.')\n }\n}\n\nexport abstract class BaseAccountableService<\n TParams extends BaseAccountableServiceParams = BaseAccountableServiceParams,\n> extends BaseService<TParams> {\n // Base class for services that have an account\n}\n\nexport interface CreatableService<T extends BaseService = BaseService> extends ServiceInterface {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>\n}\n\nexport function creatableService<T extends BaseService = BaseService>() {\n return <U extends CreatableService<T>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock, LruCacheMap } from '@xyo-network/chain-protocol'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { AccountTransfersService, ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type { TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { BaseAccountTransfersService } from './BaseAccountTransfersService.ts'\n\nexport const accountTransfersServiceFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountTransfersService> => {\n const summaryMap = new LruCacheMap<string, TransfersStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async () => {\n const head = await findMostRecentBlock(archivist)\n return assertEx(head?._hash, () => 'No head found in chainArchivist')\n }\n const service = await BaseAccountTransfersService.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n })\n return service\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { spanRootAsync } from '@xylabs/telemetry'\nimport {\n AccountTransfersService,\n AttoXL1,\n} from '@xyo-network/xl1-protocol'\nimport {\n TransfersStepSummaryContext,\n transfersSummary,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseAccountTransferServiceParams extends BaseServiceParams {\n context: TransfersStepSummaryContext\n}\n\n@creatable()\nexport class BaseAccountTransfersService extends BaseService<BaseAccountTransferServiceParams> implements AccountTransfersService {\n async transfer(head: Hash, address: Address): Promise<AttoXL1> {\n return (await this.transfers(head, [address]))[address] ?? AttoXL1(0n)\n }\n\n async transfers(head: Hash, addresses: Address[]): Promise<Partial<Record<Address, AttoXL1>>> {\n return await spanRootAsync('transfers', async () => {\n const summary = await transfersSummary(this.params.context)\n const result: Record<Address, AttoXL1> = {}\n for (const addr of addresses) {\n const summaryBalance = summary[addr] ?? 0n\n result[addr] = AttoXL1(summaryBalance)\n }\n return result\n })\n }\n}\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { exists } from '@xylabs/exists'\nimport {\n Address, Hex, hexToBigInt, toHex,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock, createDeclarationIntent } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n AccountBalanceServiceV2, AllowedBlockPayload,\n asBlockBoundWitness, AttoXL1, BlockBoundWitness, BlockNumberPayload, BlockNumberSchema, BlockProducerService,\n ChainStakeIntent, defaultRewardRatio, HydratedBlock, PendingTransactionsService, SignedHydratedTransaction, StakeIntentService, TimePayload, TimeSchema,\n TimeSyncViewInterfaceV2, Transfer,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { XyoValidatorParams } from '../ChainValidator/index.ts'\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 = 10_000\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 = 500\n\nexport interface BaseBlockProducerServiceParams extends XyoValidatorParams {\n balanceService: AccountBalanceServiceV2\n pendingTransactionsService: PendingTransactionsService\n rejectedTransactionsArchivist: ArchivistInstance\n rewardAddress: Address\n time: TimeSyncViewInterfaceV2\n}\n\n@creatable()\nexport class BaseBlockProducerService extends BaseService<BaseBlockProducerServiceParams> implements BlockProducerService {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\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 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 balanceService() {\n return assertEx(this.params.balanceService, () => 'balanceService is required')\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\n }\n\n protected get chainId() {\n return assertEx(this.params.chainId, () => 'chainId is required')\n }\n\n protected get electionService() {\n return assertEx(this.params.electionService, () => 'electionService is required')\n }\n\n protected get pendingTransactionsService() {\n return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n }\n\n protected get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected bundled transactions archivist')\n }\n\n protected get rewardAddress(): Address {\n return assertEx(this.params.rewardAddress, () => 'No reward address provided')\n }\n\n protected get rewardService() {\n return assertEx(this.params.rewardService, () => 'rewardService is required')\n }\n\n protected get stakeIntentService(): StakeIntentService {\n return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n }\n\n protected get time(): TimeSyncViewInterfaceV2 {\n return assertEx(this.params.time, () => 'No TimeSyncViewInterface provided')\n }\n\n protected get validateHydratedBlockState() {\n return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n }\n\n async next(head: WithStorageMeta<BlockBoundWitness>): Promise<HydratedBlock | 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 this.proposeNextValidBlock(head)\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 blockRewardService: this.rewardService,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n const blockHex = assertEx(toHex(block), () => 'Failed to convert block to hex')\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block: blockHex }).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 async getProducerRedeclaration(head: WithStorageMeta<BlockBoundWitness>): Promise<ChainStakeIntent | undefined> {\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n if (!lastRange) return\n const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + BaseBlockProducerService.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithStorageMeta<BlockBoundWitness>, validateBalances = false): Promise<HydratedBlock | undefined> {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactionsStart = Date.now()\n const nextBlockTransactions = await this.pendingTransactionsService.getPendingTransactions(head._hash, BaseBlockProducerService.DefaultBlockSize)\n const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart\n if (nextBlockTransactionsDuration > 200) {\n this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`)\n }\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 (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) 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(head)\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.balanceService.balances(head._hash, [XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance)\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 errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceService })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (errors.length > 0) {\n this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n const rejectedTransactions = block[1]\n await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n } else {\n return block\n }\n })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithStorageMeta<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.balanceService.balances(head._hash, [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(head: WithStorageMeta<BlockBoundWitness>) {\n const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')\n const ethereumHash = assertEx(ethHashOrNull, () => 'No ethereum hash available from time sync service')\n const timePayload: TimePayload = {\n schema: TimeSchema,\n // note, this is for the previous block\n xl1: head.block,\n // note, this is for the previous block\n xl1Hash: head._hash,\n ethereum,\n ethereumHash,\n epoch: Date.now(),\n }\n return timePayload\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: WithStorageMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { type Address, hexFromBigInt } from '@xylabs/hex'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\nimport { HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\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 { creatable } from '@xylabs/creatable'\nimport { Promisable } from '@xylabs/promise'\nimport { BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseBlockRewardServiceParams extends BaseServiceParams {}\n\n@creatable()\nexport class BaseBlockRewardService<TParams extends BaseBlockRewardServiceParams = BaseBlockRewardServiceParams>\n extends BaseService<TParams> implements BlockRewardService {\n getRewardForBlock(_blockNumber: bigint): Promisable<bigint> {\n throw new Error('getRewardForBlock method must be implemented in derived classes')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { toEthAddress } from '@xylabs/hex'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport { BlockRewardService, ChainService } from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers/providers'\n\nimport { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'\n\nexport interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams {\n account: AccountInstance\n chainService?: ChainService\n provider?: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardService extends BaseBlockRewardService<EvmBlockRewardServiceParams> implements BlockRewardService {\n protected _contractAddress: string | undefined\n\n protected get chainService() {\n return assertEx(this.params.chainService, () => 'chainService 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 override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainService.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n\n override async getRewardForBlock(blockNumber: bigint): Promise<bigint> {\n const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider)\n return await contract.calcBlockReward(blockNumber)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { toFixedPoint } from '@xylabs/decimal-precision'\nimport { Promisable } from '@xylabs/promise'\nimport { rewardFromBlockNumber } from '@xyo-network/chain-protocol'\nimport { BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'\n\nexport interface MemoryBlockRewardServiceParams extends BaseBlockRewardServiceParams {\n creatorReward?: bigint\n initialStepReward?: bigint\n minRewardPerBlock?: bigint\n stepFactorDenominator?: bigint\n stepFactorNumerator?: bigint\n stepSize?: bigint\n}\n\n@creatable()\nexport class MemoryBlockRewardService<TParams extends MemoryBlockRewardServiceParams = MemoryBlockRewardServiceParams>\n extends BaseBlockRewardService<TParams> implements BlockRewardService {\n protected readonly rewardFromBlockNumber = rewardFromBlockNumber(18)\n\n get creatorReward() {\n return assertEx(this.params.creatorReward, () => 'creatorReward is required')\n }\n\n get initialReward() {\n return assertEx(this.params.initialStepReward, () => 'initialStepReward is required')\n }\n\n get minRewardPerBlock() {\n return assertEx(this.params.minRewardPerBlock, () => 'minRewardPerBlock is required')\n }\n\n get stepFactorDenominator() {\n return assertEx(this.params.stepFactorDenominator, () => 'stepFactorDenominator is required')\n }\n\n get stepFactorNumerator() {\n return assertEx(this.params.stepFactorNumerator, () => 'stepFactorNumerator is required')\n }\n\n get stepSize() {\n return assertEx(this.params.stepSize, () => 'stepSize is required')\n }\n\n static override async paramsHandler<T extends MemoryBlockRewardService['params']>(\n inParams?: Partial<T>,\n ): Promise<T> {\n return {\n ...await super.paramsHandler(inParams),\n creatorReward: inParams?.creatorReward ?? toFixedPoint(20_000_000_000n),\n initialStepReward: inParams?.initialStepReward ?? toFixedPoint(3000n),\n minRewardPerBlock: inParams?.minRewardPerBlock ?? toFixedPoint(30n),\n stepFactorDenominator: inParams?.stepFactorDenominator ?? 100n,\n stepFactorNumerator: inParams?.stepFactorNumerator ?? 90n,\n stepSize: inParams?.stepSize ?? 1_000_000n,\n } as T\n }\n\n override getRewardForBlock(blockNumber: bigint): Promisable<bigint> {\n return this.rewardFromBlockNumber(\n blockNumber,\n this.initialReward,\n this.stepSize,\n this.stepFactorNumerator,\n this.stepFactorDenominator,\n this.minRewardPerBlock,\n this.creatorReward,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hex } from '@xylabs/hex'\nimport {\n isDefined, isNull, isUndefined,\n} from '@xylabs/typeof'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BlockBoundWitness, ChainIteratorServiceEventData, EventingChainBlockNumberIteratorService,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, isBlockBoundWitnessWithHashStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport type { PayloadMapRead } from '@xyo-network/xl1-protocol-sdk'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport type { XyoChainIteratorParams } from './model/index.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorServiceEventData>\n implements EventingChainBlockNumberIteratorService {\n protected _blocksByBlockNumber = new LRUCache<number, WithStorageMeta<BlockBoundWitness>>({ max: 10_000 })\n protected _currentHead: WithStorageMeta<BlockBoundWitness> | undefined\n\n get chainId(): Hex { return assertEx(this._currentHead?.chain ?? this.params?.head?.chain, () => 'Current head is not set') }\n\n get chainMap(): PayloadMapRead<WithStorageMeta<Payload>> { return assertEx(this.params.chainMap) }\n\n async get(block: number): Promise<WithStorageMeta<BlockBoundWitness>> {\n const head = await this.head()\n // if(isUndefined(head)) return undefined\n // Bail early if the block requested is newer than the current head\n assertEx(head.block >= block, () => `Block requested is newer than the current head [${block}]`)\n const cached = this._blocksByBlockNumber.get(block)\n if (cached) return cached\n // Start at the current head and traverse backwards until the requested block is found\n const startingBlock = head\n const currentBlockHash = await PayloadBuilder.hash(startingBlock)\n let currentBlock = (await this.chainMap.get(currentBlockHash))\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitnessWithHashStorageMeta(currentBlock)) {\n this._blocksByBlockNumber.set(currentBlock.block, currentBlock)\n if (currentBlock.block === block) {\n return currentBlock\n }\n const { previous } = currentBlock\n if (isNull(previous)) break\n currentBlock = (await this.chainMap.get(previous))\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<WithStorageMeta<BlockBoundWitness>> {\n if (isDefined(this._currentHead)) return this._currentHead\n if (isDefined(this.params.head)) {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head)\n this._currentHead = newHead\n return newHead\n }\n throw new Error('Head is not set')\n }\n\n async next(block: number): Promise<WithStorageMeta<BlockBoundWitness> | undefined> {\n const currentBlock = block\n const nextBlockNumber = currentBlock + 1\n return await this.get(nextBlockNumber)\n }\n\n // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)\n // and then communicate via method name and documentation\n async previous(block: number | undefined = undefined, count: number = 1): Promise<WithStorageMeta<BlockBoundWitness>[]> {\n const results: WithStorageMeta<BlockBoundWitness>[] = []\n let currentBlock: WithStorageMeta<BlockBoundWitness> | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (isDefined(currentBlock) && (results.length < count)) {\n if (isBlockBoundWitnessWithHashStorageMeta(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock as BlockBoundWitness\n if (isNull(previous)) break\n const nextBlock = await this.chainMap.get(previous)\n currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock)\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`)\n }\n }\n return results\n }\n\n async updateHead(head: BlockBoundWitness): Promise<void> {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head)\n this._currentHead = newHead\n void this.emit('headUpdated', { blocks: [newHead] })\n }\n\n private async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head: BlockBoundWitness): Promise<WithStorageMeta<BlockBoundWitness>> {\n const hash = await PayloadBuilder.hash(head)\n const stored = (await this.chainMap.get(hash))\n const newHead = asBlockBoundWitnessWithStorageMeta(stored)\n if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`)\n return newHead\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress, toEthAddress } from '@xylabs/hex'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { ChainService } from '@xyo-network/xl1-protocol'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface EvmChainServiceParams extends BaseServiceParams {\n contract: StakedXyoChain\n id: Address\n runner: ContractRunner\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\nexport class EvmChainService extends BaseService<EvmChainServiceParams> implements ChainService {\n get chainId(): Address {\n return assertEx(this.params.id)\n }\n\n get contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(this.chainId),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n get runner(): ContractRunner {\n return assertEx(this.params.runner)\n }\n\n async active(): Promise<bigint> {\n return await this.contract.active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await this.contract.activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await this.contract.activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await this.contract.addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await this.contract.forkedAtBlockNumber()\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await this.contract.forkedAtHash()\n }\n\n async forkedChainId(): Promise<Address> {\n return toAddress(await this.contract.forkedChainId())\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await this.contract.minWithdrawalBlocks()\n }\n\n async pending(): Promise<bigint> {\n return await this.contract.pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await this.contract.pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await this.contract.removeStake(slot)\n await result.wait()\n return true\n }\n\n async rewardsContract(): Promise<string> {\n return await this.contract.rewardsContract()\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await this.contract.stakingTokenAddress()\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await this.contract.withdrawStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawn(): Promise<bigint> {\n return await this.contract.withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await this.contract.withdrawnByStaker(getAddress(staker))\n }\n}\n","import type { Address } from '@xylabs/hex'\nimport { ZERO_ADDRESS } from '@xylabs/hex'\nimport type { ChainService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface MemoryChainServiceParams extends BaseServiceParams {}\n\n/**\n * A class that represents a chain stake as backed in memory\n */\nexport class MemoryChainService extends BaseService<MemoryChainServiceParams> implements ChainService {\n protected _simulatedStake: bigint = 1n\n\n get chainId(): Address {\n return ZERO_ADDRESS\n }\n\n async active(): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaked(_staked: Address): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaker(_address: string): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async addStake(_staked: string, _amount: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n override createHandler(): void {\n const { minStake } = this.params.config.producer\n this._simulatedStake = BigInt(minStake)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedChainId(): Promise<Address> {\n return await Promise.resolve(ZERO_ADDRESS)\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await Promise.resolve(1n)\n }\n\n async pending(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async pendingByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async removeStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async rewardsContract(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async withdrawStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async withdrawn(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async withdrawnByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { Promisable } from '@xylabs/promise'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n BlockBoundWitness,\n BlockRewardService,\n ChainId,\n ElectionService,\n HydratedBlockStateValidationFunctionV2,\n SignedHydratedTransactionWithStorageMeta,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n account: AccountInstance\n chainArchivist: ReadArchivist\n chainId: ChainId\n electionService: ElectionService\n pendingBundledTransactionsArchivist: ArchivistInstance\n rewardService: BlockRewardService\n stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunctionV2\n}\n\n@creatable()\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends BaseService<TParams> implements Validator {\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 chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\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 rewardService() {\n return assertEx(this.params.rewardService, () => 'rewardService is required')\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.chainArchivist.get([tx._hash])).length > 0) 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 { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { Address, Hash } from '@xylabs/hex'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type {\n ChainBlockNumberIteratorService, ChainStakeViewer, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { BlockBoundWitness, ElectionService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n chainIterator?: ChainBlockNumberIteratorService\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatable()\nexport class BaseElectionService extends BaseService<BaseElectionServicesParams> implements ElectionService {\n get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'No chain iterator')\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: WithHashStorageMeta<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 })\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 { creatable } from '@xylabs/creatable'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseNetworkStakeStepRewardService extends BaseService<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[bigint, bigint]> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [bigint, bigint]>> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n}\n","import { ValueType } from '@opentelemetry/api'\nimport { filterAs, filterAsync } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Hash } from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock } from '@xyo-network/chain-protocol'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitnessWithHashStorageMeta, ChainId, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta, PendingTransactionsService,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport { TransactionJsonSchemaValidator, validateTransaction } from '@xyo-network/xl1-validation'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist?: ArchivistInstance\n chainId?: ChainId\n pendingBundledTransactionsArchivist?: ArchivistInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n}\n\n@creatable()\nexport class BasePendingTransactionsService extends BaseService<BasePendingTransactionsServiceParams> implements PendingTransactionsService {\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainId() {\n return assertEx(this.params.chainId, () => 'No chain id')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n async getPendingTransactions(head: Hash, limit: number): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), asBlockBoundWitnessWithHashStorageMeta)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(lastHead.block + 1))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), asBlockBoundWitnessWithHashStorageMeta)\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(lastHead.block + 1))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: number) =>\n ([txBw]: SignedHydratedTransactionWithStorageMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: number) =>\n ([txBw]: SignedHydratedTransactionWithStorageMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { asTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithStorageMeta | undefined> => {\n const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)\n const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withStorageMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/hex'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithStorageMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithStorageMeta) => {\n const payloads = flattenHydratedTransaction(transaction).flatMap(p => PayloadBuilder.omitStorageMeta(p))\n return new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema })\n .fields({ payloads, root })\n .build()\n}\n","import { filterAs } from '@xylabs/array'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { asOptionalBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContains } from '@xyo-network/boundwitness-validator'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type {\n BlockBoundWitness, ChainStakeIntent, Intent,\n} from '@xyo-network/xl1-protocol'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'\n\nexport const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness, archivist: ArchivistInstance, intent: Intent): Promise<ChainStakeIntent[]> => {\n // Get payloads in block\n const blockData = await archivist.get(block.payload_hashes)\n // Filter Payloads in block to BoundWitnesses\n const bwsFromBlock = filterAs(blockData, asOptionalBoundWitness)\n // Filter to BoundWitnesses with StakeIntent payloads\n const bwsFromBlockWithDeclarations = bwsFromBlock.filter(bw => payloadSchemasContains(bw, ChainStakeIntentSchema))\n // Filter to only valid signed BWs\n const validBlockBwsWithDeclarations = await filterToValidSignedBoundWitnesses(bwsFromBlockWithDeclarations)\n return (await Promise.all(validBlockBwsWithDeclarations.map(async (bw) => {\n // Get staked intent hashes from signed declarations\n const stakeIntentHashes = validBlockBwsWithDeclarations\n .flatMap(mapBoundWitnessToStakeIntentHashes)\n .filter(exists)\n // Get staked intent payloads\n const payloads = await archivist.get(stakeIntentHashes)\n // Filter payloads to staked intents\n const stakeIntents = filterAs(payloads, asChainStakeIntent)\n // that are producers\n .filter(p => p.intent === intent)\n // where the issuer of the intent is also the signer of this BW\n .filter(p => bw.addresses.includes(p.from))\n\n return stakeIntents\n }))).flat()\n}\n\nconst filterToValidSignedBoundWitnesses = async (bws: BoundWitness[]): Promise<BoundWitness[]> => {\n const validBwIndexes = await Promise.all(bws.map(bw => BoundWitnessWrapper.parse(bw).getValid()))\n return bws.filter((_, index) => validBwIndexes[index])\n}\n\nconst mapBoundWitnessToStakeIntentHashes = (bw: BoundWitness): (Hash | undefined)[] => {\n return bw.payload_schemas.map((schema, index) => schema === ChainStakeIntentSchema ? bw.payload_hashes[index] : undefined)\n}\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport {\n Address, asAddress, Hash,\n} from '@xylabs/hex'\nimport { isUndefined } from '@xylabs/typeof'\nimport { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n analyzeChain, ChainStakeIntentAnalyzer,\n isChainSummaryStakeIntent,\n} from '@xyo-network/chain-analyze'\nimport {\n DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS,\n findFirstMatching, IntervalMap,\n SerializedIntervalMap,\n} from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { EventingChainBlockNumberIteratorService, Intent } from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta,\n asChainIndexingServiceStateWithStorageMeta,\n asChainStakeIntent, ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n isChainIndexingServiceState,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIterator?: EventingChainBlockNumberIteratorService\n chainStakeViewer?: ChainStakeViewer\n stakeIntentStateArchivist?: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\nconst STATE_PERSISTENCE_INTERVAL = 60n\n\nconst ACTIVE_STAKE_TTL = 1000 * 60 * 60 * 2 // 2 hours in milliseconds\nconst NO_ACTIVE_STAKE_TTL = 1000 * 2 // 2 seconds in milliseconds\nconst STAKE_CACHE_MAX_ENTRIES = 10_000\n\n@creatable()\nexport class XyoStakeIntentService extends BaseService<XyoStakeIntentServiceParams> implements StakeIntentService {\n // TODO: Use hash instead of block number to handle chain reorgs\n protected _lastIndexedBlockHash: Hash | undefined = undefined\n // TODO: Interval tree per declaration (bank, validator, etc.)\n // NOTE: Ideally move to DataIntervalTree to handle declared\n // ranges as it enables range queries in O(min(n, k * log n)) time,\n // where k is the number of intervals in the output list time\n // Currently using set based because it's simpler, equivalent\n // in performance for small sets, and (most importantly) easily\n // persisted so we can recover state on restart.\n protected _producers: IntervalMap<Address> = new IntervalMap()\n protected _stakeCache = new LRUCache<Address, bigint>({ max: STAKE_CACHE_MAX_ENTRIES })\n protected _updateMutex = new Mutex()\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist not set')\n }\n\n override async createHandler() {\n this.chainIterator.on('headUpdated', async () => {\n await this.updateIndex()\n })\n const head = await this.chainIterator.head()\n if (isUndefined(head)) return\n const headHash = await PayloadBuilder.hash(head)\n await this.recoverState(headHash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)\n const results = this._producers.get(address)\n return results ?? []\n }\n\n async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {\n return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {\n assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n const currentBlock = assertEx(asBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)\n const currentBlockNum = currentBlock.block\n // Find last state before current head (in case of rollback, we indexed past it on an uncle chain, etc.)\n const opts: ArchivistNextOptions = { ...DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS }\n while (true) {\n const predicate = (p: WithStorageMeta<Payload>) => {\n const state = asChainIndexingServiceStateWithStorageMeta(p)\n return state ? true : false\n }\n const state = await findFirstMatching(this.stakeIntentStateArchivist, predicate, opts)\n if (isChainIndexingServiceState<SerializedIntervalMap>(state)) {\n const indexed = (await this.chainArchivist.get([state.endBlockHash]))?.[0]\n const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed)\n if (indexedBlock) {\n const indexedBlockNum = indexedBlock.block\n if (indexedBlockNum <= currentBlockNum) {\n const data = state.state as SerializedIntervalMap\n this._producers = new IntervalMap(data)\n this._lastIndexedBlockHash = indexedBlock._hash\n break\n }\n }\n } else {\n // No state found, start from genesis\n break\n }\n opts.open = true\n }\n }\n\n private async updateIndex(displayProgress = false): Promise<void> {\n if (this._updateMutex.isLocked()) {\n return\n }\n await this._updateMutex.runExclusive(async () => {\n return await this.spanAsync('updateIndex', async () => {\n const currentHead = await this.chainIterator.head()\n if (isUndefined(currentHead)) return\n const currentHeadHash = await PayloadBuilder.hash(currentHead)\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n })\n })\n }\n}\n","import { creatable } from '@xylabs/creatable'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n StepIdentity,\n StepStakeService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\n@creatable()\nexport class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeService {\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method not implemented.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { asHash, Hash } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n asTimePayload,\n EventingChainBlockNumberIteratorService, TimeDomain, TimePayload, TimeSchema,\n TimeSyncServiceV2,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface TimeProvider {\n currentTime(): Promise<[string, number]>\n}\n\nexport interface BaseTimeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncServiceV2 {\n get chainArchivist() {\n return this.params.chainArchivist\n }\n\n get chainIterator() {\n return this.params.chainIterator\n }\n\n get ethProvider() {\n return this.params.ethProvider\n }\n\n async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {\n switch (fromDomain) {\n case 'xl1': {\n const block = assertEx(await this.chainIterator.get(from), () => 'Block not found')\n const timeSchemaIndex = block.payload_schemas.indexOf(TimeSchema)\n const hash = timeSchemaIndex === -1 ? undefined : block.payload_hashes[timeSchemaIndex]\n const [payload] = hash === undefined ? [] : await this.chainArchivist.get([hash])\n const timePayload = asTimePayload(payload)\n if (timePayload === undefined) return 0\n switch (toDomain) {\n case 'xl1': {\n return timePayload.xl1 ?? 0\n }\n case 'epoch': {\n return timePayload.epoch ?? 0\n }\n case 'ethereum': {\n return timePayload.ethereum ?? 0\n }\n default: {\n throw new Error(`Unsupported to toDomain: ${toDomain}`)\n }\n }\n }\n default: {\n throw new Error(`Unsupported from fromDomain: ${fromDomain}`)\n }\n }\n }\n\n async currentTime(domain: TimeDomain): Promise<[string, number]> {\n switch (domain) {\n case 'xl1': {\n return ['xl1', (await this.chainIterator.head()).block]\n }\n case 'epoch': {\n return ['epoch', Date.now()]\n }\n case 'ethereum': {\n return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]\n }\n default: {\n throw new Error(`Unknown time domain: ${domain}`)\n }\n }\n }\n\n async currentTimeAndHash(domain: TimeDomain): Promise<[number, Hash | null]> {\n switch (domain) {\n case 'xl1': {\n const head = await this.chainIterator.head()\n return [head.block, await PayloadBuilder.hash(head)]\n }\n case 'epoch': {\n return [Date.now(), null]\n }\n case 'ethereum': {\n const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')\n const blockNumber = (await provider.getBlockNumber()) ?? 0\n const block = await provider.getBlock(blockNumber)\n const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)\n return [blockNumber, blockHash]\n }\n default: {\n throw new Error(`Unknown time domain: ${domain}`)\n }\n }\n }\n\n currentTimePayload(): Promisable<TimePayload> {\n throw new Error('Method not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","findMostRecentBlock","LruCacheMap","StepSizes","readPayloadMapFromStore","Semaphore","creatable","spanRootAsync","AttoXL1","balancesSummary","AbstractCreatable","creatable","spanRoot","spanRootAsync","Mutex","BaseService","AbstractCreatable","singletonInitMutex","Mutex","singletons","globalThis","initSingleton","params","name","Error","runExclusive","create","paramsHandler","span","fn","spanRoot","tracer","spanAsync","spanRootAsync","sync","_head","BaseAccountableService","creatableService","constructor","BaseAccountBalanceService","BaseService","balances","head","address","spanRootAsync","summary","balancesSummary","params","context","result","addr","summaryBalance","AttoXL1","accountBalancesServiceFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","chainMap","readPayloadMapFromStore","headFunc","head","findMostRecentBlock","assertEx","_hash","service","BaseAccountBalanceService","create","context","store","stepSemaphores","StepSizes","map","Semaphore","assertEx","findMostRecentBlock","LruCacheMap","StepSizes","readPayloadMapFromStore","Semaphore","creatable","spanRootAsync","AttoXL1","transfersSummary","BaseAccountTransfersService","BaseService","transfer","head","address","transfers","AttoXL1","addresses","spanRootAsync","summary","transfersSummary","params","context","result","addr","summaryBalance","accountTransfersServiceFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","chainMap","readPayloadMapFromStore","headFunc","head","findMostRecentBlock","assertEx","_hash","service","BaseAccountTransfersService","create","context","store","stepSemaphores","StepSizes","map","Semaphore","assertEx","creatable","exists","hexToBigInt","toHex","isDefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","createDeclarationIntent","PayloadBuilder","asBlockBoundWitness","AttoXL1","BlockNumberSchema","defaultRewardRatio","TimeSchema","XYO_STEP_REWARD_ADDRESS","assertEx","hexFromBigInt","PayloadBuilder","TransferSchema","XYO_ZERO_ADDRESS","transactionRequiredGas","HydratedTransactionWrapper","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","_ts_decorate","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","BaseBlockProducerService","BaseService","_blockRewardDiviner","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","address","account","assertEx","params","balanceService","chainArchivist","chainId","electionService","pendingTransactionsService","rejectedTransactionsArchivist","rewardAddress","rewardService","stakeIntentService","time","validateHydratedBlockState","next","head","chain","leadersStart","Date","now","leaders","getCreatorCommitteeForNextBlock","leadersDuration","logger","warn","map","l","slice","join","includes","proposeNextValidBlock","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","create","blockRewardService","config","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockHex","toHex","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","producer","disableIntentRedeclaration","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","currentBlock","timeToProducerExpiration","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactionsStart","nextBlockTransactions","getPendingTransactions","_hash","nextBlockTransactionsDuration","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","timePayload","generateTimePayload","timeDuration","fundedNextBlockTransactions","fundedTransfers","filterByFunded","info","startBuild","stepRewardPoolBalance","balances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","startValidate","errors","accountBalance","message","rejectedTransactions","insert","txs","transfers","fundedTransactions","Promise","all","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","ethereum","ethHashOrNull","currentTimeAndHash","ethereumHash","TimeSchema","xl1","xl1Hash","epoch","$epoch","isDefined","heartbeatInterval","creatable","BaseBlockRewardService","BaseService","getRewardForBlock","_blockNumber","Error","assertEx","creatable","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","EvmBlockRewardService","BaseBlockRewardService","_contractAddress","chainService","assertEx","params","contractAddress","provider","createHandler","rewardsContract","ex","error","Error","message","getRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","calcBlockReward","assertEx","creatable","toFixedPoint","rewardFromBlockNumber","MemoryBlockRewardService","BaseBlockRewardService","rewardFromBlockNumber","creatorReward","assertEx","params","initialReward","initialStepReward","minRewardPerBlock","stepFactorDenominator","stepFactorNumerator","stepSize","paramsHandler","inParams","toFixedPoint","getRewardForBlock","blockNumber","assertEx","isDefined","isNull","isUndefined","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","isBlockBoundWitnessWithHashStorageMeta","LRUCache","ChainBlockNumberIterationService","BaseService","_blocksByBlockNumber","LRUCache","max","_currentHead","chainId","assertEx","chain","params","head","chainMap","get","block","cached","startingBlock","currentBlockHash","PayloadBuilder","hash","currentBlock","isDefined","asBlockBoundWitness","_hash","isBlockBoundWitnessWithHashStorageMeta","set","previous","isNull","Error","newHead","getBoundWitnessAsBlockBoundWitnessWithStorageMeta","next","nextBlockNumber","undefined","count","results","length","push","nextBlock","asBlockBoundWitnessWithStorageMeta","updateHead","emit","blocks","stored","isUndefined","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","getAddress","EvmChainService","BaseService","chainId","assertEx","params","id","contract","undefined","StakedXyoChainFactory","connect","toEthAddress","runner","active","activeByStaked","staked","activeByAddressStaked","getAddress","activeByStaker","address","addStake","amount","result","wait","forkedAtBlockNumber","forkedAtHash","forkedChainId","toAddress","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","ZERO_ADDRESS","MemoryChainService","BaseService","_simulatedStake","chainId","ZERO_ADDRESS","active","Promise","resolve","activeByStaked","_staked","activeByStaker","_address","addStake","_amount","createHandler","minStake","params","config","producer","BigInt","forkedAtBlockNumber","forkedAtHash","forkedChainId","minWithdrawalBlocks","pending","pendingByStaker","_staker","removeStake","_slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","assertEx","creatable","XyoValidator","BaseService","address","account","assertEx","params","chainArchivist","chainInfo","chainId","electionService","pendingBundledTransactionsArchivist","rewardService","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","get","_hash","length","Promise","resolve","assertEx","creatable","hexToLast4BytesInt","shuffleWithSeed","BaseElectionService","BaseService","chainIterator","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","creatable","BaseNetworkStakeStepRewardService","BaseService","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","ValueType","filterAs","filterAsync","assertEx","creatable","exists","forget","isDefined","isUndefined","MemoryArchivist","findMostRecentBlock","asBlockBoundWitnessWithHashStorageMeta","isTransactionBoundWitnessWithStorageMeta","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asTransactionBoundWitnessWithStorageMeta","bundledPayloadToHydratedTransaction","payload","withStorageMeta","PayloadBuilder","addStorageMeta","payloads","tx","asTransactionBoundWitnessWithStorageMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","BaseService","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","chainId","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","getPendingTransactions","head","limit","spanAsync","runExclusive","lastHead","filterAs","get","asBlockBoundWitnessWithHashStorageMeta","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","next","order","at","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","block","txValidationResults","validateTransaction","validTransactions","errors","push","logger","log","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","warn","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","filterAs","exists","asOptionalBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filterAs","asOptionalBoundWitness","bwsFromBlockWithDeclarations","filter","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","filterAs","assertEx","creatable","asAddress","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainIndexingServiceStateWithStorageMeta","asChainStakeIntent","ChainIndexingServiceStateSchema","isChainIndexingServiceState","readPayloadMapFromStore","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","chainArchivist","assertEx","params","chainIterator","chainStakeViewer","stakeIntentStateArchivist","createHandler","on","updateIndex","head","isUndefined","headHash","PayloadBuilder","hash","recoverState","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","minStake","config","producer","BigInt","isStakedForBlock","includes","startHandler","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","currentBlock","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","_hash","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","creatable","BaseStepStakeService","BaseService","stepStake","_step","Error","stepStakeForAddress","_address","assertEx","creatable","asHash","PayloadBuilder","asTimePayload","TimeSchema","BaseTimeSyncService","BaseService","chainArchivist","params","chainIterator","ethProvider","convertTime","fromDomain","toDomain","from","block","assertEx","get","timeSchemaIndex","payload_schemas","indexOf","TimeSchema","hash","undefined","payload_hashes","payload","timePayload","asTimePayload","xl1","epoch","ethereum","Error","currentTime","domain","head","Date","now","getBlockNumber","currentTimeAndHash","PayloadBuilder","provider","blockNumber","getBlock","blockHash","asHash","currentTimePayload"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/chain-services",
4
- "version": "1.15.22",
4
+ "version": "1.15.23",
5
5
  "description": "XYO Layer One SDK Services",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -37,48 +37,48 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@opentelemetry/api": "~1.9.0",
40
- "@xylabs/array": "~5.0.16",
41
- "@xylabs/assert": "~5.0.16",
42
- "@xylabs/creatable": "~5.0.16",
43
- "@xylabs/decimal-precision": "~5.0.16",
44
- "@xylabs/events": "~5.0.16",
45
- "@xylabs/exists": "~5.0.16",
46
- "@xylabs/forget": "~5.0.16",
47
- "@xylabs/hex": "~5.0.16",
48
- "@xylabs/promise": "~5.0.16",
49
- "@xylabs/telemetry": "~5.0.16",
50
- "@xylabs/typeof": "~5.0.16",
51
- "@xyo-network/account-model": "~5.1.14",
52
- "@xyo-network/archivist-memory": "~5.1.14",
53
- "@xyo-network/archivist-model": "~5.1.14",
54
- "@xyo-network/boundwitness-model": "~5.1.14",
55
- "@xyo-network/boundwitness-validator": "~5.1.14",
56
- "@xyo-network/boundwitness-wrapper": "~5.1.14",
57
- "@xyo-network/chain-analyze": "~1.15.22",
58
- "@xyo-network/chain-modules": "~1.15.22",
59
- "@xyo-network/chain-protocol": "~1.15.22",
60
- "@xyo-network/chain-utils": "~1.15.22",
61
- "@xyo-network/payload-builder": "~5.1.14",
62
- "@xyo-network/payload-model": "~5.1.14",
40
+ "@xylabs/array": "~5.0.17",
41
+ "@xylabs/assert": "~5.0.17",
42
+ "@xylabs/creatable": "~5.0.17",
43
+ "@xylabs/decimal-precision": "~5.0.17",
44
+ "@xylabs/events": "~5.0.17",
45
+ "@xylabs/exists": "~5.0.17",
46
+ "@xylabs/forget": "~5.0.17",
47
+ "@xylabs/hex": "~5.0.17",
48
+ "@xylabs/promise": "~5.0.17",
49
+ "@xylabs/telemetry": "~5.0.17",
50
+ "@xylabs/typeof": "~5.0.17",
51
+ "@xyo-network/account-model": "~5.1.15",
52
+ "@xyo-network/archivist-memory": "~5.1.15",
53
+ "@xyo-network/archivist-model": "~5.1.15",
54
+ "@xyo-network/boundwitness-model": "~5.1.15",
55
+ "@xyo-network/boundwitness-validator": "~5.1.15",
56
+ "@xyo-network/boundwitness-wrapper": "~5.1.15",
57
+ "@xyo-network/chain-analyze": "~1.15.23",
58
+ "@xyo-network/chain-modules": "~1.15.23",
59
+ "@xyo-network/chain-protocol": "~1.15.23",
60
+ "@xyo-network/chain-utils": "~1.15.23",
61
+ "@xyo-network/payload-builder": "~5.1.15",
62
+ "@xyo-network/payload-model": "~5.1.15",
63
63
  "@xyo-network/typechain": "~4.0.10",
64
- "@xyo-network/xl1-protocol": "~1.12.84",
65
- "@xyo-network/xl1-protocol-sdk": "~1.15.22",
66
- "@xyo-network/xl1-validation": "~1.15.22",
67
- "@xyo-network/xl1-wrappers": "~1.15.22",
64
+ "@xyo-network/xl1-protocol": "~1.12.89",
65
+ "@xyo-network/xl1-protocol-sdk": "~1.15.23",
66
+ "@xyo-network/xl1-validation": "~1.15.23",
67
+ "@xyo-network/xl1-wrappers": "~1.15.23",
68
68
  "async-mutex": "~0.5.0",
69
69
  "ethers": "6.15.0",
70
70
  "lru-cache": "~11.2.2"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@types/node": "~24.9.2",
74
- "@xylabs/delay": "~5.0.16",
74
+ "@xylabs/delay": "~5.0.17",
75
75
  "@xylabs/ts-scripts-yarn3": "~7.1.8",
76
76
  "@xylabs/tsconfig": "~7.1.8",
77
- "@xylabs/vitest-extended": "~5.0.16",
78
- "@xyo-network/account": "~5.1.14",
79
- "@xyo-network/account-model": "~5.1.14",
80
- "@xyo-network/chain-validation": "~1.15.22",
81
- "@xyo-network/wallet": "~5.1.14",
77
+ "@xylabs/vitest-extended": "~5.0.17",
78
+ "@xyo-network/account": "~5.1.15",
79
+ "@xyo-network/account-model": "~5.1.15",
80
+ "@xyo-network/chain-validation": "~1.15.23",
81
+ "@xyo-network/wallet": "~5.1.15",
82
82
  "eslint": "^9.38.0",
83
83
  "tslib": "~2.8.1",
84
84
  "typescript": "~5.9.3",
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-statements */
1
2
  import { assertEx } from '@xylabs/assert'
2
3
  import { creatable } from '@xylabs/creatable'
3
4
  import { exists } from '@xylabs/exists'
@@ -130,7 +131,12 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
130
131
  async next(head: WithStorageMeta<BlockBoundWitness>): Promise<HydratedBlock | undefined> {
131
132
  // If the block is for another chain, ignore
132
133
  if (head.chain !== this.chainId) return
134
+ const leadersStart = Date.now()
133
135
  const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)
136
+ const leadersDuration = Date.now() - leadersStart
137
+ if (leadersDuration > 100) {
138
+ this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)
139
+ }
134
140
  // TODO: Should we propose block if creator committee is empty?
135
141
  // TODO: Handle the case where we're not the 1st leader but they're not responding
136
142
  // at a higher level than here as that's a network issue
@@ -184,7 +190,12 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
184
190
  // Calculate the next block components
185
191
  const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')
186
192
  const nextBlock = previousBlock + 1
193
+ const nextBlockTransactionsStart = Date.now()
187
194
  const nextBlockTransactions = await this.pendingTransactionsService.getPendingTransactions(head._hash, BaseBlockProducerService.DefaultBlockSize)
195
+ const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart
196
+ if (nextBlockTransactionsDuration > 200) {
197
+ this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`)
198
+ }
188
199
 
189
200
  const blockPayloads: AllowedBlockPayload[] = []
190
201
 
@@ -200,7 +211,12 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
200
211
  blockPayloads.push(...rewardTransferPayloads)
201
212
 
202
213
  const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)
214
+ const timeStart = Date.now()
203
215
  const timePayload = await this.generateTimePayload(head)
216
+ const timeDuration = Date.now() - timeStart
217
+ if (timeDuration > 100) {
218
+ this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)
219
+ }
204
220
 
205
221
  const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)
206
222
 
@@ -2,7 +2,7 @@ import { assertEx } from '@xylabs/assert'
2
2
  import { creatable } from '@xylabs/creatable'
3
3
  import { Address, Hash } from '@xylabs/hex'
4
4
  import { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'
5
- import { PayloadBuilder } from '@xyo-network/payload-builder'
5
+ import { WithHashStorageMeta } from '@xyo-network/payload-model'
6
6
  import type {
7
7
  ChainBlockNumberIteratorService, ChainStakeViewer, StakeIntentService,
8
8
  } from '@xyo-network/xl1-protocol'
@@ -31,11 +31,11 @@ export class BaseElectionService extends BaseService<BaseElectionServicesParams>
31
31
  return assertEx(this.params.stakeIntentService, () => 'No staked intent service')
32
32
  }
33
33
 
34
- async getCreatorCommitteeForNextBlock(current: BlockBoundWitness): Promise<Address[]> {
34
+ async getCreatorCommitteeForNextBlock(current: WithHashStorageMeta<BlockBoundWitness>): Promise<Address[]> {
35
35
  return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {
36
36
  const nextBlock = current.block + 1
37
37
  const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')
38
- const previousBlockHash = await PayloadBuilder.hash(current)
38
+ const previousBlockHash = current._hash
39
39
  return this.generateCreatorCommittee(candidates, previousBlockHash)
40
40
  })
41
41
  }