@xyo-network/chain-services 1.18.4 → 1.18.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,10 @@
1
1
  import { Address, Promisable } from '@xylabs/sdk-js';
2
2
  import { ReadArchivist } from '@xyo-network/archivist-model';
3
- import { AbstractCreatableProvider, AttoXL1, EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, StepIdentity, StepIdentityString } from '@xyo-network/xl1-sdk';
3
+ import { AbstractCreatableProvider, AttoXL1, NetworkStakeStepRewardService, StepIdentity, StepIdentityString } from '@xyo-network/xl1-sdk';
4
4
  import { Provider } from 'ethers';
5
5
  import { BaseServiceParams } from '../model/index.ts';
6
6
  export interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {
7
7
  chainArchivist: ReadArchivist;
8
- chainIterator: EventingChainBlockNumberIteratorService;
9
8
  ethProvider?: Provider;
10
9
  }
11
10
  export declare class BaseNetworkStakeStepRewardService extends AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseNetworkStakeStepRewardService.d.ts","sourceRoot":"","sources":["../../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  export * from './AccountBalance/index.ts';
2
2
  export * from './BlockReward/index.ts';
3
- export * from './blockViewerFromChainIteratorAndArchivist.ts';
4
3
  export * from './ChainValidator/index.ts';
5
4
  export * from './Election/index.ts';
6
5
  export * from './implementation/index.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,+CAA+C,CAAA;AAC7D,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA"}
@@ -102,104 +102,8 @@ EvmBlockRewardViewer = _ts_decorate([
102
102
  creatable()
103
103
  ], EvmBlockRewardViewer);
104
104
 
105
- // src/blockViewerFromChainIteratorAndArchivist.ts
106
- import { isDefined } from "@xylabs/sdk-js";
107
- import { PayloadBuilder } from "@xyo-network/payload-builder";
108
- import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta, BlockViewerMoniker } from "@xyo-network/xl1-sdk";
109
- function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
110
- const result = {
111
- blockByHash: /* @__PURE__ */ __name(async function(hash) {
112
- const [payload] = await chainArchivist.get([
113
- hash
114
- ]);
115
- const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
116
- if (isDefined(block)) {
117
- const payloads = await chainArchivist.get(block.payload_hashes);
118
- return [
119
- block,
120
- payloads
121
- ];
122
- }
123
- return null;
124
- }, "blockByHash"),
125
- blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
126
- const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
127
- const block = payload ? await PayloadBuilder.addHashMeta(payload) : void 0;
128
- if (isDefined(block)) {
129
- const payloads = await chainArchivist.get(block.payload_hashes);
130
- return [
131
- block,
132
- payloads
133
- ];
134
- }
135
- return null;
136
- }, "blockByNumber"),
137
- blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
138
- const results = [];
139
- for (let i = 0; i < limit; i++) {
140
- const block = await this.blockByHash(hash);
141
- if (block) {
142
- results.push(block);
143
- } else {
144
- break;
145
- }
146
- }
147
- return results;
148
- }, "blocksByHash"),
149
- blocksByNumber: /* @__PURE__ */ __name(async function(number, limit = 10) {
150
- const results = [];
151
- for (let i = 0; i < limit; i++) {
152
- const block = await this.blockByNumber(number);
153
- if (block) {
154
- results.push(block);
155
- } else {
156
- break;
157
- }
158
- }
159
- return results;
160
- }, "blocksByNumber"),
161
- chainId: /* @__PURE__ */ __name(async function(blockNumber = "latest") {
162
- const block = blockNumber === "latest" ? await this.currentBlock() : await this.blockByNumber(blockNumber);
163
- if (!block) {
164
- throw new Error(`Block not found for block number: ${blockNumber}`);
165
- }
166
- return block[0].chain;
167
- }, "chainId"),
168
- currentBlock: /* @__PURE__ */ __name(async function() {
169
- const head = await chainIterator.head();
170
- return this.blockByHash(head._hash);
171
- }, "currentBlock"),
172
- currentBlockHash: /* @__PURE__ */ __name(async function() {
173
- const head = await chainIterator.head();
174
- return head._hash;
175
- }, "currentBlockHash"),
176
- currentBlockNumber: /* @__PURE__ */ __name(async function() {
177
- const head = await chainIterator.head();
178
- return head.block;
179
- }, "currentBlockNumber"),
180
- moniker: BlockViewerMoniker,
181
- payloadByHash: /* @__PURE__ */ __name(function(_hash) {
182
- throw new Error("Function not implemented.");
183
- }, "payloadByHash"),
184
- payloadsByHash: /* @__PURE__ */ __name(function(_hashes) {
185
- throw new Error("Function not implemented.");
186
- }, "payloadsByHash"),
187
- rate(..._args) {
188
- throw new Error("Function not implemented.");
189
- },
190
- stepSizeRate(..._args) {
191
- throw new Error("Function not implemented.");
192
- },
193
- timeDurationRate(..._args) {
194
- throw new Error("Function not implemented.");
195
- }
196
- };
197
- return result;
198
- }
199
- __name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
200
-
201
105
  // src/ChainValidator/XyoValidator.ts
