@xyo-network/chain-services 1.5.30 → 1.5.32

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.
@@ -489,7 +489,7 @@ XyoBlockRewardService = _ts_decorate4([
489
489
  import { assertEx as assertEx6 } from "@xylabs/assert";
490
490
  import { isDefined as isDefined2, isNull } from "@xylabs/typeof";
491
491
  import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
492
- import { asBlockBoundWitness as asBlockBoundWitness2, asOptionalBlockBoundWitness, isBlockBoundWitness } from "@xyo-network/xl1-protocol";
492
+ import { asBlockBoundWitness as asBlockBoundWitness2, isBlockBoundWitness } from "@xyo-network/xl1-protocol";
493
493
  import { LRUCache } from "lru-cache";
494
494
  var ChainBlockNumberIterationService = class extends BaseService {
495
495
  static {
@@ -553,7 +553,7 @@ var ChainBlockNumberIterationService = class extends BaseService {
553
553
  const nextBlock = await this.chainArchivist.get([
554
554
  previous
555
555
  ]);
556
- currentBlock = asOptionalBlockBoundWitness(nextBlock[0]);
556
+ currentBlock = asBlockBoundWitness2(nextBlock[0]);
557
557
  } else {
558
558
  const hash = PayloadBuilder3.hash(currentBlock);
559
559
  assertEx6(asBlockBoundWitness2(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
@@ -574,7 +574,6 @@ var ChainBlockNumberIterationService = class extends BaseService {
574
574
 
575
575
  // src/ChainValidator/XyoValidator.ts
576
576
  import { assertEx as assertEx7 } from "@xylabs/assert";
577
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
578
577
  function _ts_decorate5(decorators, target, key, desc) {
579
578
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
580
579
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -582,12 +581,6 @@ function _ts_decorate5(decorators, target, key, desc) {
582
581
  return c > 3 && r && Object.defineProperty(target, key, r), r;
583
582
  }
584
583
  __name(_ts_decorate5, "_ts_decorate");
585
- var addStorageMeta = /* @__PURE__ */ __name(async ([tx, payloads]) => {
586
- return [
587
- await PayloadBuilder4.addStorageMeta(tx),
588
- await PayloadBuilder4.addStorageMeta(payloads)
589
- ];
590
- }, "addStorageMeta");
591
584
  var XyoValidator = class extends BaseService {
592
585
  static {
593
586
  __name(this, "XyoValidator");
@@ -618,7 +611,7 @@ var XyoValidator = class extends BaseService {
618
611
  }
619
612
  // TODO: Move to validator and inherit this class from validator
620
613
  async validatePendingTransaction(hydratedTransaction) {
621
- const [tx] = await addStorageMeta(hydratedTransaction);
614
+ const [tx] = hydratedTransaction;
622
615
  if ((await this.chainArchivist.get([
623
616
  tx._hash
624
617
  ])).length > 0) return false;
@@ -632,7 +625,7 @@ XyoValidator = _ts_decorate5([
632
625
  // src/Election/XyoElectionService.ts
633
626
  import { assertEx as assertEx8 } from "@xylabs/assert";
634
627
  import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
635
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
628
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
636
629
  function _ts_decorate6(decorators, target, key, desc) {
637
630
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
638
631
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -664,7 +657,7 @@ var XyoElectionService = class extends BaseService {
664
657
  return await this.spanAsync("getCreatorCommitteeForNextBlock", async () => {
665
658
  const nextBlock = current.block + 1;
666
659
  const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, "producer");
667
- const previousBlockHash = await PayloadBuilder5.hash(current);
660
+ const previousBlockHash = await PayloadBuilder4.hash(current);
668
661
  return this.generateCreatorCommittee(candidates, previousBlockHash);
669
662
  });
670
663
  }
@@ -692,16 +685,16 @@ import { forget } from "@xylabs/forget";
692
685
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
693
686
  import { globalAttributes } from "@xyo-network/chain-telemetry";
694
687
  import { validateTransaction } from "@xyo-network/chain-validation";
695
- import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
696
- import { asOptionalTransactionBoundWitnessWithStorageMeta as asOptionalTransactionBoundWitnessWithStorageMeta2, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
688
+ import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
689
+ import { asTransactionBoundWitnessWithStorageMeta as asTransactionBoundWitnessWithStorageMeta2, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
697
690
  import { Mutex as Mutex2 } from "async-mutex";
698
691
 
699
692
  // src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
700
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
701
- import { asOptionalTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
693
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
694
+ import { asTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
702
695
  var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
703
- const withStorageMeta = await PayloadBuilder6.addStorageMeta(payload.payloads);
704
- const tx = asOptionalTransactionBoundWitnessWithStorageMeta(withStorageMeta.find((p) => p._hash === payload.root));
696
+ const withStorageMeta = await PayloadBuilder5.addStorageMeta(payload.payloads);
697
+ const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find((p) => p._hash === payload.root));
705
698
  if (tx) {
706
699
  return [
707
700
  tx,
@@ -711,16 +704,16 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
711
704
  }, "bundledPayloadToHydratedTransaction");
712
705
 
713
706
  // src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
714
- import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
707
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
715
708
  import { PayloadBundleSchema } from "@xyo-network/payload-model";
716
709
  import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
717
- var hydratedTransactionWithHashStorageMetaToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
710
+ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
718
711
  const root = transaction[0]._hash;
719
712
  return bundle(root, transaction);
720
- }, "hydratedTransactionWithHashStorageMetaToPayloadBundle");
713
+ }, "hydratedTransactionToPayloadBundle");
721
714
  var bundle = /* @__PURE__ */ __name((root, transaction) => {
722
- const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder7.omitStorageMeta(p));
723
- return new PayloadBuilder7({
715
+ const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder6.omitStorageMeta(p));
716
+ return new PayloadBuilder6({
724
717
  schema: PayloadBundleSchema
725
718
  }).fields({
726
719
  payloads,
@@ -886,7 +879,7 @@ var XyoPendingTransactionsService = class _XyoPendingTransactionsService extends
886
879
  return errors.length > 0 ? false : true;
887
880
  });
888
881
  if (validTransactions.length > 0) {
889
- const bundledTransactions = validTransactions.map((tx) => hydratedTransactionWithHashStorageMetaToPayloadBundle(tx));
882
+ const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
890
883
  await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
891
884
  }
892
885
  }, _XyoPendingTransactionsService.MutexPriority.InsertNewTransactions);
@@ -908,8 +901,8 @@ var XyoPendingTransactionsService = class _XyoPendingTransactionsService extends
908
901
  return await this.spanAsync(priority, async () => {
909
902
  return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
910
903
  const bundledTransactions = (await Promise.all(bundledPayloads.map(async (payload) => {
911
- const withStorageMeta = await PayloadBuilder8.addStorageMeta(payload.payloads);
912
- const tx = asOptionalTransactionBoundWitnessWithStorageMeta2(withStorageMeta.find((p) => p._hash === payload.root));
904
+ const withStorageMeta = await PayloadBuilder7.addStorageMeta(payload.payloads);
905
+ const tx = asTransactionBoundWitnessWithStorageMeta2(withStorageMeta.find((p) => p._hash === payload.root));
913
906
  return tx !== void 0 && payload._hash !== void 0 ? tx : void 0;
914
907
  }))).filter(exists2);
915
908
  await this.pendingBundledTransactionsLocalArchivist.delete(bundledTransactions.map((btx) => btx._hash));
@@ -927,7 +920,7 @@ import { exists as exists3 } from "@xylabs/exists";
927
920
  import { asOptionalBoundWitness } from "@xyo-network/boundwitness-model";
928
921
  import { payloadSchemasContains } from "@xyo-network/boundwitness-validator";
929
922
  import { BoundWitnessWrapper } from "@xyo-network/boundwitness-wrapper";
930
- import { asOptionalChainStakeIntent, ChainStakeIntentSchema as ChainStakeIntentSchema2 } from "@xyo-network/xl1-protocol";
923
+ import { asChainStakeIntent, ChainStakeIntentSchema as ChainStakeIntentSchema2 } from "@xyo-network/xl1-protocol";
931
924
  var getBlockSignedStakeDeclarations = /* @__PURE__ */ __name(async (block, archivist, intent) => {
932
925
  const blockData = await archivist.get(block.payload_hashes);
933
926
  const bwsFromBlock = filterAs(blockData, asOptionalBoundWitness);
@@ -936,7 +929,7 @@ var getBlockSignedStakeDeclarations = /* @__PURE__ */ __name(async (block, archi
936
929
  return (await Promise.all(validBlockBwsWithDeclarations.map(async (bw) => {
937
930
  const stakeIntentHashes = validBlockBwsWithDeclarations.flatMap(mapBoundWitnessToStakeIntentHashes).filter(exists3);
938
931
  const payloads = await archivist.get(stakeIntentHashes);
939
- const stakeIntents = filterAs(payloads, asOptionalChainStakeIntent).filter((p) => p.intent === intent).filter((p) => bw.addresses.includes(p.from));
932
+ const stakeIntents = filterAs(payloads, asChainStakeIntent).filter((p) => p.intent === intent).filter((p) => bw.addresses.includes(p.from));
940
933
  return stakeIntents;
941
934
  }))).flat();
942
935
  }, "getBlockSignedStakeDeclarations");
@@ -954,8 +947,8 @@ import { assertEx as assertEx10 } from "@xylabs/assert";
954
947
  import { asAddress } from "@xylabs/hex";
955
948
  import { analyzeChain as analyzeChain3, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
956
949
  import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
957
- import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/payload-builder";
958
- import { asChainIndexingServiceStateWithStorageMeta, asOptionalBlockBoundWitness as asOptionalBlockBoundWitness2, asOptionalBlockBoundWitnessWithStorageMeta, asOptionalChainStakeIntent as asOptionalChainStakeIntent2, ChainIndexingServiceStateSchema, isChainIndexingServiceState } from "@xyo-network/xl1-protocol";
950
+ import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
951
+ import { asBlockBoundWitness as asBlockBoundWitness3, asBlockBoundWitnessWithStorageMeta, asChainIndexingServiceStateWithStorageMeta, asChainStakeIntent as asChainStakeIntent2, ChainIndexingServiceStateSchema, isChainIndexingServiceState } from "@xyo-network/xl1-protocol";
959
952
  import { Mutex as Mutex3 } from "async-mutex";
960
953
  import { LRUCache as LRUCache2 } from "lru-cache";
961
954
  function _ts_decorate8(decorators, target, key, desc) {
@@ -1010,7 +1003,7 @@ var XyoStakeIntentService = class extends BaseService {
1010
1003
  }
1011
1004
  async createHandler() {
1012
1005
  const head = await this.chainIterator.head();
1013
- const headHash = await PayloadBuilder9.hash(head);
1006
+ const headHash = await PayloadBuilder8.hash(head);
1014
1007
  if (head?.block === void 0) return;
1015
1008
  await this.recoverState(headHash);
1016
1009
  await this.updateIndex(true);
@@ -1065,7 +1058,7 @@ var XyoStakeIntentService = class extends BaseService {
1065
1058
  }
1066
1059
  async persistState(current) {
1067
1060
  const state = this._producers.serialize();
1068
- const payload = new PayloadBuilder9({
1061
+ const payload = new PayloadBuilder8({
1069
1062
  schema: ChainIndexingServiceStateSchema
1070
1063
  }).fields({
1071
1064
  endBlockHash: current,
@@ -1076,7 +1069,7 @@ var XyoStakeIntentService = class extends BaseService {
1076
1069
  ]);
1077
1070
  }
1078
1071
  async recoverState(current) {
1079
- const currentBlock = assertEx10(asOptionalBlockBoundWitness2((await this.chainArchivist.get([
1072
+ const currentBlock = assertEx10(asBlockBoundWitness3((await this.chainArchivist.get([
1080
1073
  current
1081
1074
  ]))?.[0]), () => `Block ${current} not found`);
1082
1075
  const currentBlockNum = currentBlock.block;
@@ -1093,7 +1086,7 @@ var XyoStakeIntentService = class extends BaseService {
1093
1086
  const indexed = (await this.chainArchivist.get([
1094
1087
  state.endBlockHash
1095
1088
  ]))?.[0];
1096
- const indexedBlock = asOptionalBlockBoundWitnessWithStorageMeta(indexed);
1089
+ const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed);
1097
1090
  if (indexedBlock) {
1098
1091
  const indexedBlockNum = indexedBlock.block;
1099
1092
  if (indexedBlockNum <= currentBlockNum) {
@@ -1116,11 +1109,11 @@ var XyoStakeIntentService = class extends BaseService {
1116
1109
  await this._updateMutex.runExclusive(async () => {
1117
1110
  return await this.spanAsync("updateIndex", async () => {
1118
1111
  const currentHead = await this.chainIterator.head();
1119
- const currentHeadHash = await PayloadBuilder9.hash(currentHead);
1112
+ const currentHeadHash = await PayloadBuilder8.hash(currentHead);
1120
1113
  const result = await analyzeChain3(this.chainArchivist, [
1121
1114
  new ChainStakeIntentAnalyzer("producer")
1122
1115
  ], currentHeadHash, this._lastIndexedBlockHash);
1123
- const signedDeclarations = filterAs2(result.find(isChainSummaryStakeIntent)?.intents ?? [], asOptionalChainStakeIntent2);
1116
+ const signedDeclarations = filterAs2(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent2);
1124
1117
  if (currentHead.block === void 0) return;
1125
1118
  const currentHeadBlockNum = currentHead.block;
1126
1119
  if (displayProgress) this.logger?.info(`Updating index through 0x${currentHeadBlockNum}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/AccountBalance/XyoChainAccountBalanceService.ts","../../src/BaseService.ts","../../src/BlockProducer/XyoBlockProducer.ts","../../src/BlockProducer/generateTransactionFeeTransfers.ts","../../src/BlockReward/EvmBlockRewardService.ts","../../src/BlockReward/XyoBlockRewardService.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/XyoElectionService.ts","../../src/PendingTransactions/PendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/Staker/Evm/Evm.ts"],"sourcesContent":["import {\n type Address, type Hash, type Hex,\n isHash,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ChainSummaryBalances } from '@xyo-network/chain-analyze'\nimport {\n analyzeChain, BalanceAnalyzer, ChainSummaryBalancesSchema, isChainSummaryBalances,\n} from '@xyo-network/chain-analyze'\nimport { isPositiveBigInt } from '@xyo-network/chain-protocol'\nimport { type AccountBalanceService, isBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const accountBalanceServiceFromArchivist = async (archivist: ArchivistInstance, head?: Hash): Promise<AccountBalanceService> => {\n let allAddressesBalances: ChainSummaryBalances = {\n schema: ChainSummaryBalancesSchema, balances: {}, firstBlock: null, lastBlock: null,\n }\n\n const result: AccountBalanceService = {\n getBalance: (address: Address): Hex => {\n if (allAddressesBalances === undefined) {\n return '00'\n }\n const signedValue = allAddressesBalances.balances[address] ?? { positive: '00' }\n return isPositiveBigInt(signedValue) ? signedValue.positive : '00'\n },\n getBalances: (): Record<Address, Hex> => {\n return Object.fromEntries(Object.entries(allAddressesBalances.balances).map(([key, value]) => ([key, isPositiveBigInt(value) ? value.positive : '0'])))\n },\n name: 'ArchivistAccountBalanceService',\n async sync(head: Hash): Promise<void> {\n const analysis = await analyzeChain(\n archivist,\n [new BalanceAnalyzer()],\n head,\n null,\n -1n,\n )\n allAddressesBalances = analysis.find(isChainSummaryBalances) ?? {\n schema: ChainSummaryBalancesSchema, balances: {}, firstBlock: null, lastBlock: null,\n }\n return await Promise.resolve()\n },\n }\n\n if (isHash(head)) {\n await result.sync(head)\n }\n\n archivist.on('inserted', ({ payloads }) => {\n const block = payloads.find(p => isBlockBoundWitnessWithStorageMeta(p))\n if (isDefined(block)) {\n void result.sync(block._hash)\n }\n })\n\n return result\n}\n","import { assertEx } from '@xylabs/assert'\nimport {\n Address, Hash, Hex,\n toHex,\n} from '@xylabs/hex'\nimport {\n analyzeChain, BalanceAnalyzer, ChainSummaryBalances, ChainSummaryBalancesSchema, isChainSummaryBalances,\n} from '@xyo-network/chain-analyze'\nimport { SignedBigInt, toPositiveBigInt } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n AccountBalanceService, BaseServiceParams,\n ChainServiceCollection,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport type ChainAccountBalanceServiceParams = BaseServiceParams<Partial<Pick<ChainServiceCollection, 'chainArchivist'>>>\n\n@creatableService()\nexport class XyoChainAccountBalanceService extends BaseService<ChainAccountBalanceServiceParams> implements AccountBalanceService {\n private _balances: Partial<Record<Address, SignedBigInt>> = {}\n /**\n * The most recent head that was indexed to\n */\n private _firstBlock: Hash | null = null\n\n /**\n * The oldest block that was indexed through\n */\n private _lastBlock: Hash | null = null\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\n }\n\n getBalance(address: Address): Hex {\n return toPositiveBigInt(this._balances[address] ?? { positive: toHex(0n) }).positive\n }\n\n getBalances(): Record<Address, Hex> {\n const result: Record<Address, Hex> = {}\n const entries = Object.entries(this._balances) as [Address, SignedBigInt][]\n for (const [address, balance] of entries) {\n result[address] = toPositiveBigInt(balance).positive\n }\n return result\n }\n\n async sync(head: Hash): Promise<void> {\n // Create starting balances from the current balances\n const startingBalances = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n .fields({\n balances: this._balances,\n firstBlock: this._firstBlock,\n lastBlock: this._lastBlock,\n })\n .build()\n\n // Calculate the balances for each address through the last indexed block based on the current balances\n const analysis = await analyzeChain(\n this.chainArchivist,\n [new BalanceAnalyzer(undefined, undefined, startingBalances)],\n head,\n this._firstBlock,\n )\n // Find the balances for all addresses\n const allAddressesBalances = analysis.find(isChainSummaryBalances)\n\n // Return if no balances were found (nothing to index)\n if (allAddressesBalances === undefined) return\n\n // Merge to existing balances map\n this._balances = { ...this._balances, ...allAddressesBalances.balances }\n\n // Update first indexed block\n this._firstBlock = allAddressesBalances.firstBlock\n // Update last indexed block\n if (this._lastBlock === null) this._lastBlock = allAddressesBalances.lastBlock\n }\n}\n","import type { EventData } from '@xylabs/events'\nimport { BaseEmitter } from '@xylabs/events'\nimport type { Promisable } from '@xylabs/promise'\nimport { span, spanAsync } from '@xylabs/telemetry'\nimport type {\n BaseAccountableServiceParams, BaseServiceParams, Service,\n} from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData> extends BaseEmitter<Partial<TParams>, TEventData> {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n get name() {\n return this.constructor.name\n }\n\n static async create<TService extends BaseService<TParams>, TParams extends BaseServiceParams = TService['params']>(\n this: CreatableService<TService>,\n params: Partial<TParams>,\n ): Promise<TService> {\n const result = new this(params)\n if (result.name === 'BaseService') throw new Error('Cannot create BaseService')\n await result.createHandler()\n return result\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: 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 createHandler(): Promisable<void> {\n return\n }\n\n span<T>(name: string, fn: () => T): T {\n return span(name, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanAsync(name, fn, this.tracer)\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 Service {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params: 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 { exists } from '@xylabs/exists'\nimport {\n Address, hexToBigInt, toHex,\n} from '@xylabs/hex'\nimport { isUndefined } from '@xylabs/typeof'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n AccountBalanceService,\n AllowedBlockPayload, asBlockBoundWitness, BlockBoundWitness, BlockNumber, BlockNumberSchema, BlockProducerService, ChainStakeIntent, ChainStakeIntentSchema,\n HydratedBlock, PendingTransactionsService, StakeIntentService, Transfer,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } 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_RESTAKE_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_RESTAKE_WINDOW = 500n\n\nexport interface XyoBlockProducerParams extends XyoValidatorParams {\n balanceService: AccountBalanceService\n pendingTransactionsService: PendingTransactionsService\n rejectedTransactionsArchivist: ArchivistInstance\n rewardAddress: Address\n}\n\n@creatableService()\nexport class XyoBlockProducer extends BaseService<XyoBlockProducerParams> implements BlockProducerService {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\n\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\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 chainInfo() {\n return assertEx(this.params.chainInformation, () => 'chainInfo 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 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.chainInfo.id) 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?.[0] !== this.address) return\n return this.proposeNextValidBlock(head)\n }\n\n protected async getBlockRewardTransfer(block: number): Promise<Transfer | undefined> {\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: 50,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n const blockHex = assertEx(toHex(block), () => 'Failed to convert block to hex')\n const blockId = new PayloadBuilder<BlockNumber>({ schema: BlockNumberSchema }).fields({ block: blockHex }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n const [reward] = rewards\n return reward\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns\n */\n protected async getProducerRedeclaration(head: WithStorageMeta<BlockBoundWitness>): Promise<ChainStakeIntent | undefined> {\n const redeclareIntent = process.env.XYO_PRODUCER_REDECLARE_INTENT\n if (isUndefined(redeclareIntent)) return\n // Decide if we need to redeclare\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 > XYO_PRODUCER_RESTAKE_WINDOW) return\n // Create redeclaration\n const intent = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from: this.address,\n intent: 'producer',\n nbf: currentBlock,\n exp: currentBlock + XYO_PRODUCER_RESTAKE_DURATION,\n }).build()\n return intent\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, XyoBlockProducer.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 and no payloads, we don't need to create a block\n if (blockPayloads.length === 0 && nextBlockTransactions.length === 0) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayload = await this.getBlockRewardTransfer(nextBlock)\n if (rewardTransferPayload) blockPayloads.push(rewardTransferPayload)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n\n const fundedTransfers: Transfer[] = []\n const fundedNextBlockTransactions = nextBlockTransactions.map((tx) => {\n const transfer: Transfer | undefined = transactionTransfers.find(txTransfer => txTransfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00'), 0n)\n if (validateBalances) {\n if (hexToBigInt(this.balanceService.getBalance(transfer.from)) >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }).filter(exists)\n blockPayloads.push(...fundedTransfers)\n\n // Build the block\n const block = await buildBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account])\n this.logger?.warn(`buildBlock: ${block[0].block} with ${block[1].length} payloads`)\n const errors = await this.validateHydratedBlockState(block, this.chainInfo.id, { accountBalance: this.balanceService })\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","import { assertEx } from '@xylabs/assert'\nimport { type Address, hexFromBigInt } from '@xylabs/hex'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { HydratedTransactionWrapper } from '@xyo-network/chain-wrappers'\nimport type {\n HydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: HydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(tx => HydratedTransactionWrapper.parse(tx)))\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 { assertEx } from '@xylabs/assert'\nimport { toEthAddress } from '@xyo-network/chain-ethereum'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport {\n BaseAccountableServiceParams, BlockRewardService, ChainService,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers/providers'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface EvmBlockRewardServiceParams extends BaseAccountableServiceParams {\n chainService?: ChainService\n provider?: Provider\n}\n\n@creatableService<EvmBlockRewardService>()\nexport class EvmBlockRewardService extends BaseService<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 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 { toFixedPoint } from '@xylabs/decimal-precision'\nimport { Promisable } from '@xylabs/promise'\nimport { rewardFromBlockNumber } from '@xyo-network/chain-protocol'\nimport { BaseServiceParams, BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoBlockRewardServiceParams extends BaseServiceParams {\n creatorReward?: bigint\n initialStepReward?: bigint\n minRewardPerBlock?: bigint\n stepFactorDenominator?: bigint\n stepFactorNumerator?: bigint\n stepSize?: bigint\n}\n\n@creatableService()\nexport class XyoBlockRewardService extends BaseService<XyoBlockRewardServiceParams> implements BlockRewardService {\n protected readonly rewardFromBlockNumber = rewardFromBlockNumber(18)\n\n constructor(\n {\n creatorReward = toFixedPoint(20_000_000_000n),\n initialStepReward = toFixedPoint(3000n),\n minRewardPerBlock = toFixedPoint(30n),\n stepFactorDenominator = 100n,\n stepFactorNumerator = 90n,\n stepSize = 1_000_000n,\n }: Partial<XyoBlockRewardServiceParams> = {},\n ) {\n super({\n initialStepReward, minRewardPerBlock, stepSize, stepFactorDenominator, stepFactorNumerator, creatorReward,\n })\n }\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 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 { BaseParams } from '@xylabs/base'\nimport { isDefined, isNull } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BlockBoundWitness, ChainIdentification,\n ChainIteratorEventData,\n EventingChainBlockNumberIterator,\n XyoChainIteratorParams,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asOptionalBlockBoundWitness,\n isBlockBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorEventData> implements EventingChainBlockNumberIterator {\n protected _blocksByBlockNumber = new LRUCache<number, BlockBoundWitness>({ max: 10_000 })\n\n get chainArchivist(): ArchivistInstance { return assertEx(this.params.chainArchivist) }\n\n get chainIdentification(): ChainIdentification { return { id: assertEx(this.params.head?.chain) } }\n\n async get(block: number): Promise<BlockBoundWitness> {\n const head = await this.head()\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.chainArchivist.get([currentBlockHash])).at(0)\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitness(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.chainArchivist.get([previous])).at(0)\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<BlockBoundWitness> {\n return await Promise.resolve(assertEx(this.params.head))\n }\n\n async next(block: number): Promise<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<BlockBoundWitness[]> {\n const results: BlockBoundWitness[] = []\n let currentBlock: BlockBoundWitness | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (currentBlock && results.length < count) {\n if (isBlockBoundWitness(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock\n if (isNull(previous)) break\n const nextBlock = await this.chainArchivist.get([previous])\n currentBlock = asOptionalBlockBoundWitness(nextBlock[0])\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitness(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 // Async to allow for re-indexing, etc.\n await Promise.resolve()\n this.params.head = head\n void this.emit('headUpdated', { blocks: [head] })\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n BaseServiceParams,\n BlockBoundWitness,\n BlockRewardService,\n ChainInformation,\n ElectionService,\n HydratedBlockStateValidationFunction,\n HydratedTransaction,\n HydratedTransactionWithStorageMeta,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\nimport { Validator } from './model/index.ts'\n\nconst addStorageMeta = async ([tx, payloads]: HydratedTransaction): Promise<HydratedTransactionWithStorageMeta> => {\n return [await PayloadBuilder.addStorageMeta(tx), await PayloadBuilder.addStorageMeta(payloads)]\n}\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n account: AccountInstance\n chainArchivist: ReadArchivist\n chainInformation: ChainInformation\n electionService: ElectionService\n pendingBundledTransactionsArchivist: ArchivistInstance\n rewardService: BlockRewardService\n stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\n@creatableService()\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.chainInformation, () => '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: HydratedTransaction): Promise<boolean> {\n const [tx] = await addStorageMeta(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 { Address, Hash } from '@xylabs/hex'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BaseServiceParams, ChainBlockNumberIterator, ChainStakeViewer, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { BlockBoundWitness, ElectionService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoElectionServicesParams extends BaseServiceParams {\n chainIterator?: ChainBlockNumberIterator\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableService()\nexport class XyoElectionService extends BaseService<XyoElectionServicesParams> implements ElectionService {\n constructor(params: XyoElectionServicesParams) {\n super(params)\n }\n\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 { ValueType } from '@opentelemetry/api'\nimport { filterAsync } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Hash } from '@xylabs/hex'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { globalAttributes } from '@xyo-network/chain-telemetry'\nimport { validateTransaction } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asOptionalTransactionBoundWitnessWithStorageMeta, BaseServiceParams, ChainIdentification, HydratedTransactionWithStorageMeta,\n isTransactionBoundWitnessWithStorageMeta, PendingTransactionsService,\n} from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionWithHashStorageMetaToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface XyoPendingTransactionsServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIdentification?: ChainIdentification\n pendingBundledTransactionsArchivist?: ArchivistInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n}\n\nglobalAttributes.setAttribute('XyoPendingTransactionsService:status', 'unknown')\n\n@creatableService()\nexport class XyoPendingTransactionsService extends BaseService<XyoPendingTransactionsServiceParams> 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 rejected transactions\n */\n RemoveRejectedTransactions: 2,\n /**\n * Priority for removing finalized transactions\n */\n RemoveFinalizedTransactions: 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 chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainIdentification() {\n return assertEx(this.params.chainIdentification, () => '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', async ({ payloads }) => {\n await 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 })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\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 globalAttributes.setAttribute('XyoPendingTransactionsService:status', 'created')\n }\n\n async getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransactionWithStorageMeta[]> {\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 const foundPendingTransactions: HydratedTransactionWithStorageMeta[] = []\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\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 payloads = 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 (payloads.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = payloads.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = payloads.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 = payloads.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 // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...transactions)\n }\n\n // Actually delete the marked payload bundles from the archivist\n await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove deleted hashes from the \"pending delete\" set now that they are deleted\n for (const hash of foundPendingTransactionsToDeleteHashes) {\n this._removablePendingTransactionHashes.delete(hash)\n }\n\n return foundPendingTransactions\n }, XyoPendingTransactionsService.MutexPriority.ReadTransactions)\n })\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 this.logger?.log('insertNewTransactions', payloads)\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, this.chainIdentification.id)\n if (errors.length > 0) {\n this.logger?.warn(`validateTransaction: ${errors.at(0)?.message}`)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionWithHashStorageMetaToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, XyoPendingTransactionsService.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 removeBundledTransactions(\n bundledPayloads: WithStorageMeta<PayloadBundle>[],\n priority: keyof typeof XyoPendingTransactionsService.MutexPriority,\n ) {\n return await this.spanAsync(priority, async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const bundledTransactions = (await Promise.all(bundledPayloads.map(async (payload) => {\n const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)\n const tx = asOptionalTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))\n return tx !== undefined && payload._hash !== undefined ? tx : undefined\n }))).filter(exists)\n await this.pendingBundledTransactionsLocalArchivist.delete(bundledTransactions.map(btx => btx._hash))\n }, XyoPendingTransactionsService.MutexPriority[priority])\n })\n }\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { asOptionalTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<HydratedTransactionWithStorageMeta | undefined> => {\n const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)\n const tx = asOptionalTransactionBoundWitnessWithStorageMeta(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 { HydratedTransaction, HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = async (transaction: HydratedTransaction): Promise<PayloadBundle> => {\n const root = await PayloadBuilder.hash(transaction[0])\n return bundle(root, transaction)\n}\n\nexport const hydratedTransactionWithHashStorageMetaToPayloadBundle = (transaction: HydratedTransactionWithStorageMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: HydratedTransaction | HydratedTransactionWithStorageMeta) => {\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 { asOptionalChainStakeIntent, 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, asOptionalChainStakeIntent)\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 {\n Address, asAddress, Hash,\n} from '@xylabs/hex'\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 {\n BaseServiceParams, EventingChainBlockNumberIterator, Intent,\n} from '@xyo-network/xl1-protocol'\nimport {\n asChainIndexingServiceStateWithStorageMeta,\n asOptionalBlockBoundWitness, asOptionalBlockBoundWitnessWithStorageMeta,\n asOptionalChainStakeIntent, ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n isChainIndexingServiceState,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIterator?: EventingChainBlockNumberIterator\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@creatableService()\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 constructor(params: XyoStakeIntentServiceParams) {\n super(params)\n this.chainIterator.on('headUpdated', async () => {\n await this.updateIndex()\n })\n }\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(): Promise<void> {\n const head = await this.chainIterator.head()\n const headHash = await PayloadBuilder.hash(head)\n if (head?.block === undefined) return\n await this.recoverState(headHash)\n await this.updateIndex(true)\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 validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer)\n return validCandidates\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 private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint = 1n,\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.activeByAddressStaked(`${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(asOptionalBlockBoundWitness((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 = asOptionalBlockBoundWitnessWithStorageMeta(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 const currentHeadHash = await PayloadBuilder.hash(currentHead)\n const result = await analyzeChain(this.chainArchivist, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asOptionalChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.info(`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 { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress } from '@xylabs/hex'\nimport { toEthAddress } from '@xyo-network/chain-ethereum'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { BaseServiceParams, ChainService } from '@xyo-network/xl1-protocol'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\n\nexport type EvmChainServiceParams = 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 contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(this.id),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n get id(): Address {\n return assertEx(this.params.id)\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 activeByAddressStaked(address: string): Promise<bigint> {\n return await this.contract.activeByAddressStaked(getAddress(address))\n }\n\n async activeByStaker(address: string): Promise<bigint> {\n return await this.contract.activeByStaker(getAddress(address))\n }\n\n async addStake(staked: string, amount: bigint): Promise<boolean> {\n const result = await this.contract.addStake(getAddress(staked), amount)\n await result.wait()\n return true\n }\n\n async chainId(): Promise<Address> {\n return toAddress(await this.contract.chainId())\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: string): Promise<bigint> {\n return await this.contract.pendingByStaker(getAddress(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"],"mappings":"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","names":["isHash","isDefined","analyzeChain","BalanceAnalyzer","ChainSummaryBalancesSchema","isChainSummaryBalances","isPositiveBigInt","isBlockBoundWitnessWithStorageMeta","accountBalanceServiceFromArchivist","archivist","head","allAddressesBalances","schema","ChainSummaryBalancesSchema","balances","firstBlock","lastBlock","result","getBalance","address","undefined","signedValue","positive","isPositiveBigInt","getBalances","Object","fromEntries","entries","map","key","value","name","sync","analysis","analyzeChain","BalanceAnalyzer","find","isChainSummaryBalances","Promise","resolve","isHash","on","payloads","block","p","isBlockBoundWitnessWithStorageMeta","isDefined","_hash","assertEx","toHex","analyzeChain","BalanceAnalyzer","ChainSummaryBalancesSchema","isChainSummaryBalances","toPositiveBigInt","PayloadBuilder","BaseEmitter","span","spanAsync","Mutex","BaseService","BaseEmitter","singletonInitMutex","Mutex","singletons","globalThis","name","create","params","result","Error","createHandler","initSingleton","runExclusive","span","fn","tracer","spanAsync","BaseAccountableService","creatableService","constructor","XyoChainAccountBalanceService","BaseService","_balances","_firstBlock","_lastBlock","chainArchivist","assertEx","params","getBalance","address","toPositiveBigInt","positive","toHex","getBalances","result","entries","Object","balance","sync","head","startingBalances","PayloadBuilder","schema","ChainSummaryBalancesSchema","fields","balances","firstBlock","lastBlock","build","analysis","analyzeChain","BalanceAnalyzer","undefined","allAddressesBalances","find","isChainSummaryBalances","assertEx","exists","hexToBigInt","toHex","isUndefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildBlock","PayloadBuilder","asBlockBoundWitness","BlockNumberSchema","ChainStakeIntentSchema","assertEx","hexFromBigInt","XYO_ZERO_ADDRESS","HydratedTransactionWrapper","TransferSchema","transactionRequiredGas","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","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_RESTAKE_DURATION","XYO_PRODUCER_RESTAKE_WINDOW","XyoBlockProducer","BaseService","_blockRewardDiviner","DefaultBlockSize","address","account","assertEx","params","balanceService","chainArchivist","chainInfo","chainInformation","electionService","pendingTransactionsService","rejectedTransactionsArchivist","rewardAddress","rewardService","stakeIntentService","validateHydratedBlockState","next","head","chain","id","leaders","getCreatorCommitteeForNextBlock","proposeNextValidBlock","getBlockRewardTransfer","block","FixedPercentageBlockRewardDiviner","create","blockRewardService","config","rewardPercentageRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockHex","toHex","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","reward","getProducerRedeclaration","redeclareIntent","process","env","XYO_PRODUCER_REDECLARE_INTENT","isUndefined","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","currentBlock","timeToProducerExpiration","intent","ChainStakeIntentSchema","from","nbf","exp","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactions","getPendingTransactions","_hash","blockPayloads","producerRedeclarationPayload","push","length","rewardTransferPayload","transactionTransfers","generateTransactionFeeTransfers","fundedTransfers","fundedNextBlockTransactions","map","tx","transfer","find","txTransfer","totalTransferCost","Object","values","transfers","reduce","acc","t","hexToBigInt","getBalance","filter","exists","buildBlock","logger","warn","errors","accountBalance","message","rejectedTransactions","insert","assertEx","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","EvmBlockRewardService","BaseService","_contractAddress","chainService","assertEx","params","contractAddress","provider","createHandler","rewardsContract","ex","error","Error","message","getRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","calcBlockReward","assertEx","toFixedPoint","rewardFromBlockNumber","XyoBlockRewardService","BaseService","rewardFromBlockNumber","creatorReward","toFixedPoint","initialStepReward","minRewardPerBlock","stepFactorDenominator","stepFactorNumerator","stepSize","assertEx","params","initialReward","getRewardForBlock","blockNumber","assertEx","isDefined","isNull","PayloadBuilder","asBlockBoundWitness","asOptionalBlockBoundWitness","isBlockBoundWitness","LRUCache","ChainBlockNumberIterationService","BaseService","_blocksByBlockNumber","LRUCache","max","chainArchivist","assertEx","params","chainIdentification","id","head","chain","get","block","cached","startingBlock","currentBlockHash","PayloadBuilder","hash","currentBlock","at","isDefined","asBlockBoundWitness","_hash","isBlockBoundWitness","set","previous","isNull","Error","Promise","resolve","next","nextBlockNumber","undefined","count","results","length","push","nextBlock","asOptionalBlockBoundWitness","updateHead","emit","blocks","assertEx","PayloadBuilder","addStorageMeta","tx","payloads","PayloadBuilder","XyoValidator","BaseService","address","account","assertEx","params","chainArchivist","chainInfo","chainInformation","electionService","pendingBundledTransactionsArchivist","rewardService","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","get","_hash","length","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","PayloadBuilder","XyoElectionService","BaseService","params","chainIterator","assertEx","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","PayloadBuilder","hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","ValueType","filterAsync","assertEx","exists","forget","MemoryArchivist","globalAttributes","validateTransaction","PayloadBuilder","asOptionalTransactionBoundWitnessWithStorageMeta","isTransactionBoundWitnessWithStorageMeta","Mutex","PayloadBuilder","asOptionalTransactionBoundWitnessWithStorageMeta","bundledPayloadToHydratedTransaction","payload","withStorageMeta","PayloadBuilder","addStorageMeta","payloads","tx","asOptionalTransactionBoundWitnessWithStorageMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionWithHashStorageMetaToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","globalAttributes","setAttribute","XyoPendingTransactionsService","BaseService","MutexPriority","InsertNewTransactions","ReadTransactions","RemoveRejectedTransactions","RemoveFinalizedTransactions","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","chainArchivist","assertEx","params","chainIdentification","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","getPendingTransactions","head","limit","spanAsync","runExclusive","foundPendingTransactions","foundPendingTransactionsToDeleteHashes","cursor","length","next","order","at","_sequence","deletedTransactionBundles","filter","tx","has","root","push","map","_hash","exists","undeletedTransactionBundles","transactions","Promise","all","p","bundledPayloadToHydratedTransaction","delete","hash","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","logger","log","unprocessedTransactions","hydratedUnprocessedTransactions","validTransactions","filterAsync","errors","validateTransaction","id","warn","message","bundledTransactions","hydratedTransactionWithHashStorageMetaToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","add","removeBundledTransactions","bundledPayloads","priority","withStorageMeta","PayloadBuilder","addStorageMeta","asOptionalTransactionBoundWitnessWithStorageMeta","find","undefined","btx","filterAs","exists","asOptionalBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asOptionalChainStakeIntent","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","asOptionalChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","filterAs","assertEx","asAddress","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asChainIndexingServiceStateWithStorageMeta","asOptionalBlockBoundWitness","asOptionalBlockBoundWitnessWithStorageMeta","asOptionalChainStakeIntent","ChainIndexingServiceStateSchema","isChainIndexingServiceState","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","params","chainIterator","on","updateIndex","chainArchivist","assertEx","chainStakeViewer","stakeIntentStateArchivist","createHandler","head","headHash","PayloadBuilder","hash","block","recoverState","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","spanAsync","findAllContaining","candidates","validCandidates","filterToValidStake","isStakedForBlock","includes","requiredMinimumStake","candidatesWithStake","all","map","candidate","stake","activeStake","activeByAddressStaked","set","ttl","filter","persistState","current","state","serialize","payload","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","currentBlock","asOptionalBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asOptionalBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","_hash","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asOptionalChainStakeIntent","currentHeadBlockNum","logger","info","signedDeclaration","exp","nbf","start","stop","asAddress","from","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","getAddress","EvmChainService","BaseService","contract","params","undefined","StakedXyoChainFactory","connect","toEthAddress","id","runner","assertEx","active","activeByAddressStaked","address","getAddress","activeByStaker","addStake","staked","amount","result","wait","chainId","toAddress","forkedAtBlockNumber","forkedAtHash","forkedChainId","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker"]}
1
+ {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/AccountBalance/XyoChainAccountBalanceService.ts","../../src/BaseService.ts","../../src/BlockProducer/XyoBlockProducer.ts","../../src/BlockProducer/generateTransactionFeeTransfers.ts","../../src/BlockReward/EvmBlockRewardService.ts","../../src/BlockReward/XyoBlockRewardService.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/XyoElectionService.ts","../../src/PendingTransactions/PendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/Staker/Evm/Evm.ts"],"sourcesContent":["import {\n type Address, type Hash, type Hex,\n isHash,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ChainSummaryBalances } from '@xyo-network/chain-analyze'\nimport {\n analyzeChain, BalanceAnalyzer, ChainSummaryBalancesSchema, isChainSummaryBalances,\n} from '@xyo-network/chain-analyze'\nimport { isPositiveBigInt } from '@xyo-network/chain-protocol'\nimport { type AccountBalanceService, isBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const accountBalanceServiceFromArchivist = async (archivist: ArchivistInstance, head?: Hash): Promise<AccountBalanceService> => {\n let allAddressesBalances: ChainSummaryBalances = {\n schema: ChainSummaryBalancesSchema, balances: {}, firstBlock: null, lastBlock: null,\n }\n\n const result: AccountBalanceService = {\n getBalance: (address: Address): Hex => {\n if (allAddressesBalances === undefined) {\n return '00'\n }\n const signedValue = allAddressesBalances.balances[address] ?? { positive: '00' }\n return isPositiveBigInt(signedValue) ? signedValue.positive : '00'\n },\n getBalances: (): Record<Address, Hex> => {\n return Object.fromEntries(Object.entries(allAddressesBalances.balances).map(([key, value]) => ([key, isPositiveBigInt(value) ? value.positive : '0'])))\n },\n name: 'ArchivistAccountBalanceService',\n async sync(head: Hash): Promise<void> {\n const analysis = await analyzeChain(\n archivist,\n [new BalanceAnalyzer()],\n head,\n null,\n -1n,\n )\n allAddressesBalances = analysis.find(isChainSummaryBalances) ?? {\n schema: ChainSummaryBalancesSchema, balances: {}, firstBlock: null, lastBlock: null,\n }\n return await Promise.resolve()\n },\n }\n\n if (isHash(head)) {\n await result.sync(head)\n }\n\n archivist.on('inserted', ({ payloads }) => {\n const block = payloads.find(p => isBlockBoundWitnessWithStorageMeta(p))\n if (isDefined(block)) {\n void result.sync(block._hash)\n }\n })\n\n return result\n}\n","import { assertEx } from '@xylabs/assert'\nimport {\n Address, Hash, Hex,\n toHex,\n} from '@xylabs/hex'\nimport {\n analyzeChain, BalanceAnalyzer, ChainSummaryBalances, ChainSummaryBalancesSchema, isChainSummaryBalances,\n} from '@xyo-network/chain-analyze'\nimport { SignedBigInt, toPositiveBigInt } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n AccountBalanceService, BaseServiceParams,\n ChainServiceCollection,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport type ChainAccountBalanceServiceParams = BaseServiceParams<Partial<Pick<ChainServiceCollection, 'chainArchivist'>>>\n\n@creatableService()\nexport class XyoChainAccountBalanceService extends BaseService<ChainAccountBalanceServiceParams> implements AccountBalanceService {\n private _balances: Partial<Record<Address, SignedBigInt>> = {}\n /**\n * The most recent head that was indexed to\n */\n private _firstBlock: Hash | null = null\n\n /**\n * The oldest block that was indexed through\n */\n private _lastBlock: Hash | null = null\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'chainArchivist is required')\n }\n\n getBalance(address: Address): Hex {\n return toPositiveBigInt(this._balances[address] ?? { positive: toHex(0n) }).positive\n }\n\n getBalances(): Record<Address, Hex> {\n const result: Record<Address, Hex> = {}\n const entries = Object.entries(this._balances) as [Address, SignedBigInt][]\n for (const [address, balance] of entries) {\n result[address] = toPositiveBigInt(balance).positive\n }\n return result\n }\n\n async sync(head: Hash): Promise<void> {\n // Create starting balances from the current balances\n const startingBalances = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n .fields({\n balances: this._balances,\n firstBlock: this._firstBlock,\n lastBlock: this._lastBlock,\n })\n .build()\n\n // Calculate the balances for each address through the last indexed block based on the current balances\n const analysis = await analyzeChain(\n this.chainArchivist,\n [new BalanceAnalyzer(undefined, undefined, startingBalances)],\n head,\n this._firstBlock,\n )\n // Find the balances for all addresses\n const allAddressesBalances = analysis.find(isChainSummaryBalances)\n\n // Return if no balances were found (nothing to index)\n if (allAddressesBalances === undefined) return\n\n // Merge to existing balances map\n this._balances = { ...this._balances, ...allAddressesBalances.balances }\n\n // Update first indexed block\n this._firstBlock = allAddressesBalances.firstBlock\n // Update last indexed block\n if (this._lastBlock === null) this._lastBlock = allAddressesBalances.lastBlock\n }\n}\n","import type { EventData } from '@xylabs/events'\nimport { BaseEmitter } from '@xylabs/events'\nimport type { Promisable } from '@xylabs/promise'\nimport { span, spanAsync } from '@xylabs/telemetry'\nimport type {\n BaseAccountableServiceParams, BaseServiceParams, Service,\n} from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData> extends BaseEmitter<Partial<TParams>, TEventData> {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n get name() {\n return this.constructor.name\n }\n\n static async create<TService extends BaseService<TParams>, TParams extends BaseServiceParams = TService['params']>(\n this: CreatableService<TService>,\n params: Partial<TParams>,\n ): Promise<TService> {\n const result = new this(params)\n if (result.name === 'BaseService') throw new Error('Cannot create BaseService')\n await result.createHandler()\n return result\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: 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 createHandler(): Promisable<void> {\n return\n }\n\n span<T>(name: string, fn: () => T): T {\n return span(name, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanAsync(name, fn, this.tracer)\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 Service {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params: 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 { exists } from '@xylabs/exists'\nimport {\n Address, hexToBigInt, toHex,\n} from '@xylabs/hex'\nimport { isUndefined } from '@xylabs/typeof'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n AccountBalanceService,\n AllowedBlockPayload, asBlockBoundWitness, BlockBoundWitness, BlockNumber, BlockNumberSchema, BlockProducerService, ChainStakeIntent, ChainStakeIntentSchema,\n HydratedBlock, PendingTransactionsService, StakeIntentService, Transfer,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } 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_RESTAKE_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_RESTAKE_WINDOW = 500n\n\nexport interface XyoBlockProducerParams extends XyoValidatorParams {\n balanceService: AccountBalanceService\n pendingTransactionsService: PendingTransactionsService\n rejectedTransactionsArchivist: ArchivistInstance\n rewardAddress: Address\n}\n\n@creatableService()\nexport class XyoBlockProducer extends BaseService<XyoBlockProducerParams> implements BlockProducerService {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\n\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\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 chainInfo() {\n return assertEx(this.params.chainInformation, () => 'chainInfo 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 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.chainInfo.id) 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?.[0] !== this.address) return\n return this.proposeNextValidBlock(head)\n }\n\n protected async getBlockRewardTransfer(block: number): Promise<Transfer | undefined> {\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: 50,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n const blockHex = assertEx(toHex(block), () => 'Failed to convert block to hex')\n const blockId = new PayloadBuilder<BlockNumber>({ schema: BlockNumberSchema }).fields({ block: blockHex }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n const [reward] = rewards\n return reward\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns\n */\n protected async getProducerRedeclaration(head: WithStorageMeta<BlockBoundWitness>): Promise<ChainStakeIntent | undefined> {\n const redeclareIntent = process.env.XYO_PRODUCER_REDECLARE_INTENT\n if (isUndefined(redeclareIntent)) return\n // Decide if we need to redeclare\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 > XYO_PRODUCER_RESTAKE_WINDOW) return\n // Create redeclaration\n const intent = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from: this.address,\n intent: 'producer',\n nbf: currentBlock,\n exp: currentBlock + XYO_PRODUCER_RESTAKE_DURATION,\n }).build()\n return intent\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, XyoBlockProducer.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 and no payloads, we don't need to create a block\n if (blockPayloads.length === 0 && nextBlockTransactions.length === 0) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayload = await this.getBlockRewardTransfer(nextBlock)\n if (rewardTransferPayload) blockPayloads.push(rewardTransferPayload)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n\n const fundedTransfers: Transfer[] = []\n const fundedNextBlockTransactions = nextBlockTransactions.map((tx) => {\n const transfer: Transfer | undefined = transactionTransfers.find(txTransfer => txTransfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00'), 0n)\n if (validateBalances) {\n if (hexToBigInt(this.balanceService.getBalance(transfer.from)) >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }).filter(exists)\n blockPayloads.push(...fundedTransfers)\n\n // Build the block\n const block = await buildBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account])\n this.logger?.warn(`buildBlock: ${block[0].block} with ${block[1].length} payloads`)\n const errors = await this.validateHydratedBlockState(block, this.chainInfo.id, { accountBalance: this.balanceService })\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","import { assertEx } from '@xylabs/assert'\nimport { type Address, hexFromBigInt } from '@xylabs/hex'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { HydratedTransactionWrapper } from '@xyo-network/chain-wrappers'\nimport type {\n HydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: HydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(tx => HydratedTransactionWrapper.parse(tx)))\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 { assertEx } from '@xylabs/assert'\nimport { toEthAddress } from '@xyo-network/chain-ethereum'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport {\n BaseAccountableServiceParams, BlockRewardService, ChainService,\n} from '@xyo-network/xl1-protocol'\nimport { Provider } from 'ethers/providers'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface EvmBlockRewardServiceParams extends BaseAccountableServiceParams {\n chainService?: ChainService\n provider?: Provider\n}\n\n@creatableService<EvmBlockRewardService>()\nexport class EvmBlockRewardService extends BaseService<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 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 { toFixedPoint } from '@xylabs/decimal-precision'\nimport { Promisable } from '@xylabs/promise'\nimport { rewardFromBlockNumber } from '@xyo-network/chain-protocol'\nimport { BaseServiceParams, BlockRewardService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoBlockRewardServiceParams extends BaseServiceParams {\n creatorReward?: bigint\n initialStepReward?: bigint\n minRewardPerBlock?: bigint\n stepFactorDenominator?: bigint\n stepFactorNumerator?: bigint\n stepSize?: bigint\n}\n\n@creatableService()\nexport class XyoBlockRewardService extends BaseService<XyoBlockRewardServiceParams> implements BlockRewardService {\n protected readonly rewardFromBlockNumber = rewardFromBlockNumber(18)\n\n constructor(\n {\n creatorReward = toFixedPoint(20_000_000_000n),\n initialStepReward = toFixedPoint(3000n),\n minRewardPerBlock = toFixedPoint(30n),\n stepFactorDenominator = 100n,\n stepFactorNumerator = 90n,\n stepSize = 1_000_000n,\n }: Partial<XyoBlockRewardServiceParams> = {},\n ) {\n super({\n initialStepReward, minRewardPerBlock, stepSize, stepFactorDenominator, stepFactorNumerator, creatorReward,\n })\n }\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 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 { isDefined, isNull } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BlockBoundWitness, ChainIdentification,\n ChainIteratorEventData,\n EventingChainBlockNumberIterator,\n XyoChainIteratorParams,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness,\n isBlockBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorEventData> implements EventingChainBlockNumberIterator {\n protected _blocksByBlockNumber = new LRUCache<number, BlockBoundWitness>({ max: 10_000 })\n\n get chainArchivist(): ArchivistInstance { return assertEx(this.params.chainArchivist) }\n\n get chainIdentification(): ChainIdentification { return { id: assertEx(this.params.head?.chain) } }\n\n async get(block: number): Promise<BlockBoundWitness> {\n const head = await this.head()\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.chainArchivist.get([currentBlockHash])).at(0)\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitness(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.chainArchivist.get([previous])).at(0)\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<BlockBoundWitness> {\n return await Promise.resolve(assertEx(this.params.head))\n }\n\n async next(block: number): Promise<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<BlockBoundWitness[]> {\n const results: BlockBoundWitness[] = []\n let currentBlock: BlockBoundWitness | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (currentBlock && results.length < count) {\n if (isBlockBoundWitness(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock\n if (isNull(previous)) break\n const nextBlock = await this.chainArchivist.get([previous])\n currentBlock = asBlockBoundWitness(nextBlock[0])\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitness(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 // Async to allow for re-indexing, etc.\n await Promise.resolve()\n this.params.head = head\n void this.emit('headUpdated', { blocks: [head] })\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n BaseServiceParams,\n BlockBoundWitness,\n BlockRewardService,\n ChainInformation,\n ElectionService,\n HydratedBlockStateValidationFunction,\n HydratedTransaction,\n StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\nimport { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n account: AccountInstance\n chainArchivist: ReadArchivist\n chainInformation: ChainInformation\n electionService: ElectionService\n pendingBundledTransactionsArchivist: ArchivistInstance\n rewardService: BlockRewardService\n stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\n@creatableService()\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.chainInformation, () => '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: HydratedTransaction): 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 { Address, Hash } from '@xylabs/hex'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BaseServiceParams, ChainBlockNumberIterator, ChainStakeViewer, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\nimport { BlockBoundWitness, ElectionService } from '@xyo-network/xl1-protocol'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoElectionServicesParams extends BaseServiceParams {\n chainIterator?: ChainBlockNumberIterator\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableService()\nexport class XyoElectionService extends BaseService<XyoElectionServicesParams> implements ElectionService {\n constructor(params: XyoElectionServicesParams) {\n super(params)\n }\n\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 { ValueType } from '@opentelemetry/api'\nimport { filterAsync } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Hash } from '@xylabs/hex'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { globalAttributes } from '@xyo-network/chain-telemetry'\nimport { validateTransaction } from '@xyo-network/chain-validation'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asTransactionBoundWitnessWithStorageMeta, BaseServiceParams, ChainIdentification, HydratedTransaction,\n isTransactionBoundWitnessWithStorageMeta, PendingTransactionsService,\n} from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface XyoPendingTransactionsServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIdentification?: ChainIdentification\n pendingBundledTransactionsArchivist?: ArchivistInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n}\n\nglobalAttributes.setAttribute('XyoPendingTransactionsService:status', 'unknown')\n\n@creatableService()\nexport class XyoPendingTransactionsService extends BaseService<XyoPendingTransactionsServiceParams> 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 rejected transactions\n */\n RemoveRejectedTransactions: 2,\n /**\n * Priority for removing finalized transactions\n */\n RemoveFinalizedTransactions: 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 chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainIdentification() {\n return assertEx(this.params.chainIdentification, () => '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', async ({ payloads }) => {\n await 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 })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\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 globalAttributes.setAttribute('XyoPendingTransactionsService:status', 'created')\n }\n\n async getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransaction[]> {\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 const foundPendingTransactions: HydratedTransaction[] = []\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\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 payloads = 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 (payloads.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = payloads.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = payloads.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 = payloads.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 // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...transactions)\n }\n\n // Actually delete the marked payload bundles from the archivist\n await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove deleted hashes from the \"pending delete\" set now that they are deleted\n for (const hash of foundPendingTransactionsToDeleteHashes) {\n this._removablePendingTransactionHashes.delete(hash)\n }\n\n return foundPendingTransactions\n }, XyoPendingTransactionsService.MutexPriority.ReadTransactions)\n })\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 this.logger?.log('insertNewTransactions', payloads)\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, this.chainIdentification.id)\n if (errors.length > 0) {\n this.logger?.warn(`validateTransaction: ${errors.at(0)?.message}`)\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 }, XyoPendingTransactionsService.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 removeBundledTransactions(\n bundledPayloads: WithStorageMeta<PayloadBundle>[],\n priority: keyof typeof XyoPendingTransactionsService.MutexPriority,\n ) {\n return await this.spanAsync(priority, async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const bundledTransactions = (await Promise.all(bundledPayloads.map(async (payload) => {\n const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)\n const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))\n return tx !== undefined && payload._hash !== undefined ? tx : undefined\n }))).filter(exists)\n await this.pendingBundledTransactionsLocalArchivist.delete(bundledTransactions.map(btx => btx._hash))\n }, XyoPendingTransactionsService.MutexPriority[priority])\n })\n }\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol'\nimport { asTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<HydratedTransaction | 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 { HydratedTransaction } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: HydratedTransaction): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: HydratedTransaction) => {\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 {\n Address, asAddress, Hash,\n} from '@xylabs/hex'\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 {\n BaseServiceParams, EventingChainBlockNumberIterator, Intent,\n} 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 { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService, creatableService } from '../BaseService.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n chainArchivist?: ArchivistInstance\n chainIterator?: EventingChainBlockNumberIterator\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@creatableService()\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 constructor(params: XyoStakeIntentServiceParams) {\n super(params)\n this.chainIterator.on('headUpdated', async () => {\n await this.updateIndex()\n })\n }\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(): Promise<void> {\n const head = await this.chainIterator.head()\n const headHash = await PayloadBuilder.hash(head)\n if (head?.block === undefined) return\n await this.recoverState(headHash)\n await this.updateIndex(true)\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 validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer)\n return validCandidates\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 private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint = 1n,\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.activeByAddressStaked(`${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 const currentHeadHash = await PayloadBuilder.hash(currentHead)\n const result = await analyzeChain(this.chainArchivist, [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?.info(`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 { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress } from '@xylabs/hex'\nimport { toEthAddress } from '@xyo-network/chain-ethereum'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { BaseServiceParams, ChainService } from '@xyo-network/xl1-protocol'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\n\nexport type EvmChainServiceParams = 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 contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(this.id),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n get id(): Address {\n return assertEx(this.params.id)\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 activeByAddressStaked(address: string): Promise<bigint> {\n return await this.contract.activeByAddressStaked(getAddress(address))\n }\n\n async activeByStaker(address: string): Promise<bigint> {\n return await this.contract.activeByStaker(getAddress(address))\n }\n\n async addStake(staked: string, amount: bigint): Promise<boolean> {\n const result = await this.contract.addStake(getAddress(staked), amount)\n await result.wait()\n return true\n }\n\n async chainId(): Promise<Address> {\n return toAddress(await this.contract.chainId())\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: string): Promise<bigint> {\n return await this.contract.pendingByStaker(getAddress(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"],"mappings":"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","names":["isHash","isDefined","analyzeChain","BalanceAnalyzer","ChainSummaryBalancesSchema","isChainSummaryBalances","isPositiveBigInt","isBlockBoundWitnessWithStorageMeta","accountBalanceServiceFromArchivist","archivist","head","allAddressesBalances","schema","ChainSummaryBalancesSchema","balances","firstBlock","lastBlock","result","getBalance","address","undefined","signedValue","positive","isPositiveBigInt","getBalances","Object","fromEntries","entries","map","key","value","name","sync","analysis","analyzeChain","BalanceAnalyzer","find","isChainSummaryBalances","Promise","resolve","isHash","on","payloads","block","p","isBlockBoundWitnessWithStorageMeta","isDefined","_hash","assertEx","toHex","analyzeChain","BalanceAnalyzer","ChainSummaryBalancesSchema","isChainSummaryBalances","toPositiveBigInt","PayloadBuilder","BaseEmitter","span","spanAsync","Mutex","BaseService","BaseEmitter","singletonInitMutex","Mutex","singletons","globalThis","name","create","params","result","Error","createHandler","initSingleton","runExclusive","span","fn","tracer","spanAsync","BaseAccountableService","creatableService","constructor","XyoChainAccountBalanceService","BaseService","_balances","_firstBlock","_lastBlock","chainArchivist","assertEx","params","getBalance","address","toPositiveBigInt","positive","toHex","getBalances","result","entries","Object","balance","sync","head","startingBalances","PayloadBuilder","schema","ChainSummaryBalancesSchema","fields","balances","firstBlock","lastBlock","build","analysis","analyzeChain","BalanceAnalyzer","undefined","allAddressesBalances","find","isChainSummaryBalances","assertEx","exists","hexToBigInt","toHex","isUndefined","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildBlock","PayloadBuilder","asBlockBoundWitness","BlockNumberSchema","ChainStakeIntentSchema","assertEx","hexFromBigInt","XYO_ZERO_ADDRESS","HydratedTransactionWrapper","TransferSchema","transactionRequiredGas","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","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_RESTAKE_DURATION","XYO_PRODUCER_RESTAKE_WINDOW","XyoBlockProducer","BaseService","_blockRewardDiviner","DefaultBlockSize","address","account","assertEx","params","balanceService","chainArchivist","chainInfo","chainInformation","electionService","pendingTransactionsService","rejectedTransactionsArchivist","rewardAddress","rewardService","stakeIntentService","validateHydratedBlockState","next","head","chain","id","leaders","getCreatorCommitteeForNextBlock","proposeNextValidBlock","getBlockRewardTransfer","block","FixedPercentageBlockRewardDiviner","create","blockRewardService","config","rewardPercentageRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockHex","toHex","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","reward","getProducerRedeclaration","redeclareIntent","process","env","XYO_PRODUCER_REDECLARE_INTENT","isUndefined","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","currentBlock","timeToProducerExpiration","intent","ChainStakeIntentSchema","from","nbf","exp","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactions","getPendingTransactions","_hash","blockPayloads","producerRedeclarationPayload","push","length","rewardTransferPayload","transactionTransfers","generateTransactionFeeTransfers","fundedTransfers","fundedNextBlockTransactions","map","tx","transfer","find","txTransfer","totalTransferCost","Object","values","transfers","reduce","acc","t","hexToBigInt","getBalance","filter","exists","buildBlock","logger","warn","errors","accountBalance","message","rejectedTransactions","insert","assertEx","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","EvmBlockRewardService","BaseService","_contractAddress","chainService","assertEx","params","contractAddress","provider","createHandler","rewardsContract","ex","error","Error","message","getRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","calcBlockReward","assertEx","toFixedPoint","rewardFromBlockNumber","XyoBlockRewardService","BaseService","rewardFromBlockNumber","creatorReward","toFixedPoint","initialStepReward","minRewardPerBlock","stepFactorDenominator","stepFactorNumerator","stepSize","assertEx","params","initialReward","getRewardForBlock","blockNumber","assertEx","isDefined","isNull","PayloadBuilder","asBlockBoundWitness","isBlockBoundWitness","LRUCache","ChainBlockNumberIterationService","BaseService","_blocksByBlockNumber","LRUCache","max","chainArchivist","assertEx","params","chainIdentification","id","head","chain","get","block","cached","startingBlock","currentBlockHash","PayloadBuilder","hash","currentBlock","at","isDefined","asBlockBoundWitness","_hash","isBlockBoundWitness","set","previous","isNull","Error","Promise","resolve","next","nextBlockNumber","undefined","count","results","length","push","nextBlock","updateHead","emit","blocks","assertEx","XyoValidator","BaseService","address","account","assertEx","params","chainArchivist","chainInfo","chainInformation","electionService","pendingBundledTransactionsArchivist","rewardService","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","get","_hash","length","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","PayloadBuilder","XyoElectionService","BaseService","params","chainIterator","assertEx","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","PayloadBuilder","hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","ValueType","filterAsync","assertEx","exists","forget","MemoryArchivist","globalAttributes","validateTransaction","PayloadBuilder","asTransactionBoundWitnessWithStorageMeta","isTransactionBoundWitnessWithStorageMeta","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","globalAttributes","setAttribute","XyoPendingTransactionsService","BaseService","MutexPriority","InsertNewTransactions","ReadTransactions","RemoveRejectedTransactions","RemoveFinalizedTransactions","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","chainArchivist","assertEx","params","chainIdentification","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","getPendingTransactions","head","limit","spanAsync","runExclusive","foundPendingTransactions","foundPendingTransactionsToDeleteHashes","cursor","length","next","order","at","_sequence","deletedTransactionBundles","filter","tx","has","root","push","map","_hash","exists","undeletedTransactionBundles","transactions","Promise","all","p","bundledPayloadToHydratedTransaction","delete","hash","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","logger","log","unprocessedTransactions","hydratedUnprocessedTransactions","validTransactions","filterAsync","errors","validateTransaction","id","warn","message","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","add","removeBundledTransactions","bundledPayloads","priority","withStorageMeta","PayloadBuilder","addStorageMeta","asTransactionBoundWitnessWithStorageMeta","find","undefined","btx","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","asAddress","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainIndexingServiceStateWithStorageMeta","asChainStakeIntent","ChainIndexingServiceStateSchema","isChainIndexingServiceState","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","params","chainIterator","on","updateIndex","chainArchivist","assertEx","chainStakeViewer","stakeIntentStateArchivist","createHandler","head","headHash","PayloadBuilder","hash","block","recoverState","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","spanAsync","findAllContaining","candidates","validCandidates","filterToValidStake","isStakedForBlock","includes","requiredMinimumStake","candidatesWithStake","all","map","candidate","stake","activeStake","activeByAddressStaked","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","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","info","signedDeclaration","exp","nbf","start","stop","asAddress","from","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","getAddress","EvmChainService","BaseService","contract","params","undefined","StakedXyoChainFactory","connect","toEthAddress","id","runner","assertEx","active","activeByAddressStaked","address","getAddress","activeByStaker","addStake","staked","amount","result","wait","chainId","toAddress","forkedAtBlockNumber","forkedAtHash","forkedChainId","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ChainBlockNumberIterationService.d.ts","sourceRoot":"","sources":["../../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAErE,OAAO,KAAK,EACV,iBAAiB,EAAE,mBAAmB,EACtC,sBAAsB,EACtB,gCAAgC,EAChC,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAKlC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,qBAAa,gCAAiC,SAAQ,WAAW,CAAC,sBAAsB,EAAE,sBAAsB,CAAE,YAAW,gCAAgC;IAC3J,SAAS,CAAC,oBAAoB,+CAA2D;IAEzF,IAAI,cAAc,IAAI,iBAAiB,CAAgD;IAEvF,IAAI,mBAAmB,IAAI,mBAAmB,CAAqD;IAE7F,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyB9C,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAIlC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAQ3D,QAAQ,CAAC,KAAK,GAAE,MAAM,GAAG,SAAqB,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkBhG,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzD"}
1
+ {"version":3,"file":"ChainBlockNumberIterationService.d.ts","sourceRoot":"","sources":["../../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAErE,OAAO,KAAK,EACV,iBAAiB,EAAE,mBAAmB,EACtC,sBAAsB,EACtB,gCAAgC,EAChC,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAKlC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,qBAAa,gCAAiC,SAAQ,WAAW,CAAC,sBAAsB,EAAE,sBAAsB,CAAE,YAAW,gCAAgC;IAC3J,SAAS,CAAC,oBAAoB,+CAA2D;IAEzF,IAAI,cAAc,IAAI,iBAAiB,CAAgD;IAEvF,IAAI,mBAAmB,IAAI,mBAAmB,CAAqD;IAE7F,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyB9C,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAIlC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAQ3D,QAAQ,CAAC,KAAK,GAAE,MAAM,GAAG,SAAqB,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkBhG,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"XyoValidator.d.ts","sourceRoot":"","sources":["../../../src/ChainValidator/XyoValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE/E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oCAAoC,EACpC,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAM5C,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,OAAO,EAAE,eAAe,CAAA;IACxB,cAAc,EAAE,aAAa,CAAA;IAC7B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,eAAe,EAAE,eAAe,CAAA;IAChC,mCAAmC,EAAE,iBAAiB,CAAA;IACtD,aAAa,EAAE,kBAAkB,CAAA;IACjC,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,0BAA0B,EAAE,oCAAoC,CAAA;CACjE;AAED,qBACa,YAAY,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAE,YAAW,SAAS;IAClI,IAAI,OAAO,sBAEV;IAED,SAAS,KAAK,OAAO,uBAEpB;IAED,SAAS,KAAK,cAAc,8BAE3B;IAED,SAAS,KAAK,SAAS,gCAEtB;IAED,SAAS,KAAK,eAAe,+BAE5B;IAED,SAAS,KAAK,mCAAmC,mDAEhD;IAED,SAAS,KAAK,aAAa,6BAE1B;IAED,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAK9D,0BAA0B,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ7F"}
1
+ {"version":3,"file":"XyoValidator.d.ts","sourceRoot":"","sources":["../../../src/ChainValidator/XyoValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC/E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oCAAoC,EACpC,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,OAAO,EAAE,eAAe,CAAA;IACxB,cAAc,EAAE,aAAa,CAAA;IAC7B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,eAAe,EAAE,eAAe,CAAA;IAChC,mCAAmC,EAAE,iBAAiB,CAAA;IACtD,aAAa,EAAE,kBAAkB,CAAA;IACjC,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,0BAA0B,EAAE,oCAAoC,CAAA;CACjE;AAED,qBACa,YAAY,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAE,YAAW,SAAS;IAClI,IAAI,OAAO,sBAEV;IAED,SAAS,KAAK,OAAO,uBAEpB;IAED,SAAS,KAAK,cAAc,8BAE3B;IAED,SAAS,KAAK,SAAS,gCAEtB;IAED,SAAS,KAAK,eAAe,+BAE5B;IAED,SAAS,KAAK,mCAAmC,mDAEhD;IAED,SAAS,KAAK,aAAa,6BAE1B;IAED,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAK9D,0BAA0B,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ7F"}
@@ -1,6 +1,6 @@
1
1
  import { Hash } from '@xylabs/hex';
2
2
  import { ArchivistInstance } from '@xyo-network/archivist-model';
3
- import { BaseServiceParams, ChainIdentification, HydratedTransactionWithStorageMeta, PendingTransactionsService } from '@xyo-network/xl1-protocol';
3
+ import { BaseServiceParams, ChainIdentification, HydratedTransaction, PendingTransactionsService } from '@xyo-network/xl1-protocol';
4
4
  import { BaseService } from '../BaseService.ts';
5
5
  export interface XyoPendingTransactionsServiceParams extends BaseServiceParams {
6
6
  chainArchivist?: ArchivistInstance;
@@ -42,7 +42,7 @@ export declare class XyoPendingTransactionsService extends BaseService<XyoPendin
42
42
  private get pendingTransactionsCount();
43
43
  private get rejectedTransactionsArchivist();
44
44
  createHandler(): Promise<void>;
45
- getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransactionWithStorageMeta[]>;
45
+ getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransaction[]>;
46
46
  private countPendingTransactions;
47
47
  private filterAlreadyFinalizedTransactions;
48
48
  private insertNewTransactions;
@@ -1 +1 @@
1
- {"version":3,"file":"PendingTransactions.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/PendingTransactions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAOhE,OAAO,EAC6C,iBAAiB,EAAE,mBAAmB,EAAE,kCAAkC,EAClF,0BAA0B,EACrE,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAIjE,MAAM,WAAW,mCAAoC,SAAQ,iBAAiB;IAC5E,cAAc,CAAC,EAAE,iBAAiB,CAAA;IAClC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC,mCAAmC,CAAC,EAAE,iBAAiB,CAAA;IACvD,6BAA6B,CAAC,EAAE,iBAAiB,CAAA;CAClD;AAID,qBACa,6BAA8B,SAAQ,WAAW,CAAC,mCAAmC,CAAE,YAAW,0BAA0B;IACvI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAiB3B;IAEV;;;OAGG;IACH,OAAO,CAAC,8BAA8B,CAAc;IAEpD;;;OAGG;IACH,OAAO,CAAC,2CAA2C,CAA6B;IAEhF;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAAY;IAE7C;;;;OAIG;IACH,OAAO,CAAC,kCAAkC,CAAuB;IAEjE;;;OAGG;IACH,OAAO,CAAC,+CAA+C,CAAc;IAErE,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,mCAAmC,GAE9C;IAED,OAAO,KAAK,wCAAwC,GAEnD;IAED,OAAO,KAAK,wBAAwB,GAGnC;IAED,OAAO,KAAK,6BAA6B,GAExC;IAEc,aAAa;IA+BtB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,EAAE,CAAC;YA2DxF,wBAAwB;YAQxB,kCAAkC;YAUlC,qBAAqB;IA2BnC;;;;;OAKG;IACH,OAAO,CAAC,qCAAqC;YAO/B,yBAAyB;CAexC"}
1
+ {"version":3,"file":"PendingTransactions.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/PendingTransactions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAOhE,OAAO,EACqC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3D,0BAA0B,EACrE,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAIjE,MAAM,WAAW,mCAAoC,SAAQ,iBAAiB;IAC5E,cAAc,CAAC,EAAE,iBAAiB,CAAA;IAClC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC,mCAAmC,CAAC,EAAE,iBAAiB,CAAA;IACvD,6BAA6B,CAAC,EAAE,iBAAiB,CAAA;CAClD;AAID,qBACa,6BAA8B,SAAQ,WAAW,CAAC,mCAAmC,CAAE,YAAW,0BAA0B;IACvI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAiB3B;IAEV;;;OAGG;IACH,OAAO,CAAC,8BAA8B,CAAc;IAEpD;;;OAGG;IACH,OAAO,CAAC,2CAA2C,CAA6B;IAEhF;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAAY;IAE7C;;;;OAIG;IACH,OAAO,CAAC,kCAAkC,CAAuB;IAEjE;;;OAGG;IACH,OAAO,CAAC,+CAA+C,CAAc;IAErE,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,mCAAmC,GAE9C;IAED,OAAO,KAAK,wCAAwC,GAEnD;IAED,OAAO,KAAK,wBAAwB,GAGnC;IAED,OAAO,KAAK,6BAA6B,GAExC;IAEc,aAAa;IA+BtB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;YA2DzE,wBAAwB;YAQxB,kCAAkC;YAUlC,qBAAqB;IA2BnC;;;;;OAKG;IACH,OAAO,CAAC,qCAAqC;YAO/B,yBAAyB;CAexC"}
@@ -1,4 +1,4 @@
1
1
  import type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model';
2
- import type { HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol';
3
- export declare const bundledPayloadToHydratedTransaction: (payload: WithStorageMeta<PayloadBundle>) => Promise<HydratedTransactionWithStorageMeta | undefined>;
2
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol';
3
+ export declare const bundledPayloadToHydratedTransaction: (payload: WithStorageMeta<PayloadBundle>) => Promise<HydratedTransaction | undefined>;
4
4
  //# sourceMappingURL=bundledPayloadToHydratedTransaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundledPayloadToHydratedTransaction.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAChF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAGnF,eAAO,MAAM,mCAAmC,GAC9C,SAAS,eAAe,CAAC,aAAa,CAAC,KACtC,OAAO,CAAC,kCAAkC,GAAG,SAAS,CAMxD,CAAA"}
1
+ {"version":3,"file":"bundledPayloadToHydratedTransaction.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAGpE,eAAO,MAAM,mCAAmC,GAC9C,SAAS,eAAe,CAAC,aAAa,CAAC,KACtC,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAMzC,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import type { PayloadBundle } from '@xyo-network/payload-model';
2
- import type { HydratedTransaction, HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol';
3
- export declare const hydratedTransactionToPayloadBundle: (transaction: HydratedTransaction) => Promise<PayloadBundle>;
4
- export declare const hydratedTransactionWithHashStorageMetaToPayloadBundle: (transaction: HydratedTransactionWithStorageMeta) => PayloadBundle;
2
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol';
3
+ export declare const hydratedTransactionToPayloadBundle: (transaction: HydratedTransaction) => PayloadBundle;
5
4
  //# sourceMappingURL=hydratedTransactionToPayloadBundle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hydratedTransactionToPayloadBundle.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAGxG,eAAO,MAAM,kCAAkC,GAAU,aAAa,mBAAmB,KAAG,OAAO,CAAC,aAAa,CAGhH,CAAA;AAED,eAAO,MAAM,qDAAqD,GAAI,aAAa,kCAAkC,KAAG,aAGvH,CAAA"}
1
+ {"version":3,"file":"hydratedTransactionToPayloadBundle.d.ts","sourceRoot":"","sources":["../../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAGpE,eAAO,MAAM,kCAAkC,GAAI,aAAa,mBAAmB,KAAG,aAGrF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"XyoStakeIntentService.d.ts","sourceRoot":"","sources":["../../../src/StakeIntent/XyoStakeIntentService.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EAAa,IAAI,EACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,8BAA8B,CAAA;AAKtF,OAAO,EAEc,WAAW,EAE/B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,OAAO,EAAmB,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EACV,iBAAiB,EAAE,gCAAgC,EAAE,MAAM,EAC5D,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAGmF,gBAAgB,EAExG,kBAAkB,EACnB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAEjE,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,cAAc,CAAC,EAAE,iBAAiB,CAAA;IAClC,aAAa,CAAC,EAAE,gCAAgC,CAAA;IAChD,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,yBAAyB,CAAC,EAAE,iBAAiB,CAAA;CAC9C;AAWD,qBACa,qBAAsB,SAAQ,WAAW,CAAC,2BAA2B,CAAE,YAAW,kBAAkB;IAE/G,SAAS,CAAC,qBAAqB,EAAE,IAAI,GAAG,SAAS,CAAY;IAQ7D,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAoB;IAC9D,SAAS,CAAC,WAAW,+CAAkE;IACvF,SAAS,CAAC,YAAY,QAAc;gBAExB,MAAM,EAAE,2BAA2B;IAO/C,SAAS,KAAK,cAAc;;;;;;;;mNAE3B;IAED,SAAS,KAAK,aAAa,qCAE1B;IAED,SAAS,KAAK,gBAAgB,qBAE7B;IAED,SAAS,KAAK,yBAAyB;;;;;;;;mNAEtC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvC,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAO7G,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUhF,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAK3E,kBAAkB;YAkClB,YAAY;YAQZ,YAAY;YA+BZ,WAAW;CAgC1B"}
1
+ {"version":3,"file":"XyoStakeIntentService.d.ts","sourceRoot":"","sources":["../../../src/StakeIntent/XyoStakeIntentService.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EAAa,IAAI,EACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,8BAA8B,CAAA;AAKtF,OAAO,EAEc,WAAW,EAE/B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,OAAO,EAAmB,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EACV,iBAAiB,EAAE,gCAAgC,EAAE,MAAM,EAC5D,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAG2E,gBAAgB,EAEhG,kBAAkB,EACnB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAEjE,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,cAAc,CAAC,EAAE,iBAAiB,CAAA;IAClC,aAAa,CAAC,EAAE,gCAAgC,CAAA;IAChD,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,yBAAyB,CAAC,EAAE,iBAAiB,CAAA;CAC9C;AAWD,qBACa,qBAAsB,SAAQ,WAAW,CAAC,2BAA2B,CAAE,YAAW,kBAAkB;IAE/G,SAAS,CAAC,qBAAqB,EAAE,IAAI,GAAG,SAAS,CAAY;IAQ7D,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAoB;IAC9D,SAAS,CAAC,WAAW,+CAAkE;IACvF,SAAS,CAAC,YAAY,QAAc;gBAExB,MAAM,EAAE,2BAA2B;IAO/C,SAAS,KAAK,cAAc;;;;;;;;mNAE3B;IAED,SAAS,KAAK,aAAa,qCAE1B;IAED,SAAS,KAAK,gBAAgB,qBAE7B;IAED,SAAS,KAAK,yBAAyB;;;;;;;;mNAEtC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvC,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAO7G,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUhF,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAK3E,kBAAkB;YAkClB,YAAY;YAQZ,YAAY;YA+BZ,WAAW;CAgC1B"}
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.5.30",
4
+ "version": "1.5.32",
5
5
  "description": "XYO Layer One SDK Services",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -52,21 +52,21 @@
52
52
  "@xyo-network/boundwitness-model": "^3.18.8",
53
53
  "@xyo-network/boundwitness-validator": "^3.18.8",
54
54
  "@xyo-network/boundwitness-wrapper": "^3.18.8",
55
- "@xyo-network/chain-analyze": "^1.5.30",
56
- "@xyo-network/chain-ethereum": "^1.5.30",
57
- "@xyo-network/chain-modules": "^1.5.30",
58
- "@xyo-network/chain-protocol": "^1.5.30",
59
- "@xyo-network/chain-telemetry": "^1.5.30",
60
- "@xyo-network/chain-utils": "^1.5.30",
61
- "@xyo-network/chain-validation": "^1.5.30",
62
- "@xyo-network/chain-wrappers": "^1.5.30",
55
+ "@xyo-network/chain-analyze": "^1.5.32",
56
+ "@xyo-network/chain-ethereum": "^1.5.32",
57
+ "@xyo-network/chain-modules": "^1.5.32",
58
+ "@xyo-network/chain-protocol": "^1.5.32",
59
+ "@xyo-network/chain-telemetry": "^1.5.32",
60
+ "@xyo-network/chain-utils": "^1.5.32",
61
+ "@xyo-network/chain-validation": "^1.5.32",
62
+ "@xyo-network/chain-wrappers": "^1.5.32",
63
63
  "@xyo-network/payload-builder": "^3.18.8",
64
64
  "@xyo-network/payload-model": "^3.18.8",
65
65
  "@xyo-network/typechain": "^3.5.4",
66
- "@xyo-network/xl1-protocol": "^1.4.25",
67
- "@xyo-network/xl1-protocol-sdk": "^1.5.30",
66
+ "@xyo-network/xl1-protocol": "^1.4.34",
67
+ "@xyo-network/xl1-protocol-sdk": "^1.5.32",
68
68
  "async-mutex": "^0.5.0",
69
- "ethers": "6.14.3",
69
+ "ethers": "6.14.4",
70
70
  "lru-cache": "^11.1.0",
71
71
  "web3-types": "^1.10.0"
72
72
  },
@@ -78,7 +78,7 @@
78
78
  "@xylabs/vitest-extended": "^4.11.20",
79
79
  "@xyo-network/account": "^3.18.8",
80
80
  "@xyo-network/account-model": "^3.18.8",
81
- "@xyo-network/chain-validation": "^1.5.30",
81
+ "@xyo-network/chain-validation": "^1.5.32",
82
82
  "@xyo-network/wallet": "^3.18.8",
83
83
  "knip": "^5.61.0",
84
84
  "typescript": "^5.8.3",
@@ -1,5 +1,4 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
- import type { BaseParams } from '@xylabs/base'
3
2
  import { isDefined, isNull } from '@xylabs/typeof'
4
3
  import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
4
  import { PayloadBuilder } from '@xyo-network/payload-builder'
@@ -10,7 +9,7 @@ import type {
10
9
  XyoChainIteratorParams,
11
10
  } from '@xyo-network/xl1-protocol'
12
11
  import {
13
- asBlockBoundWitness, asOptionalBlockBoundWitness,
12
+ asBlockBoundWitness,
14
13
  isBlockBoundWitness,
15
14
  } from '@xyo-network/xl1-protocol'
16
15
  import { LRUCache } from 'lru-cache'
@@ -70,7 +69,7 @@ export class ChainBlockNumberIterationService extends BaseService<XyoChainIterat
70
69
  const { previous } = currentBlock
71
70
  if (isNull(previous)) break
72
71
  const nextBlock = await this.chainArchivist.get([previous])
73
- currentBlock = asOptionalBlockBoundWitness(nextBlock[0])
72
+ currentBlock = asBlockBoundWitness(nextBlock[0])
74
73
  } else {
75
74
  const hash = PayloadBuilder.hash(currentBlock)
76
75
  assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`)
@@ -2,7 +2,6 @@ import { assertEx } from '@xylabs/assert'
2
2
  import { Promisable } from '@xylabs/promise'
3
3
  import { AccountInstance } from '@xyo-network/account-model'
4
4
  import { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'
5
- import { PayloadBuilder } from '@xyo-network/payload-builder'
6
5
  import {
7
6
  BaseServiceParams,
8
7
  BlockBoundWitness,
@@ -11,17 +10,12 @@ import {
11
10
  ElectionService,
12
11
  HydratedBlockStateValidationFunction,
13
12
  HydratedTransaction,
14
- HydratedTransactionWithStorageMeta,
15
13
  StakeIntentService,
16
14
  } from '@xyo-network/xl1-protocol'
17
15
 
18
16
  import { BaseService, creatableService } from '../BaseService.ts'
19
17
  import { Validator } from './model/index.ts'
20
18
 
21
- const addStorageMeta = async ([tx, payloads]: HydratedTransaction): Promise<HydratedTransactionWithStorageMeta> => {
22
- return [await PayloadBuilder.addStorageMeta(tx), await PayloadBuilder.addStorageMeta(payloads)]
23
- }
24
-
25
19
  export interface XyoValidatorParams extends BaseServiceParams {
26
20
  account: AccountInstance
27
21
  chainArchivist: ReadArchivist
@@ -69,7 +63,7 @@ export class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParam
69
63
 
70
64
  // TODO: Move to validator and inherit this class from validator
71
65
  async validatePendingTransaction(hydratedTransaction: HydratedTransaction): Promise<boolean> {
72
- const [tx] = await addStorageMeta(hydratedTransaction)
66
+ const [tx] = hydratedTransaction
73
67
  // Ensure not confirmed already (replay attack)
74
68
  if ((await this.chainArchivist.get([tx._hash])).length > 0) return false
75
69
  // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)
@@ -13,14 +13,14 @@ import {
13
13
  Payload, PayloadBundle, Sequence, WithStorageMeta,
14
14
  } from '@xyo-network/payload-model'
15
15
  import {
16
- asOptionalTransactionBoundWitnessWithStorageMeta, BaseServiceParams, ChainIdentification, HydratedTransactionWithStorageMeta,
16
+ asTransactionBoundWitnessWithStorageMeta, BaseServiceParams, ChainIdentification, HydratedTransaction,
17
17
  isTransactionBoundWitnessWithStorageMeta, PendingTransactionsService,
18
18
  } from '@xyo-network/xl1-protocol'
19
19
  import { Mutex } from 'async-mutex'
20
20
 
21
21
  import { BaseService, creatableService } from '../BaseService.ts'
22
22
  import { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'
23
- import { hydratedTransactionWithHashStorageMetaToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'
23
+ import { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'
24
24
 
25
25
  export interface XyoPendingTransactionsServiceParams extends BaseServiceParams {
26
26
  chainArchivist?: ArchivistInstance
@@ -138,11 +138,11 @@ export class XyoPendingTransactionsService extends BaseService<XyoPendingTransac
138
138
  globalAttributes.setAttribute('XyoPendingTransactionsService:status', 'created')
139
139
  }
140
140
 
141
- async getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransactionWithStorageMeta[]> {
141
+ async getPendingTransactions(head: Hash, limit: number): Promise<HydratedTransaction[]> {
142
142
  return await this.spanAsync('getPendingTransactions', async () => {
143
143
  // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.
144
144
  return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
145
- const foundPendingTransactions: HydratedTransactionWithStorageMeta[] = []
145
+ const foundPendingTransactions: HydratedTransaction[] = []
146
146
  const foundPendingTransactionsToDeleteHashes: Hash[] = []
147
147
 
148
148
  let cursor: Sequence | undefined
@@ -235,7 +235,7 @@ export class XyoPendingTransactionsService extends BaseService<XyoPendingTransac
235
235
  return errors.length > 0 ? false : true
236
236
  })
237
237
  if (validTransactions.length > 0) {
238
- const bundledTransactions = validTransactions.map(tx => hydratedTransactionWithHashStorageMetaToPayloadBundle(tx))
238
+ const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))
239
239
  await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)
240
240
  }
241
241
  }, XyoPendingTransactionsService.MutexPriority.InsertNewTransactions)
@@ -263,7 +263,7 @@ export class XyoPendingTransactionsService extends BaseService<XyoPendingTransac
263
263
  return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
264
264
  const bundledTransactions = (await Promise.all(bundledPayloads.map(async (payload) => {
265
265
  const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)
266
- const tx = asOptionalTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))
266
+ const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))
267
267
  return tx !== undefined && payload._hash !== undefined ? tx : undefined
268
268
  }))).filter(exists)
269
269
  await this.pendingBundledTransactionsLocalArchivist.delete(bundledTransactions.map(btx => btx._hash))
@@ -1,13 +1,13 @@
1
1
  import { PayloadBuilder } from '@xyo-network/payload-builder'
2
2
  import type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'
3
- import type { HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'
4
- import { asOptionalTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'
3
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol'
4
+ import { asTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'
5
5
 
6
6
  export const bundledPayloadToHydratedTransaction = async (
7
7
  payload: WithStorageMeta<PayloadBundle>,
8
- ): Promise<HydratedTransactionWithStorageMeta | undefined> => {
8
+ ): Promise<HydratedTransaction | undefined> => {
9
9
  const withStorageMeta = await PayloadBuilder.addStorageMeta(payload.payloads)
10
- const tx = asOptionalTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))
10
+ const tx = asTransactionBoundWitnessWithStorageMeta(withStorageMeta.find(p => p._hash === payload.root))
11
11
  if (tx) {
12
12
  return [tx, withStorageMeta.filter(p => p._hash !== payload.root)]
13
13
  }
@@ -2,20 +2,15 @@ import type { Hash } from '@xylabs/hex'
2
2
  import { PayloadBuilder } from '@xyo-network/payload-builder'
3
3
  import type { PayloadBundle } from '@xyo-network/payload-model'
4
4
  import { PayloadBundleSchema } from '@xyo-network/payload-model'
5
- import type { HydratedTransaction, HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'
5
+ import type { HydratedTransaction } from '@xyo-network/xl1-protocol'
6
6
  import { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'
7
7
 
8
- export const hydratedTransactionToPayloadBundle = async (transaction: HydratedTransaction): Promise<PayloadBundle> => {
9
- const root = await PayloadBuilder.hash(transaction[0])
10
- return bundle(root, transaction)
11
- }
12
-
13
- export const hydratedTransactionWithHashStorageMetaToPayloadBundle = (transaction: HydratedTransactionWithStorageMeta): PayloadBundle => {
8
+ export const hydratedTransactionToPayloadBundle = (transaction: HydratedTransaction): PayloadBundle => {
14
9
  const root = transaction[0]._hash
15
10
  return bundle(root, transaction)
16
11
  }
17
12
 
18
- const bundle = (root: Hash, transaction: HydratedTransaction | HydratedTransactionWithStorageMeta) => {
13
+ const bundle = (root: Hash, transaction: HydratedTransaction) => {
19
14
  const payloads = flattenHydratedTransaction(transaction).flatMap(p => PayloadBuilder.omitStorageMeta(p))
20
15
  return new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema })
21
16
  .fields({ payloads, root })
@@ -19,9 +19,9 @@ import type {
19
19
  BaseServiceParams, EventingChainBlockNumberIterator, Intent,
20
20
  } from '@xyo-network/xl1-protocol'
21
21
  import {
22
+ asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta,
22
23
  asChainIndexingServiceStateWithStorageMeta,
23
- asOptionalBlockBoundWitness, asOptionalBlockBoundWitnessWithStorageMeta,
24
- asOptionalChainStakeIntent, ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,
24
+ asChainStakeIntent, ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,
25
25
  isChainIndexingServiceState,
26
26
  StakeIntentService,
27
27
  } from '@xyo-network/xl1-protocol'
@@ -157,7 +157,7 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
157
157
  }
158
158
 
159
159
  private async recoverState(current: Hash): Promise<void> {
160
- const currentBlock = assertEx(asOptionalBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)
160
+ const currentBlock = assertEx(asBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)
161
161
  const currentBlockNum = currentBlock.block
162
162
  // Find last state before current head (in case of rollback, we indexed past it on an uncle chain, etc.)
163
163
  const opts: ArchivistNextOptions = { ...DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS }
@@ -169,7 +169,7 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
169
169
  const state = await findFirstMatching(this.stakeIntentStateArchivist, predicate, opts)
170
170
  if (isChainIndexingServiceState<SerializedIntervalMap>(state)) {
171
171
  const indexed = (await this.chainArchivist.get([state.endBlockHash]))?.[0]
172
- const indexedBlock = asOptionalBlockBoundWitnessWithStorageMeta(indexed)
172
+ const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed)
173
173
  if (indexedBlock) {
174
174
  const indexedBlockNum = indexedBlock.block
175
175
  if (indexedBlockNum <= currentBlockNum) {
@@ -196,7 +196,7 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
196
196
  const currentHead = await this.chainIterator.head()
197
197
  const currentHeadHash = await PayloadBuilder.hash(currentHead)
198
198
  const result = await analyzeChain(this.chainArchivist, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)
199
- const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asOptionalChainStakeIntent)
199
+ const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)
200
200
  if (currentHead.block === undefined) return
201
201
  const currentHeadBlockNum = currentHead.block
202
202
  if (displayProgress) this.logger?.info(`Updating index through 0x${currentHeadBlockNum}`)
@@ -9,7 +9,7 @@ import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
9
9
  import type {
10
10
  BlockBoundWitness, ChainStakeIntent, Intent,
11
11
  } from '@xyo-network/xl1-protocol'
12
- import { asOptionalChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'
12
+ import { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'
13
13
 
14
14
  export const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness, archivist: ArchivistInstance, intent: Intent): Promise<ChainStakeIntent[]> => {
15
15
  // Get payloads in block
@@ -28,7 +28,7 @@ export const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness,
28
28
  // Get staked intent payloads
29
29
  const payloads = await archivist.get(stakeIntentHashes)
30
30
  // Filter payloads to staked intents
31
- const stakeIntents = filterAs(payloads, asOptionalChainStakeIntent)
31
+ const stakeIntents = filterAs(payloads, asChainStakeIntent)
32
32
  // that are producers
33
33
  .filter(p => p.intent === intent)
34
34
  // where the issuer of the intent is also the signer of this BW