202
- import { AbstractCreatableProvider, BlockViewerMoniker as BlockViewerMoniker2 } from "@xyo-network/xl1-sdk";
106
+ import { AbstractCreatableProvider, BlockViewerMoniker } from "@xyo-network/xl1-sdk";
203
107
  var XyoValidator = class extends AbstractCreatableProvider {
204
108
  static {
205
109
  __name(this, "XyoValidator");
@@ -228,7 +132,7 @@ var XyoValidator = class extends AbstractCreatableProvider {
228
132
  // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')
229
133
  // }
230
134
  async createHandler() {
231
- this._blockViewer = await this.locator.getInstance(BlockViewerMoniker2);
135
+ this._blockViewer = await this.locator.getInstance(BlockViewerMoniker);
232
136
  }
233
137
  validatePendingBlock(_block) {
234
138
  return [];
@@ -296,13 +200,13 @@ BaseElectionService = _ts_decorate2([
296
200
  import { assertEx as assertEx7 } from "@xylabs/sdk-js";
297
201
 
298
202
  // src/implementation/evm/initInfuraProvider.ts
299
- import { assertEx as assertEx5, isDefined as isDefined3 } from "@xylabs/sdk-js";
203
+ import { assertEx as assertEx5, isDefined as isDefined2 } from "@xylabs/sdk-js";
300
204
  import { InfuraProvider } from "ethers/providers";
301
205
 
302
206
  // src/implementation/evm/initChainId.ts
303
- import { assertEx as assertEx4, hexFrom, isDefined as isDefined2, isHex } from "@xylabs/sdk-js";
207
+ import { assertEx as assertEx4, hexFrom, isDefined, isHex } from "@xylabs/sdk-js";
304
208
  var canUseChainId = /* @__PURE__ */ __name((config) => {
305
- return isDefined2(config.evm.chainId);
209
+ return isDefined(config.evm.chainId);
306
210
  }, "canUseChainId");
307
211
  var getChainId = /* @__PURE__ */ __name((config) => {
308
212
  const chainId = assertEx4(config.evm.chainId, () => "Missing config.evm.chainId");
@@ -327,7 +231,7 @@ var initInfuraProvider = /* @__PURE__ */ __name((config) => {
327
231
  return instance;
328
232
  }, "initInfuraProvider");
329
233
  var canUseInfuraProvider = /* @__PURE__ */ __name((config) => {
330
- return canUseChainId(config) && isDefined3(config.evm?.infura?.projectId) && isDefined3(config.evm?.infura?.projectSecret);
234
+ return canUseChainId(config) && isDefined2(config.evm?.infura?.projectId) && isDefined2(config.evm?.infura?.projectSecret);
331
235
  }, "canUseInfuraProvider");
332
236
  var getInfuraProviderConfig = /* @__PURE__ */ __name((config) => {
333
237
  const projectId = assertEx5(config.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
@@ -340,14 +244,14 @@ var getInfuraProviderConfig = /* @__PURE__ */ __name((config) => {
340
244
  }, "getInfuraProviderConfig");
341
245
 
342
246
  // src/implementation/evm/initJsonRpcProvider.ts
343
- import { assertEx as assertEx6, isDefined as isDefined4 } from "@xylabs/sdk-js";
247
+ import { assertEx as assertEx6, isDefined as isDefined3 } from "@xylabs/sdk-js";
344
248
  import { JsonRpcProvider } from "ethers/providers";
345
249
  var initJsonRpcProvider = /* @__PURE__ */ __name((config) => {
346
250
  const providerConfig = getJsonRpcProviderConfig(config);
347
251
  return Promise.resolve(new JsonRpcProvider(...providerConfig));
348
252
  }, "initJsonRpcProvider");
349
253
  var canUseJsonRpcProvider = /* @__PURE__ */ __name((config) => {
350
- return canUseChainId(config) && isDefined4(config.evm.jsonRpc?.url);
254
+ return canUseChainId(config) && isDefined3(config.evm.jsonRpc?.url);
351
255
  }, "canUseJsonRpcProvider");
352
256
  var getJsonRpcProviderConfig = /* @__PURE__ */ __name((config) => {
353
257
  const jsonRpcUrl = assertEx6(config.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
@@ -469,16 +373,16 @@ BaseNetworkStakeStepRewardService = _ts_decorate3([
469
373
 
470
374
  // src/PendingTransactions/BasePendingTransactions.ts
471
375
  import { ValueType } from "@opentelemetry/api";
472
- import { assertEx as assertEx8, exists, filterAs, filterAsync, forget, isDefined as isDefined5, isUndefined } from "@xylabs/sdk-js";
376
+ import { assertEx as assertEx8, exists, filterAs, filterAsync, forget, isDefined as isDefined4, isUndefined } from "@xylabs/sdk-js";
473
377
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
474
378
  import { AbstractCreatableProvider as AbstractCreatableProvider4, asBlockBoundWitnessWithHashMeta, asXL1BlockNumber, creatableProvider as creatableProvider3, findMostRecentBlock as findMostRecentBlock2, isTransactionBoundWitnessWithStorageMeta, MempoolViewerMoniker, TransactionJsonSchemaValidator, validateTransaction } from "@xyo-network/xl1-sdk";
475
379
  import { Mutex } from "async-mutex";
476
380
 
477
381
  // src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
478
- import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
382
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
479
383
  import { asSignedTransactionBoundWitnessWithHashMeta } from "@xyo-network/xl1-sdk";
480
384
  var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
481
- const withHashMeta = await PayloadBuilder2.addHashMeta(payload.payloads);
385
+ const withHashMeta = await PayloadBuilder.addHashMeta(payload.payloads);
482
386
  const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find((p) => p._hash === payload.root));
483
387
  if (tx) {
484
388
  return [
@@ -489,7 +393,7 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
489
393
  }, "bundledPayloadToHydratedTransaction");
490
394
 
491
395
  // src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
492
- import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
396
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
493
397
  import { PayloadBundleSchema } from "@xyo-network/payload-model";
494
398
  import { flattenHydratedTransaction } from "@xyo-network/xl1-sdk";
495
399
  var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
@@ -497,8 +401,8 @@ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) =>
497
401
  return bundle(root, transaction);
498
402
  }, "hydratedTransactionToPayloadBundle");
499
403
  var bundle = /* @__PURE__ */ __name((root, transaction) => {
500
- const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder3.omitStorageMeta(p));
501
- return new PayloadBuilder3({
404
+ const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder2.omitStorageMeta(p));
405
+ return new PayloadBuilder2({
502
406
  schema: PayloadBundleSchema
503
407
  }).fields({
504
408
  payloads,
@@ -662,7 +566,7 @@ var BasePendingTransactionsService = class _BasePendingTransactionsService exten
662
566
  async cleanupWorker() {
663
567
  return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
664
568
  const lastHead = await findMostRecentBlock2(this.chainArchivist);
665
- if (isDefined5(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
569
+ if (isDefined4(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
666
570
  }, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
667
571
  }
668
572
  async countPendingTransactions() {
@@ -726,7 +630,7 @@ var BasePendingTransactionsService = class _BasePendingTransactionsService exten
726
630
  let [lastHead] = filterAs(await this.chainArchivist.get([
727
631
  head
728
632
  ]), (x) => asBlockBoundWitnessWithHashMeta(x));
729
- while (isDefined5(lastHead)) {
633
+ while (isDefined4(lastHead)) {
730
634
  const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
731
635
  limit: 100,
732
636
  order: "asc",
@@ -811,23 +715,23 @@ BaseSchemasService = _ts_decorate5([
811
715
  ], BaseSchemasService);
812
716
 
813
717
  // src/simple/block/runner/SimpleBlockRunner.ts
814
- import { assertEx as assertEx10, exists as exists2, hexToBigInt, isDefined as isDefined6 } from "@xylabs/sdk-js";
718
+ import { assertEx as assertEx10, exists as exists2, hexToBigInt, isDefined as isDefined5 } from "@xylabs/sdk-js";
815
719
  import { MemoryArchivist as MemoryArchivist2 } from "@xyo-network/archivist-memory";
816
720
  import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
817
721
  import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
818
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
722
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
819
723
  import { AbstractCreatableProvider as AbstractCreatableProvider6, AccountBalanceViewerMoniker, asBlockBoundWitness, AttoXL1, BlockNumberSchema, BlockRewardViewerMoniker as BlockRewardViewerMoniker2, BlockRunnerMoniker, BlockValidationViewerMoniker, creatableProvider as creatableProvider5, createDeclarationIntent as createDeclarationIntent2, defaultRewardRatio, MempoolRunnerMoniker, MempoolViewerMoniker as MempoolViewerMoniker2, TimeSyncViewerMoniker, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-sdk";
820
724
 
821
725
  // src/simple/block/runner/generateTransactionFeeTransfers.ts
822
726
  import { hexFromBigInt } from "@xylabs/sdk-js";
823
727
  import { assertEx as assertEx9 } from "@xylabs/sdk-js";
824
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
728
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
825
729
  import { HydratedTransactionWrapper, transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-sdk";
826
730
  async function generateTransactionFeeTransfers(address, transactions) {
827
731
  const txs = await Promise.all(transactions.map(async (tx) => {
828
732
  return HydratedTransactionWrapper.parse([
829
- await PayloadBuilder4.addStorageMeta(tx[0]),
830
- await PayloadBuilder4.addStorageMeta(tx[1])
733
+ await PayloadBuilder3.addStorageMeta(tx[0]),
734
+ await PayloadBuilder3.addStorageMeta(tx[1])
831
735
  ]);
832
736
  }));
833
737
  const txBaseFeeCosts = {};
@@ -998,7 +902,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
998
902
  }
999
903
  });
1000
904
  }
1001
- const blockId = new PayloadBuilder5({
905
+ const blockId = new PayloadBuilder4({
1002
906
  schema: BlockNumberSchema
1003
907
  }).fields({
1004
908
  block
@@ -1110,7 +1014,7 @@ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatableProvid
1110
1014
  */
1111
1015
  heartbeatRequired(head) {
1112
1016
  const epoch = head.$epoch;
1113
- if (isDefined6(epoch)) {
1017
+ if (isDefined5(epoch)) {
1114
1018
  const { heartbeatInterval } = this.params.context.config.producer;
1115
1019
  if (Date.now() - epoch > heartbeatInterval) {
1116
1020
  return true;
@@ -1153,8 +1057,8 @@ var mapBoundWitnessToStakeIntentHashes = /* @__PURE__ */ __name((bw) => {
1153
1057
  import { asAddress, assertEx as assertEx11, filterAs as filterAs3, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
1154
1058
  import { analyzeChain, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
1155
1059
  import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
1156
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1157
- import { AbstractCreatableProvider as AbstractCreatableProvider7, asChainIndexingServiceStateWithStorageMeta, BlockViewerMoniker as BlockViewerMoniker3, ChainIndexingServiceStateSchema, ChainStakeViewerMoniker, creatableProvider as creatableProvider6, isChainIndexingServiceState, readPayloadMapFromStore, timeBudget } from "@xyo-network/xl1-sdk";
1060
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1061
+ import { AbstractCreatableProvider as AbstractCreatableProvider7, asChainIndexingServiceStateWithStorageMeta, BlockViewerMoniker as BlockViewerMoniker2, ChainIndexingServiceStateSchema, ChainStakeViewerMoniker, creatableProvider as creatableProvider6, isChainIndexingServiceState, readPayloadMapFromStore, timeBudget } from "@xyo-network/xl1-sdk";
1158
1062
  import { asBlockBoundWitness as asBlockBoundWitness2, asBlockBoundWitnessWithStorageMeta, asChainStakeIntent as asChainStakeIntent2 } from "@xyo-network/xl1-sdk";
1159
1063
  import { Mutex as Mutex2 } from "async-mutex";
1160
1064
  import { LRUCache } from "lru-cache";
@@ -1214,7 +1118,7 @@ var XyoStakeIntentService = class _XyoStakeIntentService extends AbstractCreatab
1214
1118
  };
1215
1119
  }
1216
1120
  async createHandler() {
1217
- this._blockViewer = await this.locator.getInstance(BlockViewerMoniker3);
1121
+ this._blockViewer = await this.locator.getInstance(BlockViewerMoniker2);
1218
1122
  this._chainStakeViewer = await this.locator.getInstance(ChainStakeViewerMoniker);
1219
1123
  const head = await this.blockViewer.currentBlock();
1220
1124
  if (isUndefined2(head)) return;
@@ -1284,7 +1188,7 @@ var XyoStakeIntentService = class _XyoStakeIntentService extends AbstractCreatab
1284
1188
  }
1285
1189
  async persistState(current) {
1286
1190
  const state = this._producers.serialize();
1287
- const payload = new PayloadBuilder6({
1191
+ const payload = new PayloadBuilder5({
1288
1192
  schema: ChainIndexingServiceStateSchema
1289
1193
  }).fields({
1290
1194
  endBlockHash: current,
@@ -1401,7 +1305,6 @@ export {
1401
1305
  XyoStakeIntentService,
1402
1306
  XyoValidator,
1403
1307
  accountBalancesViewerFromArchivist,
1404
- blockViewerFromChainIteratorAndArchivist,
1405
1308
  canUseEvmProvider,
1406
1309
  createBootstrapHead,
1407
1310
  getBlockSignedStakeDeclarations,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/blockViewerFromChainIteratorAndArchivist.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/evm/initEvmProvider.ts","../../src/implementation/evm/initInfuraProvider.ts","../../src/implementation/evm/initChainId.ts","../../src/implementation/evm/initJsonRpcProvider.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/Schemas/BaseSchemasService.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadWriteArchivist } from '@xyo-network/archivist-model'\nimport type {\n Payload, WithHashMeta, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer, BalancesStepSummary, ChainId,\n CreatableProviderContext, SimpleAccountBalanceViewerParams, TransfersStepSummary,\n} from '@xyo-network/xl1-sdk'\nimport {\n findMostRecentBlock, LruCacheMap, payloadMapFromStore,\n SimpleAccountBalanceViewer, StepSizes,\n} from '@xyo-network/xl1-sdk'\nimport { Semaphore } from 'async-mutex'\n\n// this is intended to only be used for testing\nexport const accountBalancesViewerFromArchivist = async (\n context: CreatableProviderContext,\n chainId: ChainId,\n archivist: ReadWriteArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceViewer> => {\n const summaryMap = new LruCacheMap<string, WithHashMeta<BalancesStepSummary>>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const transferSummaryMap = new LruCacheMap<string, WithHashMeta<TransfersStepSummary>>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async (): Promise<[Hash, number]> => {\n const head = assertEx(await findMostRecentBlock(archivist), () => 'No blocks found in chainArchivist')\n return [head._hash, head.block]\n }\n\n const service = await SimpleAccountBalanceViewer.create({\n context,\n balanceSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n singletons: context.singletons,\n caches: context.caches,\n },\n transfersSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n head: headFunc,\n singletons: context.singletons,\n caches: context.caches,\n },\n } satisfies SimpleAccountBalanceViewerParams)\n return service\n}\n","import {\n AbstractCreatable,\n assertEx, creatable, CreatableParams, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport {\n asAttoXL1, AttoXL1, BlockRewardViewer,\n BlockRewardViewerMoniker,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n}\n","import type { Hash, Promisable } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithHashMeta } from '@xyo-network/payload-model'\nimport type {\n BlockRate,\n BlockViewer, EventingChainBlockNumberIteratorService,\n SignedHydratedBlockWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport {\n asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta, BlockViewerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nexport function blockViewerFromChainIteratorAndArchivist(\n chainIterator: EventingChainBlockNumberIteratorService,\n chainArchivist: ReadArchivist,\n): BlockViewer {\n const result = {\n blockByHash: async function (hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n const [payload] = await chainArchivist.get([hash])\n const block = asSignedBlockBoundWitnessWithStorageMeta(payload)\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber))\n const block = payload ? await PayloadBuilder.addHashMeta(payload) : undefined\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blocksByHash: async function (hash: Hash, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByHash(hash)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n blocksByNumber: async function (number: XL1BlockNumber, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByNumber(number)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n chainId: async function (blockNumber: XL1BlockNumber | 'latest' = 'latest') {\n const block = blockNumber === 'latest'\n ? await this.currentBlock()\n : await this.blockByNumber(blockNumber)\n if (!block) {\n throw new Error(`Block not found for block number: ${blockNumber}`)\n }\n return block[0].chain\n },\n currentBlock: async function (): Promise<SignedHydratedBlockWithHashMeta> {\n const head = await chainIterator.head()\n return this.blockByHash(head._hash) as Promise<SignedHydratedBlockWithHashMeta>\n },\n currentBlockHash: async function (): Promise<Hash> {\n const head = await chainIterator.head()\n return head._hash\n },\n currentBlockNumber: async function (): Promise<XL1BlockNumber> {\n const head = await chainIterator.head()\n return head.block\n },\n moniker: BlockViewerMoniker,\n payloadByHash: function (_hash: Hash): Promisable<WithHashMeta<Payload> | null> {\n throw new Error('Function not implemented.')\n },\n payloadsByHash: function (_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {\n throw new Error('Function not implemented.')\n },\n rate(..._args): Promisable<BlockRate> {\n throw new Error('Function not implemented.')\n },\n stepSizeRate(..._args) {\n throw new Error('Function not implemented.')\n },\n timeDurationRate(..._args) {\n throw new Error('Function not implemented.')\n },\n } satisfies BlockViewer\n return result\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import {\n Address, assertEx, Hash,\n} from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\nimport { BlockBoundWitness } from '@xyo-network/xl1-sdk'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, { timeBudgetLimit: 200 })\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Pick<Config, 'evm'>; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Pick<Config, 'evm'> }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Pick<Config, 'evm'>) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Pick<Config, 'evm'>): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Pick<Config, 'evm'>) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import {\n assertEx, hexFrom, isDefined, isHex,\n} from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\n\nexport const canUseChainId = (config: Pick<Config, 'evm'>): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Pick<Config, 'evm'>) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Pick<Config, 'evm'>) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: WalletInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { Address, Promisable } from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n AbstractCreatableProvider,\n AttoXL1,\n creatableProvider,\n EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import { ValueType } from '@opentelemetry/api'\nimport {\n assertEx,\n exists,\n filterAs, filterAsync, forget, Hash,\n isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n asBlockBoundWitnessWithHashMeta, asXL1BlockNumber, ChainId, creatableProvider,\n findMostRecentBlock, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta,\n MempoolViewer, MempoolViewerMoniker, PendingBlocksOptions, PendingTransactionsOptions,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n SignedHydratedTransactionWithStorageMeta,\n TransactionJsonSchemaValidator, validateTransaction,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist: ArchivistInstance\n chainId: ChainId\n pendingBundledTransactionsArchivist: ArchivistInstance\n rejectedTransactionsArchivist: ArchivistInstance\n}\n\n@creatableProvider()\nexport class BasePendingTransactionsService extends AbstractCreatableProvider<BasePendingTransactionsServiceParams> implements MempoolViewer {\n static readonly defaultMoniker = MempoolViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [MempoolViewerMoniker]\n\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n override moniker = BasePendingTransactionsService.defaultMoniker\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n pendingBlocks(_options?: PendingBlocksOptions): Promise<SignedHydratedBlockWithHashMeta[]> {\n throw new Error('Method [pendingBlocks] not implemented.')\n }\n\n async pendingTransactions({ limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let lastHead = (filterAs(await this.chainArchivist.next({ limit: 100 }), x => asBlockBoundWitnessWithHashMeta(x))).at(-1)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber(lastHead.block + 1, true)))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.params.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n const invalidTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length > 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n if (invalidTransactions.length > 0) {\n this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`)\n for (const tx of invalidTransactions) {\n this.logger?.warn(tx[0]._hash)\n }\n }\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n }, { timeBudgetLimit: 100 })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.params.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n }, { timeBudgetLimit: 200 })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), x => asBlockBoundWitnessWithHashMeta(x))\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber(lastHead.block + 1, true)))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n }, { timeBudgetLimit: 200 })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asSignedTransactionBoundWitnessWithHashMeta } from '@xyo-network/xl1-sdk'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithHashMeta | undefined> => {\n const withHashMeta = await PayloadBuilder.addHashMeta(payload.payloads)\n const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withHashMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithHashMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithHashMeta) => {\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 { Hash } from '@xylabs/sdk-js'\nimport { Schema } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n creatableProvider,\n SchemasService,\n SchemasStepSummaryContext,\n schemasSummary,\n} from '@xyo-network/xl1-sdk'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseSchemasServiceParams extends BaseServiceParams {\n schemasStepSummaryContext: SchemasStepSummaryContext\n}\n\n@creatableProvider()\nexport class BaseSchemasService extends AbstractCreatableProvider<BaseSchemasServiceParams> implements SchemasService {\n static readonly defaultMoniker = 'SchemasService'\n static readonly dependencies = []\n static readonly monikers = [BaseSchemasService.defaultMoniker]\n moniker = BaseSchemasService.defaultMoniker\n async schema(head: Hash, schema: Schema): Promise<number> {\n return (await this.schemas(head, [schema]))[schema] ?? 0\n }\n\n async schemas(head: Hash, schemas: Schema[]): Promise<Partial<Record<Schema, number>>> {\n return await this.spanAsync('schemas', async () => {\n const [summary] = await schemasSummary(this.params.schemasStepSummaryContext)\n const result: Record<Schema, number> = {}\n for (const schema of schemas) {\n const count = summary[schema] ?? 0\n result[schema] = count\n }\n return result\n }, { timeBudgetLimit: 100 })\n }\n}\n","import {\n Address, assertEx, exists, Hex, hexToBigInt, isDefined, Promisable,\n} from '@xylabs/sdk-js'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider, AccountBalanceViewer, AccountBalanceViewerMoniker, AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness,\n BlockNumberPayload, BlockNumberSchema, BlockRewardViewer, BlockRewardViewerMoniker, BlockRunner, BlockRunnerMoniker, BlockValidationViewer,\n BlockValidationViewerMoniker, ChainId, ChainStakeIntent, creatableProvider, CreatableProviderParams, createDeclarationIntent, defaultRewardRatio,\n HydratedBlockStateValidationFunction, MempoolRunner, MempoolRunnerMoniker, MempoolViewer, MempoolViewerMoniker, SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimeSyncViewer, TimeSyncViewerMoniker, Transfer, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 10_000\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 500\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _chainId?: ChainId\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get chainId() {\n return this._chainId\n }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? await MemoryArchivist.create()\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._chainId = this.context.config.chain.id\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress ?? this.context.config.producer.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n // TODO: Do not redeclare on every block\n // Decide if we should redeclare intent\n if (this.params.context.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n // const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n // const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n // if (!lastRange) return\n // const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n // const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n // if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n // eslint-disable-next-line max-statements\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n\n this.logger?.info(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n blockPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(\n head,\n fundedNextBlockTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n this.chainId,\n )\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n const startValidate = Date.now()\n const errors = await this.blockValidationViewer.validateBlock(block, { head: head._hash })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (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 await this.mempoolRunner.submitBlocks([block])\n return block\n }\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, { timeBudgetLimit: 200 })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.context.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists, filterAs } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } 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-sdk'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-sdk'\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 = blockData.filter(x => isBoundWitness(x))\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 {\n Address, asAddress, assertEx, filterAs, Hash,\n isUndefined,\n} from '@xylabs/sdk-js'\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 {\n AbstractCreatableProvider,\n asChainIndexingServiceStateWithStorageMeta,\n BlockViewer,\n BlockViewerMoniker,\n ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n ChainStakeViewerMoniker,\n creatableProvider,\n isChainIndexingServiceState,\n readPayloadMapFromStore,\n StakeIntentService,\n timeBudget,\n} from '@xyo-network/xl1-sdk'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asChainStakeIntent, type Intent,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n blockViewer: BlockViewer\n chainArchivist: ArchivistInstance\n chainStakeViewer: ChainStakeViewer\n stakeIntentStateArchivist: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\n// const 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@creatableProvider()\nexport class XyoStakeIntentService extends AbstractCreatableProvider<XyoStakeIntentServiceParams> implements StakeIntentService {\n static readonly defaultMoniker = 'StakeIntent'\n static readonly dependencies = []\n static readonly monikers = [XyoStakeIntentService.defaultMoniker]\n moniker = 'StakeIntent'\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\n // 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 private _blockViewer?: BlockViewer\n private _chainStakeViewer?: ChainStakeViewer\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist!, () => 'chainArchivist not set')\n }\n\n protected get chainStakeViewer() {\n return this._chainStakeViewer!\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist!, () => 'stakeIntentStateArchivist not set')\n }\n\n static override async paramsHandler(params: Partial<XyoStakeIntentServiceParams>): Promise<XyoStakeIntentServiceParams> {\n return {\n ...await super.paramsHandler(params),\n chainArchivist: assertEx(params?.chainArchivist, () => 'chainArchivist is required'),\n stakeIntentStateArchivist: assertEx(params?.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist is required'),\n } as XyoStakeIntentServiceParams\n }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n this._chainStakeViewer = await this.locator.getInstance(ChainStakeViewerMoniker)\n const head = await this.blockViewer.currentBlock()\n if (isUndefined(head)) return\n await this.recoverState(head[0]._hash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `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', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n }, { timeBudgetLimit: 200 })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.context.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n return await timeBudget('XyoStakeIntentService.recoverState', console, async () => {\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 }, 2000, true)\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.blockViewer.currentBlock())[0]\n if (isUndefined(currentHead)) return\n const currentHeadHash = currentHead._hash\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n }, { timeBudgetLimit: 1000 })\n })\n }\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","findMostRecentBlock","LruCacheMap","payloadMapFromStore","SimpleAccountBalanceViewer","StepSizes","Semaphore","accountBalancesViewerFromArchivist","context","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","transferSummaryMap","chainMap","payloadMapFromStore","headFunc","head","assertEx","findMostRecentBlock","_hash","block","service","SimpleAccountBalanceViewer","create","balanceSummaryContext","store","stepSemaphores","StepSizes","map","Semaphore","singletons","caches","transfersSummaryContext","AbstractCreatable","assertEx","creatable","toEthAddress","IXyoChainRewards__factory","asAttoXL1","BlockRewardViewerMoniker","EvmBlockRewardViewer","AbstractCreatable","defaultMoniker","BlockRewardViewerMoniker","monikers","moniker","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","IXyoChainRewards__factory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","isDefined","PayloadBuilder","asSignedBlockBoundWitness","asSignedBlockBoundWitnessWithStorageMeta","BlockViewerMoniker","blockViewerFromChainIteratorAndArchivist","chainIterator","chainArchivist","result","blockByHash","hash","payload","get","block","asSignedBlockBoundWitnessWithStorageMeta","isDefined","payloads","payload_hashes","blockByNumber","blockNumber","asSignedBlockBoundWitness","PayloadBuilder","addHashMeta","undefined","blocksByHash","limit","results","i","push","blocksByNumber","number","chainId","currentBlock","Error","chain","head","_hash","currentBlockHash","currentBlockNumber","moniker","BlockViewerMoniker","payloadByHash","payloadsByHash","_hashes","rate","_args","stepSizeRate","timeDurationRate","AbstractCreatableProvider","BlockViewerMoniker","XyoValidator","AbstractCreatableProvider","moniker","_blockViewer","blockViewer","createHandler","locator","getInstance","BlockViewerMoniker","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","AbstractCreatableProvider","creatableProvider","BaseElectionService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","timeBudgetLimit","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isDefined","isHex","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","buildNextBlock","createGenesisBlock","createDeclarationIntent","createBootstrapHead","account","chainId","genesisBlockRewardAmount","genesisBlockRewardAddress","chain","genesisBlock","createGenesisBlock","push","producerDeclarationPayload","createDeclarationIntent","address","block","producerDeclarationBlock","buildNextBlock","AbstractCreatableProvider","creatableProvider","NetworkStakeStepRewardViewerMoniker","BaseNetworkStakeStepRewardService","AbstractCreatableProvider","defaultMoniker","NetworkStakeStepRewardViewerMoniker","dependencies","monikers","moniker","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","ValueType","assertEx","exists","filterAs","filterAsync","forget","isDefined","isUndefined","MemoryArchivist","AbstractCreatableProvider","asBlockBoundWitnessWithHashMeta","asXL1BlockNumber","creatableProvider","findMostRecentBlock","isTransactionBoundWitnessWithStorageMeta","MempoolViewerMoniker","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asSignedTransactionBoundWitnessWithHashMeta","bundledPayloadToHydratedTransaction","payload","withHashMeta","PayloadBuilder","addHashMeta","payloads","tx","asSignedTransactionBoundWitnessWithHashMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","AbstractCreatableProvider","defaultMoniker","MempoolViewerMoniker","dependencies","monikers","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","moniker","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","pendingBlocks","_options","Error","pendingTransactions","limit","spanAsync","runExclusive","lastHead","filterAs","next","x","asBlockBoundWitnessWithHashMeta","at","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","order","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","asXL1BlockNumber","block","txValidationResults","validateTransaction","chainId","validTransactions","errors","invalidTransactions","logger","warn","push","log","timeBudgetLimit","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","head","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","AbstractCreatableProvider","creatableProvider","schemasSummary","BaseSchemasService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","schema","head","schemas","spanAsync","summary","schemasSummary","params","schemasStepSummaryContext","result","count","timeBudgetLimit","assertEx","exists","hexToBigInt","isDefined","MemoryArchivist","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","PayloadBuilder","AbstractCreatableProvider","AccountBalanceViewerMoniker","asBlockBoundWitness","AttoXL1","BlockNumberSchema","BlockRewardViewerMoniker","BlockRunnerMoniker","BlockValidationViewerMoniker","creatableProvider","createDeclarationIntent","defaultRewardRatio","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","XYO_STEP_REWARD_ADDRESS","hexFromBigInt","assertEx","PayloadBuilder","HydratedTransactionWrapper","transactionRequiredGas","TransferSchema","XYO_ZERO_ADDRESS","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunner","AbstractCreatableProvider","defaultMoniker","BlockRunnerMoniker","dependencies","AccountBalanceViewerMoniker","BlockRewardViewerMoniker","BlockValidationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","monikers","moniker","_blockRewardDiviner","_lastRedeclarationBlock","_rejectedTransactionsArchivist","_account","_accountBalanceViewer","_address","_blockRewardViewer","_blockValidationViewer","_chainId","_mempoolRunner","_mempoolViewer","_rewardAddress","_timeSyncViewer","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","account","accountBalanceViewer","address","blockRewardViewer","blockValidationViewer","chainId","mempoolRunner","mempoolViewer","rejectedTransactionsArchivist","rewardAddress","timeSyncViewer","createHandler","params","MemoryArchivist","create","assertEx","locateAndCreate","locator","getInstance","context","config","chain","id","producer","next","head","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","disableIntentRedeclaration","currentBlock","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactions","pendingTransactions","limit","logger","info","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","fundedNextBlockTransactions","fundedTransfers","filterByFunded","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","undefined","startValidate","errors","validateBlock","_hash","at","message","rejectedTransactions","insert","submitBlocks","error","timeBudgetLimit","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","currentTimePayload","epoch","$epoch","isDefined","heartbeatInterval","exists","filterAs","isBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filter","x","isBoundWitness","bwsFromBlockWithDeclarations","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","filterAs","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","asAddress","assertEx","filterAs","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","AbstractCreatableProvider","asChainIndexingServiceStateWithStorageMeta","BlockViewerMoniker","ChainIndexingServiceStateSchema","ChainStakeViewerMoniker","creatableProvider","isChainIndexingServiceState","readPayloadMapFromStore","timeBudget","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainStakeIntent","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","_blockViewer","_chainStakeViewer","blockViewer","chainArchivist","assertEx","params","chainStakeViewer","stakeIntentStateArchivist","paramsHandler","createHandler","locator","getInstance","BlockViewerMoniker","ChainStakeViewerMoniker","head","currentBlock","isUndefined","recoverState","_hash","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","timeBudgetLimit","minStake","context","config","producer","BigInt","isStakedForBlock","includes","startHandler","updateIndex","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","PayloadBuilder","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","timeBudget","console","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
1
+ {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/evm/initEvmProvider.ts","../../src/implementation/evm/initInfuraProvider.ts","../../src/implementation/evm/initChainId.ts","../../src/implementation/evm/initJsonRpcProvider.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/Schemas/BaseSchemasService.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadWriteArchivist } from '@xyo-network/archivist-model'\nimport type {\n Payload, WithHashMeta, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer, BalancesStepSummary, ChainId,\n CreatableProviderContext, SimpleAccountBalanceViewerParams, TransfersStepSummary,\n} from '@xyo-network/xl1-sdk'\nimport {\n findMostRecentBlock, LruCacheMap, payloadMapFromStore,\n SimpleAccountBalanceViewer, StepSizes,\n} from '@xyo-network/xl1-sdk'\nimport { Semaphore } from 'async-mutex'\n\n// this is intended to only be used for testing\nexport const accountBalancesViewerFromArchivist = async (\n context: CreatableProviderContext,\n chainId: ChainId,\n archivist: ReadWriteArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceViewer> => {\n const summaryMap = new LruCacheMap<string, WithHashMeta<BalancesStepSummary>>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const transferSummaryMap = new LruCacheMap<string, WithHashMeta<TransfersStepSummary>>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async (): Promise<[Hash, number]> => {\n const head = assertEx(await findMostRecentBlock(archivist), () => 'No blocks found in chainArchivist')\n return [head._hash, head.block]\n }\n\n const service = await SimpleAccountBalanceViewer.create({\n context,\n balanceSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n singletons: context.singletons,\n caches: context.caches,\n },\n transfersSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n head: headFunc,\n singletons: context.singletons,\n caches: context.caches,\n },\n } satisfies SimpleAccountBalanceViewerParams)\n return service\n}\n","import {\n AbstractCreatable,\n assertEx, creatable, CreatableParams, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { IXyoChainRewards__factory } from '@xyo-network/typechain'\nimport {\n asAttoXL1, AttoXL1, BlockRewardViewer,\n BlockRewardViewerMoniker,\n ChainContractViewer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = IXyoChainRewards__factory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer, HydratedBlockStateValidationFunction,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, BlockViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\nimport type { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams extends BaseServiceParams {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends AbstractCreatableProvider<TParams> implements Validator {\n moniker = 'Validator'\n private _blockViewer?: BlockViewer\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import {\n Address, assertEx, Hash,\n} from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n type BlockViewer,\n type ChainStakeViewer, creatableProvider,\n type ElectionService, type StakeIntentService,\n} from '@xyo-network/xl1-sdk'\nimport { BlockBoundWitness } from '@xyo-network/xl1-sdk'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatableProvider()\nexport class BaseElectionService extends AbstractCreatableProvider<BaseElectionServicesParams> implements ElectionService {\n static readonly defaultMoniker = 'Election'\n static readonly dependencies = []\n static readonly monikers = ['Election']\n moniker = BaseElectionService.defaultMoniker\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n }, { timeBudgetLimit: 200 })\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Pick<Config, 'evm'>; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Pick<Config, 'evm'> }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Pick<Config, 'evm'>) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Pick<Config, 'evm'>): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Pick<Config, 'evm'>) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import {\n assertEx, hexFrom, isDefined, isHex,\n} from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\n\nexport const canUseChainId = (config: Pick<Config, 'evm'>): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Pick<Config, 'evm'>) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Pick<Config, 'evm'>) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { buildNextBlock, createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n AttoXL1, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { createDeclarationIntent } from '@xyo-network/xl1-sdk'\n\nexport const createBootstrapHead = async (\n account: WalletInstance,\n chainId: ChainId,\n genesisBlockRewardAmount: AttoXL1,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, genesisBlockRewardAmount, genesisBlockRewardAddress)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { Address, Promisable } from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n AbstractCreatableProvider,\n AttoXL1,\n creatableProvider,\n NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n ethProvider?: Provider\n}\n\n@creatableProvider()\nexport class BaseNetworkStakeStepRewardService extends\n AbstractCreatableProvider<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n override moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[AttoXL1, AttoXL1]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, AttoXL1>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [AttoXL1, AttoXL1]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<AttoXL1> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import { ValueType } from '@opentelemetry/api'\nimport {\n assertEx,\n exists,\n filterAs, filterAsync, forget, Hash,\n isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n asBlockBoundWitnessWithHashMeta, asXL1BlockNumber, ChainId, creatableProvider,\n findMostRecentBlock, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta,\n MempoolViewer, MempoolViewerMoniker, PendingBlocksOptions, PendingTransactionsOptions,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n SignedHydratedTransactionWithStorageMeta,\n TransactionJsonSchemaValidator, validateTransaction,\n XL1BlockNumber,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist: ArchivistInstance\n chainId: ChainId\n pendingBundledTransactionsArchivist: ArchivistInstance\n rejectedTransactionsArchivist: ArchivistInstance\n}\n\n@creatableProvider()\nexport class BasePendingTransactionsService extends AbstractCreatableProvider<BasePendingTransactionsServiceParams> implements MempoolViewer {\n static readonly defaultMoniker = MempoolViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [MempoolViewerMoniker]\n\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n override moniker = BasePendingTransactionsService.defaultMoniker\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n pendingBlocks(_options?: PendingBlocksOptions): Promise<SignedHydratedBlockWithHashMeta[]> {\n throw new Error('Method [pendingBlocks] not implemented.')\n }\n\n async pendingTransactions({ limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let lastHead = (filterAs(await this.chainArchivist.next({ limit: 100 }), x => asBlockBoundWitnessWithHashMeta(x))).at(-1)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber(lastHead.block + 1, true)))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.params.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n const invalidTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length > 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n if (invalidTransactions.length > 0) {\n this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`)\n for (const tx of invalidTransactions) {\n this.logger?.warn(tx[0]._hash)\n }\n }\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n }, { timeBudgetLimit: 100 })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.params.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n }, { timeBudgetLimit: 200 })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), x => asBlockBoundWitnessWithHashMeta(x))\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber(lastHead.block + 1, true)))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n }, { timeBudgetLimit: 200 })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asSignedTransactionBoundWitnessWithHashMeta } from '@xyo-network/xl1-sdk'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithHashMeta | undefined> => {\n const withHashMeta = await PayloadBuilder.addHashMeta(payload.payloads)\n const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withHashMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithHashMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithHashMeta) => {\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 { Hash } from '@xylabs/sdk-js'\nimport { Schema } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider,\n creatableProvider,\n SchemasService,\n SchemasStepSummaryContext,\n schemasSummary,\n} from '@xyo-network/xl1-sdk'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseSchemasServiceParams extends BaseServiceParams {\n schemasStepSummaryContext: SchemasStepSummaryContext\n}\n\n@creatableProvider()\nexport class BaseSchemasService extends AbstractCreatableProvider<BaseSchemasServiceParams> implements SchemasService {\n static readonly defaultMoniker = 'SchemasService'\n static readonly dependencies = []\n static readonly monikers = [BaseSchemasService.defaultMoniker]\n moniker = BaseSchemasService.defaultMoniker\n async schema(head: Hash, schema: Schema): Promise<number> {\n return (await this.schemas(head, [schema]))[schema] ?? 0\n }\n\n async schemas(head: Hash, schemas: Schema[]): Promise<Partial<Record<Schema, number>>> {\n return await this.spanAsync('schemas', async () => {\n const [summary] = await schemasSummary(this.params.schemasStepSummaryContext)\n const result: Record<Schema, number> = {}\n for (const schema of schemas) {\n const count = summary[schema] ?? 0\n result[schema] = count\n }\n return result\n }, { timeBudgetLimit: 100 })\n }\n}\n","import {\n Address, assertEx, exists, Hex, hexToBigInt, isDefined, Promisable,\n} from '@xylabs/sdk-js'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AbstractCreatableProvider, AccountBalanceViewer, AccountBalanceViewerMoniker, AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness,\n BlockNumberPayload, BlockNumberSchema, BlockRewardViewer, BlockRewardViewerMoniker, BlockRunner, BlockRunnerMoniker, BlockValidationViewer,\n BlockValidationViewerMoniker, ChainId, ChainStakeIntent, creatableProvider, CreatableProviderParams, createDeclarationIntent, defaultRewardRatio,\n HydratedBlockStateValidationFunction, MempoolRunner, MempoolRunnerMoniker, MempoolViewer, MempoolViewerMoniker, SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimeSyncViewer, TimeSyncViewerMoniker, Transfer, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 10_000\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 500\n\nexport interface SimpleBlockRunnerParams extends CreatableProviderParams {\n account: AccountInstance\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatableProvider()\nexport class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {\n static readonly defaultMoniker = BlockRunnerMoniker\n static readonly dependencies = [\n AccountBalanceViewerMoniker,\n BlockRewardViewerMoniker,\n BlockValidationViewerMoniker,\n MempoolRunnerMoniker,\n MempoolViewerMoniker,\n TimeSyncViewerMoniker,\n ]\n\n static readonly monikers = [BlockRunnerMoniker]\n moniker = SimpleBlockRunner.defaultMoniker\n\n protected _blockRewardDiviner?: BlockRewardDiviner\n protected _lastRedeclarationBlock?: number\n protected _rejectedTransactionsArchivist?: ArchivistInstance\n\n private _account?: AccountInstance\n private _accountBalanceViewer?: AccountBalanceViewer\n private _address?: Address\n private _blockRewardViewer?: BlockRewardViewer\n private _blockValidationViewer?: BlockValidationViewer\n private _chainId?: ChainId\n private _mempoolRunner?: MempoolRunner\n private _mempoolViewer?: MempoolViewer\n private _rewardAddress?: Address\n private _timeSyncViewer?: TimeSyncViewer\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n protected get account() {\n return this._account!\n }\n\n protected get accountBalanceViewer() {\n return this._accountBalanceViewer!\n }\n\n protected get address() {\n return this._address!\n }\n\n protected get blockRewardViewer() {\n return this._blockRewardViewer!\n }\n\n protected get blockValidationViewer() {\n return this._blockValidationViewer!\n }\n\n protected get chainId() {\n return this._chainId\n }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n protected get mempoolRunner() {\n return this._mempoolRunner!\n }\n\n protected get mempoolViewer() {\n return this._mempoolViewer!\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return this._rewardAddress!\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get timeSyncViewer(): TimeSyncViewer {\n return this._timeSyncViewer!\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n override async createHandler() {\n this._rejectedTransactionsArchivist = this.params.rejectedTransactionsArchivist ?? await MemoryArchivist.create()\n this._account = assertEx(this.params.account, () => 'Account is required')\n this._address = this.account.address\n this._accountBalanceViewer = await this.locateAndCreate<AccountBalanceViewer>(AccountBalanceViewerMoniker)\n this._blockRewardViewer = await this.locateAndCreate<BlockRewardViewer>(BlockRewardViewerMoniker)\n this._blockValidationViewer = await this.locator.getInstance<BlockValidationViewer>(BlockValidationViewerMoniker)\n this._chainId = this.context.config.chain.id\n this._mempoolRunner = await this.locateAndCreate<MempoolRunner>(MempoolRunnerMoniker)\n this._mempoolViewer = await this.locateAndCreate<MempoolViewer>(MempoolViewerMoniker)\n this._rewardAddress = this.params.rewardAddress ?? this.context.config.producer.rewardAddress\n this._timeSyncViewer = await this.locateAndCreate<TimeSyncViewer>(TimeSyncViewerMoniker)\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n // if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n // TODO: Do not redeclare on every block\n // Decide if we should redeclare intent\n if (this.params.context.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n // const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n // const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n // if (!lastRange) return\n // const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n // const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n // if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n // eslint-disable-next-line max-statements\n return await this.spanAsync('proposeNextValidBlock', async () => {\n try {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n\n this.logger?.info(`Pending Tx Count ${nextBlockTransactions.length}`)\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n blockPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload()\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.accountBalanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(\n head,\n fundedNextBlockTransactions,\n blockPayloads,\n [this.account],\n XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance,\n undefined,\n this.chainId,\n )\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n const startValidate = Date.now()\n const errors = await this.blockValidationViewer.validateBlock(block, { head: head._hash })\n this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n if (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 await this.mempoolRunner.submitBlocks([block])\n return block\n }\n } catch (error) {\n this.logger?.error(`Error proposing next valid block: ${(error as Error).message}`)\n throw error\n }\n }, { timeBudgetLimit: 200 })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.accountBalanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload() {\n return await this.timeSyncViewer.currentTimePayload()\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.context.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-sdk'\nimport {\n HydratedTransactionWrapper,\n transactionRequiredGas, TransferSchema, XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-sdk'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists, filterAs } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } 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-sdk'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-sdk'\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 = blockData.filter(x => isBoundWitness(x))\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 {\n Address, asAddress, assertEx, filterAs, Hash,\n isUndefined,\n} from '@xylabs/sdk-js'\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 {\n AbstractCreatableProvider,\n asChainIndexingServiceStateWithStorageMeta,\n BlockViewer,\n BlockViewerMoniker,\n ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n ChainStakeViewerMoniker,\n creatableProvider,\n isChainIndexingServiceState,\n readPayloadMapFromStore,\n StakeIntentService,\n timeBudget,\n} from '@xyo-network/xl1-sdk'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asChainStakeIntent, type Intent,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams {\n blockViewer: BlockViewer\n chainArchivist: ArchivistInstance\n chainStakeViewer: ChainStakeViewer\n stakeIntentStateArchivist: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\n// const 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@creatableProvider()\nexport class XyoStakeIntentService extends AbstractCreatableProvider<XyoStakeIntentServiceParams> implements StakeIntentService {\n static readonly defaultMoniker = 'StakeIntent'\n static readonly dependencies = []\n static readonly monikers = [XyoStakeIntentService.defaultMoniker]\n moniker = 'StakeIntent'\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\n // 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 private _blockViewer?: BlockViewer\n private _chainStakeViewer?: ChainStakeViewer\n\n protected get blockViewer() {\n return this._blockViewer!\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist!, () => 'chainArchivist not set')\n }\n\n protected get chainStakeViewer() {\n return this._chainStakeViewer!\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist!, () => 'stakeIntentStateArchivist not set')\n }\n\n static override async paramsHandler(params: Partial<XyoStakeIntentServiceParams>): Promise<XyoStakeIntentServiceParams> {\n return {\n ...await super.paramsHandler(params),\n chainArchivist: assertEx(params?.chainArchivist, () => 'chainArchivist is required'),\n stakeIntentStateArchivist: assertEx(params?.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist is required'),\n } as XyoStakeIntentServiceParams\n }\n\n override async createHandler() {\n this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n this._chainStakeViewer = await this.locator.getInstance(ChainStakeViewerMoniker)\n const head = await this.blockViewer.currentBlock()\n if (isUndefined(head)) return\n await this.recoverState(head[0]._hash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `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', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n }, { timeBudgetLimit: 200 })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.context.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n return await timeBudget('XyoStakeIntentService.recoverState', console, async () => {\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 }, 2000, true)\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.blockViewer.currentBlock())[0]\n if (isUndefined(currentHead)) return\n const currentHeadHash = currentHead._hash\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n }, { timeBudgetLimit: 1000 })\n })\n }\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { StepIdentity, StepStakeViewer } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider, StepStakeViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\nexport abstract class AbstractStepStakeService extends AbstractCreatableProvider<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n override moniker = AbstractStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","findMostRecentBlock","LruCacheMap","payloadMapFromStore","SimpleAccountBalanceViewer","StepSizes","Semaphore","accountBalancesViewerFromArchivist","context","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","transferSummaryMap","chainMap","payloadMapFromStore","headFunc","head","assertEx","findMostRecentBlock","_hash","block","service","SimpleAccountBalanceViewer","create","balanceSummaryContext","store","stepSemaphores","StepSizes","map","Semaphore","singletons","caches","transfersSummaryContext","AbstractCreatable","assertEx","creatable","toEthAddress","IXyoChainRewards__factory","asAttoXL1","BlockRewardViewerMoniker","EvmBlockRewardViewer","AbstractCreatable","defaultMoniker","BlockRewardViewerMoniker","monikers","moniker","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","IXyoChainRewards__factory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","AbstractCreatableProvider","BlockViewerMoniker","XyoValidator","AbstractCreatableProvider","moniker","_blockViewer","blockViewer","createHandler","locator","getInstance","BlockViewerMoniker","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","hexToLast4BytesInt","shuffleWithSeed","AbstractCreatableProvider","creatableProvider","BaseElectionService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","timeBudgetLimit","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isDefined","isHex","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","buildNextBlock","createGenesisBlock","createDeclarationIntent","createBootstrapHead","account","chainId","genesisBlockRewardAmount","genesisBlockRewardAddress","chain","genesisBlock","createGenesisBlock","push","producerDeclarationPayload","createDeclarationIntent","address","block","producerDeclarationBlock","buildNextBlock","AbstractCreatableProvider","creatableProvider","NetworkStakeStepRewardViewerMoniker","BaseNetworkStakeStepRewardService","AbstractCreatableProvider","defaultMoniker","NetworkStakeStepRewardViewerMoniker","dependencies","monikers","moniker","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","ValueType","assertEx","exists","filterAs","filterAsync","forget","isDefined","isUndefined","MemoryArchivist","AbstractCreatableProvider","asBlockBoundWitnessWithHashMeta","asXL1BlockNumber","creatableProvider","findMostRecentBlock","isTransactionBoundWitnessWithStorageMeta","MempoolViewerMoniker","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asSignedTransactionBoundWitnessWithHashMeta","bundledPayloadToHydratedTransaction","payload","withHashMeta","PayloadBuilder","addHashMeta","payloads","tx","asSignedTransactionBoundWitnessWithHashMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","AbstractCreatableProvider","defaultMoniker","MempoolViewerMoniker","dependencies","monikers","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","moniker","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","pendingBlocks","_options","Error","pendingTransactions","limit","spanAsync","runExclusive","lastHead","filterAs","next","x","asBlockBoundWitnessWithHashMeta","at","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","order","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","asXL1BlockNumber","block","txValidationResults","validateTransaction","chainId","validTransactions","errors","invalidTransactions","logger","warn","push","log","timeBudgetLimit","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","head","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","AbstractCreatableProvider","creatableProvider","schemasSummary","BaseSchemasService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","schema","head","schemas","spanAsync","summary","schemasSummary","params","schemasStepSummaryContext","result","count","timeBudgetLimit","assertEx","exists","hexToBigInt","isDefined","MemoryArchivist","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","PayloadBuilder","AbstractCreatableProvider","AccountBalanceViewerMoniker","asBlockBoundWitness","AttoXL1","BlockNumberSchema","BlockRewardViewerMoniker","BlockRunnerMoniker","BlockValidationViewerMoniker","creatableProvider","createDeclarationIntent","defaultRewardRatio","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","XYO_STEP_REWARD_ADDRESS","hexFromBigInt","assertEx","PayloadBuilder","HydratedTransactionWrapper","transactionRequiredGas","TransferSchema","XYO_ZERO_ADDRESS","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunner","AbstractCreatableProvider","defaultMoniker","BlockRunnerMoniker","dependencies","AccountBalanceViewerMoniker","BlockRewardViewerMoniker","BlockValidationViewerMoniker","MempoolRunnerMoniker","MempoolViewerMoniker","TimeSyncViewerMoniker","monikers","moniker","_blockRewardDiviner","_lastRedeclarationBlock","_rejectedTransactionsArchivist","_account","_accountBalanceViewer","_address","_blockRewardViewer","_blockValidationViewer","_chainId","_mempoolRunner","_mempoolViewer","_rewardAddress","_timeSyncViewer","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","account","accountBalanceViewer","address","blockRewardViewer","blockValidationViewer","chainId","mempoolRunner","mempoolViewer","rejectedTransactionsArchivist","rewardAddress","timeSyncViewer","createHandler","params","MemoryArchivist","create","assertEx","locateAndCreate","locator","getInstance","context","config","chain","id","producer","next","head","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","disableIntentRedeclaration","currentBlock","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactions","pendingTransactions","limit","logger","info","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","Date","now","timePayload","generateTimePayload","timeDuration","warn","fundedNextBlockTransactions","fundedTransfers","filterByFunded","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","undefined","startValidate","errors","validateBlock","_hash","at","message","rejectedTransactions","insert","submitBlocks","error","timeBudgetLimit","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","currentTimePayload","epoch","$epoch","isDefined","heartbeatInterval","exists","filterAs","isBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filter","x","isBoundWitness","bwsFromBlockWithDeclarations","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","filterAs","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","asAddress","assertEx","filterAs","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","AbstractCreatableProvider","asChainIndexingServiceStateWithStorageMeta","BlockViewerMoniker","ChainIndexingServiceStateSchema","ChainStakeViewerMoniker","creatableProvider","isChainIndexingServiceState","readPayloadMapFromStore","timeBudget","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainStakeIntent","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","AbstractCreatableProvider","defaultMoniker","dependencies","monikers","moniker","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","_blockViewer","_chainStakeViewer","blockViewer","chainArchivist","assertEx","params","chainStakeViewer","stakeIntentStateArchivist","paramsHandler","createHandler","locator","getInstance","BlockViewerMoniker","ChainStakeViewerMoniker","head","currentBlock","isUndefined","recoverState","_hash","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","timeBudgetLimit","minStake","context","config","producer","BigInt","isStakedForBlock","includes","startHandler","updateIndex","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","PayloadBuilder","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","timeBudget","console","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","AbstractCreatableProvider","StepStakeViewerMoniker","AbstractStepStakeService","AbstractCreatableProvider","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}
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.18.4",
4
+ "version": "1.18.5",
5
5
  "description": "XYO Layer One SDK Services",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -47,14 +47,14 @@
47
47
  "@xyo-network/boundwitness-model": "~5.2.25",
48
48
  "@xyo-network/boundwitness-validator": "~5.2.25",
49
49
  "@xyo-network/boundwitness-wrapper": "~5.2.25",
50
- "@xyo-network/chain-analyze": "~1.18.4",
51
- "@xyo-network/chain-modules": "~1.18.4",
52
- "@xyo-network/chain-protocol": "~1.18.4",
53
- "@xyo-network/chain-utils": "~1.18.4",
50
+ "@xyo-network/chain-analyze": "~1.18.5",
51
+ "@xyo-network/chain-modules": "~1.18.5",
52
+ "@xyo-network/chain-protocol": "~1.18.5",
53
+ "@xyo-network/chain-utils": "~1.18.5",
54
54
  "@xyo-network/payload-builder": "~5.2.25",
55
55
  "@xyo-network/payload-model": "~5.2.25",
56
56
  "@xyo-network/typechain": "~4.1.1",
57
- "@xyo-network/xl1-sdk": "~1.19.4",
57
+ "@xyo-network/xl1-sdk": "~1.19.6",
58
58
  "async-mutex": "~0.5.0",
59
59
  "ethers": "^6.16.0",
60
60
  "lru-cache": "^11.2.5"
@@ -67,7 +67,7 @@
67
67
  "@xylabs/vitest-extended": "~5.0.64",
68
68
  "@xyo-network/account": "~5.2.25",
69
69
  "@xyo-network/account-model": "~5.2.25",
70
- "@xyo-network/chain-validation": "~1.18.4",
70
+ "@xyo-network/chain-validation": "~1.18.5",
71
71
  "@xyo-network/wallet": "~5.2.25",
72
72
  "@xyo-network/wallet-model": "~5.2.25",
73
73
  "cosmiconfig": "^9.0.0",
@@ -4,7 +4,7 @@ import {
4
4
  AbstractCreatableProvider,
5
5
  AttoXL1,
6
6
  creatableProvider,
7
- EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,
7
+ NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,
8
8
  StepIdentity,
9
9
  StepIdentityString,
10
10
  } from '@xyo-network/xl1-sdk'
@@ -14,7 +14,6 @@ import { BaseServiceParams } from '../model/index.ts'
14
14
 
15
15
  export interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {
16
16
  chainArchivist: ReadArchivist
17
- chainIterator: EventingChainBlockNumberIteratorService
18
17
  ethProvider?: Provider
19
18
  }
20
19
 
package/src/index.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from './AccountBalance/index.ts'
2
2
  export * from './BlockReward/index.ts'
3
- export * from './blockViewerFromChainIteratorAndArchivist.ts'
4
3
  export * from './ChainValidator/index.ts'
5
4
  export * from './Election/index.ts'
6
5
  export * from './implementation/index.ts'
@@ -1,4 +0,0 @@
1
- import type { ReadArchivist } from '@xyo-network/archivist-model';
2
- import type { BlockViewer, EventingChainBlockNumberIteratorService } from '@xyo-network/xl1-sdk';
3
- export declare function blockViewerFromChainIteratorAndArchivist(chainIterator: EventingChainBlockNumberIteratorService, chainArchivist: ReadArchivist): BlockViewer;
4
- //# sourceMappingURL=blockViewerFromChainIteratorAndArchivist.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"blockViewerFromChainIteratorAndArchivist.d.ts","sourceRoot":"","sources":["../../src/blockViewerFromChainIteratorAndArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAGjE,OAAO,KAAK,EAEV,WAAW,EAAE,uCAAuC,EAGrD,MAAM,sBAAsB,CAAA;AAK7B,wBAAgB,wCAAwC,CACtD,aAAa,EAAE,uCAAuC,EACtD,cAAc,EAAE,aAAa,GAC5B,WAAW,CAmFb"}
@@ -1,102 +0,0 @@
1
- import type { Hash, Promisable } from '@xylabs/sdk-js'
2
- import { isDefined } from '@xylabs/sdk-js'
3
- import type { ReadArchivist } from '@xyo-network/archivist-model'
4
- import { PayloadBuilder } from '@xyo-network/payload-builder'
5
- import type { Payload, WithHashMeta } from '@xyo-network/payload-model'
6
- import type {
7
- BlockRate,
8
- BlockViewer, EventingChainBlockNumberIteratorService,
9
- SignedHydratedBlockWithHashMeta,
10
- XL1BlockNumber,
11
- } from '@xyo-network/xl1-sdk'
12
- import {
13
- asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta, BlockViewerMoniker,
14
- } from '@xyo-network/xl1-sdk'
15
-
16
- export function blockViewerFromChainIteratorAndArchivist(
17
- chainIterator: EventingChainBlockNumberIteratorService,
18
- chainArchivist: ReadArchivist,
19
- ): BlockViewer {
20
- const result = {
21
- blockByHash: async function (hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {
22
- const [payload] = await chainArchivist.get([hash])
23
- const block = asSignedBlockBoundWitnessWithStorageMeta(payload)
24
- if (isDefined(block)) {
25
- const payloads = await chainArchivist.get(block.payload_hashes)
26
- return [block, payloads]
27
- }
28
- return null
29
- },
30
- blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {
31
- const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber))
32
- const block = payload ? await PayloadBuilder.addHashMeta(payload) : undefined
33
- if (isDefined(block)) {
34
- const payloads = await chainArchivist.get(block.payload_hashes)
35
- return [block, payloads]
36
- }
37
- return null
38
- },
39
- blocksByHash: async function (hash: Hash, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {
40
- const results: SignedHydratedBlockWithHashMeta[] = []
41
- for (let i = 0; i < limit; i++) {
42
- const block = await this.blockByHash(hash)
43
- if (block) {
44
- results.push(block)
45
- } else {
46
- break
47
- }
48
- }
49
- return results
50
- },
51
- blocksByNumber: async function (number: XL1BlockNumber, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {
52
- const results: SignedHydratedBlockWithHashMeta[] = []
53
- for (let i = 0; i < limit; i++) {
54
- const block = await this.blockByNumber(number)
55
- if (block) {
56
- results.push(block)
57
- } else {
58
- break
59
- }
60
- }
61
- return results
62
- },
63
- chainId: async function (blockNumber: XL1BlockNumber | 'latest' = 'latest') {
64
- const block = blockNumber === 'latest'
65
- ? await this.currentBlock()
66
- : await this.blockByNumber(blockNumber)
67
- if (!block) {
68
- throw new Error(`Block not found for block number: ${blockNumber}`)
69
- }
70
- return block[0].chain
71
- },
72
- currentBlock: async function (): Promise<SignedHydratedBlockWithHashMeta> {
73
- const head = await chainIterator.head()
74
- return this.blockByHash(head._hash) as Promise<SignedHydratedBlockWithHashMeta>
75
- },
76
- currentBlockHash: async function (): Promise<Hash> {
77
- const head = await chainIterator.head()
78
- return head._hash
79
- },
80
- currentBlockNumber: async function (): Promise<XL1BlockNumber> {
81
- const head = await chainIterator.head()
82
- return head.block
83
- },
84
- moniker: BlockViewerMoniker,
85
- payloadByHash: function (_hash: Hash): Promisable<WithHashMeta<Payload> | null> {
86
- throw new Error('Function not implemented.')
87
- },
88
- payloadsByHash: function (_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {
89
- throw new Error('Function not implemented.')
90
- },
91
- rate(..._args): Promisable<BlockRate> {
92
- throw new Error('Function not implemented.')
93
- },
94
- stepSizeRate(..._args) {
95
- throw new Error('Function not implemented.')
96
- },
97
- timeDurationRate(..._args) {
98
- throw new Error('Function not implemented.')
99
- },
100
- } satisfies BlockViewer
101
- return result
102
- }