@xyo-network/chain-services 1.17.0 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts +1 -1
  2. package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts.map +1 -1
  3. package/dist/neutral/AccountBalance/index.d.ts +0 -1
  4. package/dist/neutral/AccountBalance/index.d.ts.map +1 -1
  5. package/dist/neutral/BaseService.d.ts +0 -3
  6. package/dist/neutral/BaseService.d.ts.map +1 -1
  7. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts +17 -0
  8. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -0
  9. package/dist/neutral/BlockReward/index.d.ts +1 -3
  10. package/dist/neutral/BlockReward/index.d.ts.map +1 -1
  11. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts +4 -2
  12. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
  13. package/dist/neutral/ChainService/Evm/Evm.d.ts +2 -1
  14. package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
  15. package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -0
  16. package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
  17. package/dist/neutral/ChainValidator/XyoValidator.d.ts +2 -16
  18. package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
  19. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +7 -6
  20. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
  21. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +5 -4
  22. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
  23. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -1
  24. package/dist/neutral/implementation/accountBalance.d.ts +7 -0
  25. package/dist/neutral/implementation/accountBalance.d.ts.map +1 -0
  26. package/dist/neutral/implementation/blockViewer.d.ts +7 -0
  27. package/dist/neutral/implementation/blockViewer.d.ts.map +1 -0
  28. package/dist/neutral/implementation/chain/evm.d.ts +7 -0
  29. package/dist/neutral/implementation/chain/evm.d.ts.map +1 -0
  30. package/dist/neutral/implementation/chain/index.d.ts +7 -0
  31. package/dist/neutral/implementation/chain/index.d.ts.map +1 -0
  32. package/dist/neutral/implementation/evm/index.d.ts +2 -0
  33. package/dist/neutral/implementation/evm/index.d.ts.map +1 -0
  34. package/dist/neutral/implementation/evm/initChainId.d.ts +4 -0
  35. package/dist/neutral/implementation/evm/initChainId.d.ts.map +1 -0
  36. package/dist/neutral/implementation/evm/initEvmProvider.d.ts +11 -0
  37. package/dist/neutral/implementation/evm/initEvmProvider.d.ts.map +1 -0
  38. package/dist/neutral/implementation/evm/initInfuraProvider.d.ts +6 -0
  39. package/dist/neutral/implementation/evm/initInfuraProvider.d.ts.map +1 -0
  40. package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts +6 -0
  41. package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts.map +1 -0
  42. package/dist/neutral/implementation/head/createBootstrapHead.d.ts +5 -0
  43. package/dist/neutral/implementation/head/createBootstrapHead.d.ts.map +1 -0
  44. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +8 -0
  45. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
  46. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +9 -0
  47. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
  48. package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
  49. package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
  50. package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts +4 -0
  51. package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
  52. package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
  53. package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
  54. package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +11 -0
  55. package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
  56. package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts +11 -0
  57. package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
  58. package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +11 -0
  59. package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
  60. package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +13 -0
  61. package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
  62. package/dist/neutral/implementation/head/createForkedHead/index.d.ts +2 -0
  63. package/dist/neutral/implementation/head/createForkedHead/index.d.ts.map +1 -0
  64. package/dist/neutral/implementation/head/getForkFromBlock.d.ts +12 -0
  65. package/dist/neutral/implementation/head/getForkFromBlock.d.ts.map +1 -0
  66. package/dist/neutral/implementation/head/head.d.ts +11 -0
  67. package/dist/neutral/implementation/head/head.d.ts.map +1 -0
  68. package/dist/neutral/implementation/head/index.d.ts +2 -0
  69. package/dist/neutral/implementation/head/index.d.ts.map +1 -0
  70. package/dist/neutral/implementation/head/submitNewChain.d.ts +10 -0
  71. package/dist/neutral/implementation/head/submitNewChain.d.ts.map +1 -0
  72. package/dist/neutral/implementation/index.d.ts +13 -0
  73. package/dist/neutral/implementation/index.d.ts.map +1 -0
  74. package/dist/neutral/implementation/mempoolRunner.d.ts +7 -0
  75. package/dist/neutral/implementation/mempoolRunner.d.ts.map +1 -0
  76. package/dist/neutral/implementation/mempoolViewer.d.ts +7 -0
  77. package/dist/neutral/implementation/mempoolViewer.d.ts.map +1 -0
  78. package/dist/neutral/implementation/pendingTransactions.d.ts +9 -0
  79. package/dist/neutral/implementation/pendingTransactions.d.ts.map +1 -0
  80. package/dist/neutral/implementation/producer.d.ts +5 -0
  81. package/dist/neutral/implementation/producer.d.ts.map +1 -0
  82. package/dist/neutral/implementation/reward.d.ts +14 -0
  83. package/dist/neutral/implementation/reward.d.ts.map +1 -0
  84. package/dist/neutral/implementation/time.d.ts +6 -0
  85. package/dist/neutral/implementation/time.d.ts.map +1 -0
  86. package/dist/neutral/implementation/validator.d.ts +5 -0
  87. package/dist/neutral/implementation/validator.d.ts.map +1 -0
  88. package/dist/neutral/index.d.ts +2 -2
  89. package/dist/neutral/index.d.ts.map +1 -1
  90. package/dist/neutral/index.mjs +1565 -1140
  91. package/dist/neutral/index.mjs.map +1 -1
  92. package/dist/neutral/simple/block/index.d.ts +2 -0
  93. package/dist/neutral/simple/block/index.d.ts.map +1 -0
  94. package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts +117 -0
  95. package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -0
  96. package/dist/neutral/simple/block/runner/generateTransactionFeeTransfers.d.ts.map +1 -0
  97. package/dist/neutral/simple/block/runner/index.d.ts +2 -0
  98. package/dist/neutral/simple/block/runner/index.d.ts.map +1 -0
  99. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts +2 -0
  100. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts.map +1 -0
  101. package/dist/neutral/simple/index.d.ts +2 -0
  102. package/dist/neutral/simple/index.d.ts.map +1 -0
  103. package/package.json +30 -27
  104. package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +35 -8
  105. package/src/AccountBalance/index.ts +0 -1
  106. package/src/BaseService.ts +0 -13
  107. package/src/BlockReward/EvmBlockRewardViewer.ts +50 -0
  108. package/src/BlockReward/index.ts +1 -3
  109. package/src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts +14 -2
  110. package/src/ChainService/Evm/Evm.ts +5 -4
  111. package/src/ChainService/Memory/Memory.ts +5 -0
  112. package/src/ChainValidator/XyoValidator.ts +25 -30
  113. package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +18 -18
  114. package/src/PendingTransactions/BasePendingTransactions.ts +10 -5
  115. package/src/Schemas/BaseSchemasService.ts +1 -1
  116. package/src/StakeIntent/XyoStakeIntentService.ts +18 -8
  117. package/src/StepStake/BaseStepStakeService.ts +2 -2
  118. package/src/blockViewerFromChainIteratorAndArchivist.ts +8 -1
  119. package/src/implementation/accountBalance.ts +29 -0
  120. package/src/implementation/blockViewer.ts +29 -0
  121. package/src/implementation/chain/evm.ts +39 -0
  122. package/src/implementation/chain/index.ts +46 -0
  123. package/src/implementation/evm/index.ts +1 -0
  124. package/src/implementation/evm/initChainId.ts +20 -0
  125. package/src/implementation/evm/initEvmProvider.ts +24 -0
  126. package/src/implementation/evm/initInfuraProvider.ts +26 -0
  127. package/src/implementation/evm/initJsonRpcProvider.ts +20 -0
  128. package/src/implementation/head/createBootstrapHead.ts +31 -0
  129. package/src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
  130. package/src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +19 -0
  131. package/src/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
  132. package/src/implementation/head/createForkedHead/config/index.ts +3 -0
  133. package/src/implementation/head/createForkedHead/createForkedHead.ts +29 -0
  134. package/src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +42 -0
  135. package/src/implementation/head/createForkedHead/getBridgeIntent.ts +51 -0
  136. package/src/implementation/head/createForkedHead/getBridgeSourceObservation.ts +46 -0
  137. package/src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +41 -0
  138. package/src/implementation/head/createForkedHead/index.ts +1 -0
  139. package/src/implementation/head/getForkFromBlock.ts +43 -0
  140. package/src/implementation/head/head.ts +49 -0
  141. package/src/implementation/head/index.ts +1 -0
  142. package/src/implementation/head/submitNewChain.ts +27 -0
  143. package/src/implementation/index.ts +12 -0
  144. package/src/implementation/mempoolRunner.ts +29 -0
  145. package/src/implementation/mempoolViewer.ts +29 -0
  146. package/src/implementation/pendingTransactions.ts +36 -0
  147. package/src/implementation/producer.ts +16 -0
  148. package/src/implementation/reward.ts +53 -0
  149. package/src/implementation/time.ts +26 -0
  150. package/src/implementation/validator.ts +15 -0
  151. package/src/index.ts +2 -2
  152. package/src/simple/block/index.ts +1 -0
  153. package/src/{BlockProducer/BaseBlockProducerService.ts → simple/block/runner/SimpleBlockRunner.ts} +111 -74
  154. package/src/simple/block/runner/index.ts +1 -0
  155. package/src/simple/block/runner/spec/SimpleBlockRewardViewer.ts +413 -0
  156. package/src/simple/index.ts +1 -0
  157. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts +0 -35
  158. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +0 -1
  159. package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts +0 -13
  160. package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts.map +0 -1
  161. package/dist/neutral/AccountTransfers/index.d.ts +0 -2
  162. package/dist/neutral/AccountTransfers/index.d.ts.map +0 -1
  163. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +0 -85
  164. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +0 -1
  165. package/dist/neutral/BlockProducer/generateTransactionFeeTransfers.d.ts.map +0 -1
  166. package/dist/neutral/BlockProducer/index.d.ts +0 -2
  167. package/dist/neutral/BlockProducer/index.d.ts.map +0 -1
  168. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts +0 -10
  169. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +0 -1
  170. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +0 -18
  171. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +0 -1
  172. package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts +0 -23
  173. package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts.map +0 -1
  174. package/src/AccountBalance/BaseAccountBalanceService.ts +0 -98
  175. package/src/AccountTransfers/BaseAccountTransfersService.ts +0 -36
  176. package/src/AccountTransfers/index.ts +0 -1
  177. package/src/BlockProducer/index.ts +0 -1
  178. package/src/BlockReward/BaseBlockRewardService.ts +0 -17
  179. package/src/BlockReward/EvmBlockRewardService.ts +0 -49
  180. package/src/BlockReward/MemoryBlockRewardService.ts +0 -72
  181. /package/dist/neutral/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.d.ts +0 -0
  182. /package/src/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.ts +0 -0
@@ -2,21 +2,66 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/AccountBalance/accountBalanceServiceFromArchivist.ts
5
- import { assertEx as assertEx2 } from "@xylabs/sdk-js";
5
+ import { assertEx } from "@xylabs/sdk-js";
6
6
  import { StepSizes } from "@xyo-network/xl1-protocol";
7
- import { findMostRecentBlock, LruCacheMap, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
7
+ import { findMostRecentBlock, LruCacheMap, readPayloadMapFromStore, SimpleAccountBalanceViewer, SimpleBlockViewer } from "@xyo-network/xl1-protocol-sdk";
8
8
  import { Semaphore } from "async-mutex";
9
-
10
- // src/AccountBalance/BaseAccountBalanceService.ts
11
- import { assertEx, creatable as creatable2 } from "@xylabs/sdk-js";
12
- import { spanRootAsync as spanRootAsync2 } from "@xylabs/telemetry";
13
- import { AttoXL1 } from "@xyo-network/xl1-protocol";
14
- import { balancesSummary, SimpleAccountBalanceViewer } from "@xyo-network/xl1-protocol-sdk";
15
- import z from "zod";
9
+ var accountBalancesViewerFromArchivist = /* @__PURE__ */ __name(async (chainId, archivist) => {
10
+ const summaryMap = new LruCacheMap({
11
+ max: 1e5,
12
+ allowStale: true,
13
+ noDisposeOnSet: false,
14
+ updateAgeOnGet: true
15
+ });
16
+ const transferSummaryMap = new LruCacheMap({
17
+ max: 1e5,
18
+ allowStale: true,
19
+ noDisposeOnSet: false,
20
+ updateAgeOnGet: true
21
+ });
22
+ const chainMap = readPayloadMapFromStore(archivist);
23
+ const headFunc = /* @__PURE__ */ __name(async () => {
24
+ const head = assertEx(await findMostRecentBlock(archivist), () => "No blocks found in chainArchivist");
25
+ return [
26
+ head._hash,
27
+ head.block
28
+ ];
29
+ }, "headFunc");
30
+ const service = await SimpleAccountBalanceViewer.create({
31
+ context: {
32
+ chainId,
33
+ store: {
34
+ chainMap
35
+ },
36
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
37
+ summaryMap,
38
+ head: headFunc
39
+ },
40
+ transfersSummaryContext: {
41
+ chainId,
42
+ store: {
43
+ chainMap
44
+ },
45
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
46
+ summaryMap: transferSummaryMap,
47
+ head: headFunc
48
+ },
49
+ blockViewer: await SimpleBlockViewer.create({
50
+ context: {
51
+ chainId,
52
+ head: headFunc,
53
+ store: {
54
+ chainMap
55
+ }
56
+ },
57
+ finalizedArchivist: archivist
58
+ })
59
+ });
60
+ return service;
61
+ }, "accountBalancesViewerFromArchivist");
16
62
 
17
63
  // src/BaseService.ts
18
64
  import { AbstractCreatable, creatable } from "@xylabs/sdk-js";
19
- import { spanRoot, spanRootAsync } from "@xylabs/telemetry";
20
65
  import { Mutex } from "async-mutex";
21
66
  function _ts_decorate(decorators, target, key, desc) {
22
67
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -39,15 +84,6 @@ var BaseService = class extends AbstractCreatable {
39
84
  return await this.create(params);
40
85
  });
41
86
  }
42
- paramsHandler(params) {
43
- return params;
44
- }
45
- span(name, fn) {
46
- return spanRoot(name, fn, this.tracer);
47
- }
48
- async spanAsync(name, fn) {
49
- return await spanRootAsync(name, fn, this.tracer);
50
- }
51
87
  };
52
88
  BaseService = _ts_decorate([
53
89
  creatable()
@@ -64,7 +100,10 @@ function creatableService() {
64
100
  }
65
101
  __name(creatableService, "creatableService");
66
102
 
67
- // src/AccountBalance/BaseAccountBalanceService.ts
103
+ // src/BlockReward/EvmBlockRewardViewer.ts
104
+ import { AbstractCreatable as AbstractCreatable2, assertEx as assertEx2, creatable as creatable2, toEthAddress } from "@xylabs/sdk-js";
105
+ import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
106
+ import { asAttoXL1 } from "@xyo-network/xl1-protocol";
68
107
  function _ts_decorate2(decorators, target, key, desc) {
69
108
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
70
109
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -72,801 +111,293 @@ function _ts_decorate2(decorators, target, key, desc) {
72
111
  return c > 3 && r && Object.defineProperty(target, key, r), r;
73
112
  }
74
113
  __name(_ts_decorate2, "_ts_decorate");
75
- var BaseAccountBalanceServiceParamsZod = z.object({
76
- blockViewer: z.object().loose(),
77
- chainArchivist: z.object().loose(),
78
- chainIterator: z.object().loose(),
79
- context: z.object().loose(),
80
- transferContext: z.object().loose()
81
- });
82
- var BaseAccountBalanceService = class extends BaseService {
114
+ var EvmBlockRewardViewer = class extends AbstractCreatable2 {
83
115
  static {
84
- __name(this, "BaseAccountBalanceService");
85
- }
86
- accountBalanceViewer;
87
- get blockViewer() {
88
- return assertEx(this.params.blockViewer, () => "BlockViewer has not been initialized yet");
89
- }
90
- static async paramsHandler(params) {
91
- BaseAccountBalanceServiceParamsZod.parse(params);
92
- assertEx(params?.context?.head, () => "BalanceStepSummaryContext is required in BaseAccountBalanceServiceParams");
93
- return {
94
- ...await super.paramsHandler(params),
95
- ...params
96
- };
116
+ __name(this, "EvmBlockRewardViewer");
97
117
  }
98
- async accountBalance(address, headOrRange) {
99
- const balances = await this.accountsBalances([
100
- address
101
- ], headOrRange);
102
- return balances[address] ?? AttoXL1(0n);
118
+ _contractAddress;
119
+ get chainContractViewer() {
120
+ return assertEx2(this.params.chainContractViewer, () => "chainContractViewer is required");
103
121
  }
104
- accountBalanceHistory(_address, _headOrRange) {
105
- throw new Error("Method not implemented.");
122
+ get contractAddress() {
123
+ return assertEx2(this._contractAddress, () => "contractAddress is required");
106
124
  }
107
- async accountsBalances(address, _headOrRange) {
108
- return await spanRootAsync2("balances", async () => {
109
- const context = {
110
- head: this.params.context.head,
111
- stepSemaphores: this.params.context.stepSemaphores,
112
- store: this.params.context.store,
113
- chainId: this.params.context.chainId,
114
- summaryMap: this.params.context.summaryMap
115
- };
116
- const summary = await balancesSummary(context);
117
- const result = {};
118
- for (const addr of address) {
119
- const summaryBalance = summary[addr] ?? 0n;
120
- result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance);
121
- }
122
- return result;
123
- });
125
+ get provider() {
126
+ return assertEx2(this.params.provider, () => "provider is required");
124
127
  }
125
- accountsBalancesHistory(_addresses, _headOrRange) {
126
- throw new Error("Method not implemented.");
128
+ async allowedRewardForBlock(blockNumber) {
129
+ const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider);
130
+ return asAttoXL1(await contract.calcBlockReward(blockNumber));
127
131
  }
128
132
  async createHandler() {
129
- this.accountBalanceViewer = await SimpleAccountBalanceViewer.create({
130
- context: this.params.context,
131
- transfersSummaryContext: this.params.transfersSummaryContext,
132
- blockViewer: this.blockViewer
133
- });
134
- }
135
- };
136
- BaseAccountBalanceService = _ts_decorate2([
137
- creatable2()
138
- ], BaseAccountBalanceService);
139
-
140
- // src/AccountBalance/accountBalanceServiceFromArchivist.ts
141
- var accountBalancesServiceFromArchivist = /* @__PURE__ */ __name(async (chainId, archivist) => {
142
- const summaryMap = new LruCacheMap({
143
- max: 1e5,
144
- allowStale: true,
145
- noDisposeOnSet: false,
146
- updateAgeOnGet: true
147
- });
148
- const chainMap = readPayloadMapFromStore(archivist);
149
- const headFunc = /* @__PURE__ */ __name(async () => {
150
- const head = await findMostRecentBlock(archivist);
151
- return [
152
- assertEx2(head?._hash, () => "No head found in chainArchivist"),
153
- assertEx2(head?.block, () => "No head found in chainArchivist")
154
- ];
155
- }, "headFunc");
156
- const service = await BaseAccountBalanceService.create({
157
- context: {
158
- chainId,
159
- store: {
160
- chainMap
161
- },
162
- stepSemaphores: StepSizes.map(() => new Semaphore(20)),
163
- summaryMap,
164
- head: headFunc
133
+ await super.createHandler();
134
+ try {
135
+ this._contractAddress = await this.chainContractViewer.rewardsContract();
136
+ } catch (ex) {
137
+ const error = ex;
138
+ throw new Error(`Failed to get rewards contract address: ${error.message}`);
165
139
  }
166
- });
167
- return service;
168
- }, "accountBalancesServiceFromArchivist");
169
-
170
- // src/AccountTransfers/BaseAccountTransfersService.ts
171
- import { creatable as creatable3 } from "@xylabs/sdk-js";
172
- import { spanRootAsync as spanRootAsync3 } from "@xylabs/telemetry";
173
- import { AttoXL1 as AttoXL12 } from "@xyo-network/xl1-protocol";
174
- import { transfersSummary } from "@xyo-network/xl1-protocol-sdk";
175
- function _ts_decorate3(decorators, target, key, desc) {
176
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
177
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
178
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
179
- return c > 3 && r && Object.defineProperty(target, key, r), r;
180
- }
181
- __name(_ts_decorate3, "_ts_decorate");
182
- var BaseAccountTransfersService = class extends BaseService {
183
- static {
184
- __name(this, "BaseAccountTransfersService");
185
- }
186
- async transfer(head, address) {
187
- return (await this.transfers(head, [
188
- address
189
- ]))[address] ?? AttoXL12(0n);
190
- }
191
- async transfers(head, addresses) {
192
- return await spanRootAsync3("transfers", async () => {
193
- const summary = await transfersSummary(this.params.context);
194
- const result = {};
195
- for (const addr of addresses) {
196
- const summaryBalance = summary[addr] ?? 0n;
197
- result[addr] = AttoXL12(summaryBalance);
198
- }
199
- return result;
200
- });
201
140
  }
202
141
  };
203
- BaseAccountTransfersService = _ts_decorate3([
204
- creatable3()
205
- ], BaseAccountTransfersService);
206
-
207
- // src/BlockProducer/BaseBlockProducerService.ts
208
- import { AddressZod, asHash, assertEx as assertEx4, creatable as creatable4, exists, hexToBigInt, isDefined, toHex } from "@xylabs/sdk-js";
209
- import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
210
- import { buildNextBlock, createDeclarationIntent } from "@xyo-network/chain-protocol";
211
- import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
212
- import { asBlockBoundWitness, AttoXL1 as AttoXL13, BlockNumberSchema, defaultRewardRatio, TimeSchema, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-protocol";
213
- import z2 from "zod";
142
+ EvmBlockRewardViewer = _ts_decorate2([
143
+ creatable2()
144
+ ], EvmBlockRewardViewer);
214
145
 
215
- // src/BlockProducer/generateTransactionFeeTransfers.ts
216
- import { hexFromBigInt } from "@xylabs/sdk-js";
217
- import { assertEx as assertEx3 } from "@xylabs/sdk-js";
146
+ // src/blockViewerFromChainIteratorAndArchivist.ts
147
+ import { isDefined } from "@xylabs/sdk-js";
218
148
  import { PayloadBuilder } from "@xyo-network/payload-builder";
219
- import { TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-protocol";
220
- import { transactionRequiredGas } from "@xyo-network/xl1-protocol-sdk";
221
- import { HydratedTransactionWrapper } from "@xyo-network/xl1-wrappers";
222
- async function generateTransactionFeeTransfers(address, transactions) {
223
- const txs = await Promise.all(transactions.map(async (tx) => {
224
- return HydratedTransactionWrapper.parse([
225
- await PayloadBuilder.addStorageMeta(tx[0]),
226
- await PayloadBuilder.addStorageMeta(tx[1])
227
- ]);
228
- }));
229
- const txBaseFeeCosts = {};
230
- for (const tx of txs) {
231
- txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + tx.fees.base;
232
- }
233
- const txGasCosts = {};
234
- for (const tx of txs) {
235
- const requiredGas = transactionRequiredGas(tx.data);
236
- const totalGasCost = requiredGas * tx.fees.gasPrice;
237
- txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + totalGasCost;
238
- }
239
- const payloads = Object.entries(txBaseFeeCosts).map(([from, amount]) => {
240
- const payload = {
241
- schema: TransferSchema,
242
- epoch: Date.now(),
243
- from,
244
- transfers: {
245
- // burn the base fee
246
- [XYO_ZERO_ADDRESS]: hexFromBigInt(amount)
149
+ import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
150
+ function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
151
+ const result = {
152
+ blockByHash: /* @__PURE__ */ __name(async function(hash) {
153
+ const [payload] = await chainArchivist.get([
154
+ hash
155
+ ]);
156
+ const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
157
+ if (isDefined(block)) {
158
+ const payloads = await chainArchivist.get(block.payload_hashes);
159
+ return [
160
+ block,
161
+ payloads
162
+ ];
247
163
  }
248
- };
249
- return payload;
250
- });
251
- for (const [from, amount] of Object.entries(txGasCosts)) {
252
- const fromPayload = assertEx3(payloads.find((p) => p.from === from), () => "from payload not found");
253
- fromPayload.transfers[address] = hexFromBigInt(amount);
254
- }
255
- return payloads;
164
+ return null;
165
+ }, "blockByHash"),
166
+ blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
167
+ const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
168
+ const block = payload ? await PayloadBuilder.addHashMeta(payload) : void 0;
169
+ if (isDefined(block)) {
170
+ const payloads = await chainArchivist.get(block.payload_hashes);
171
+ return [
172
+ block,
173
+ payloads
174
+ ];
175
+ }
176
+ return null;
177
+ }, "blockByNumber"),
178
+ blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
179
+ const results = [];
180
+ for (let i = 0; i < limit; i++) {
181
+ const block = await this.blockByHash(hash);
182
+ if (block) {
183
+ results.push(block);
184
+ } else {
185
+ break;
186
+ }
187
+ }
188
+ return results;
189
+ }, "blocksByHash"),
190
+ blocksByNumber: /* @__PURE__ */ __name(async function(number, limit = 10) {
191
+ const results = [];
192
+ for (let i = 0; i < limit; i++) {
193
+ const block = await this.blockByNumber(number);
194
+ if (block) {
195
+ results.push(block);
196
+ } else {
197
+ break;
198
+ }
199
+ }
200
+ return results;
201
+ }, "blocksByNumber"),
202
+ currentBlock: /* @__PURE__ */ __name(async function() {
203
+ const head = await chainIterator.head();
204
+ return this.blockByHash(head._hash);
205
+ }, "currentBlock"),
206
+ currentBlockHash: /* @__PURE__ */ __name(async function() {
207
+ const head = await chainIterator.head();
208
+ return head._hash;
209
+ }, "currentBlockHash"),
210
+ currentBlockNumber: /* @__PURE__ */ __name(async function() {
211
+ const head = await chainIterator.head();
212
+ return head.block;
213
+ }, "currentBlockNumber"),
214
+ payloadByHash: /* @__PURE__ */ __name(function(_hash) {
215
+ throw new Error("Function not implemented.");
216
+ }, "payloadByHash"),
217
+ payloadsByHash: /* @__PURE__ */ __name(function(_hashes) {
218
+ throw new Error("Function not implemented.");
219
+ }, "payloadsByHash")
220
+ };
221
+ return result;
256
222
  }
257
- __name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
223
+ __name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
258
224
 
259
- // src/BlockProducer/BaseBlockProducerService.ts
260
- function _ts_decorate4(decorators, target, key, desc) {
261
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
262
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
263
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
264
- return c > 3 && r && Object.defineProperty(target, key, r), r;
265
- }
266
- __name(_ts_decorate4, "_ts_decorate");
267
- var DEFAULT_BLOCK_SIZE = 10;
268
- var XYO_PRODUCER_REDECLARATION_DURATION = 1e4;
269
- var XYO_PRODUCER_REDECLARATION_WINDOW = 500;
270
- var BaseBlockProducerServiceParamsZod = z2.object({
271
- balanceService: z2.object().loose(),
272
- pendingTransactionsService: z2.object().loose(),
273
- rejectedTransactionsArchivist: z2.object().loose(),
274
- rewardAddress: AddressZod,
275
- time: z2.object().loose()
276
- });
277
- var BaseBlockProducerService = class _BaseBlockProducerService extends BaseService {
225
+ // src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
226
+ import { assertEx as assertEx3, isDefined as isDefined2, isNull, isUndefined } from "@xylabs/sdk-js";
227
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
228
+ import { asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
229
+ import { hydrateBlock } from "@xyo-network/xl1-protocol-sdk";
230
+ import { LRUCache } from "lru-cache";
231
+ var ChainBlockNumberIterationService = class extends BaseService {
278
232
  static {
279
- __name(this, "BaseBlockProducerService");
280
- }
281
- _blockRewardDiviner;
282
- /**
283
- * The default block size for a block
284
- */
285
- static get DefaultBlockSize() {
286
- return DEFAULT_BLOCK_SIZE;
233
+ __name(this, "ChainBlockNumberIterationService");
287
234
  }
288
- /**
289
- * The amount of time for which the producer will redeclare
290
- * their intent to continue producing blocks
291
- */
292
- static get RedeclarationDuration() {
293
- return XYO_PRODUCER_REDECLARATION_DURATION;
235
+ _blocksByBlockNumber = new LRUCache({
236
+ max: 1e4
237
+ });
238
+ _currentHead;
239
+ get chainId() {
240
+ return assertEx3(this._currentHead?.chain ?? this.params?.head?.chain, () => "Current head is not set");
294
241
  }
295
- /**
296
- * The number of blocks within which the producer will redeclare
297
- * their intent to continue producing blocks
298
- */
299
- static get RedeclarationWindow() {
300
- return XYO_PRODUCER_REDECLARATION_WINDOW;
242
+ get chainMap() {
243
+ return assertEx3(this.params.chainMap);
301
244
  }
302
- get address() {
303
- return this.account.address;
245
+ get chainStoreRead() {
246
+ return {
247
+ chainMap: this.chainMap
248
+ };
304
249
  }
305
- get account() {
306
- return assertEx4(this.params.account, () => "account is required");
307
- }
308
- get balanceService() {
309
- return assertEx4(this.params.balanceService, () => "balanceService is required");
310
- }
311
- get blockViewer() {
312
- return assertEx4(this.params.blockViewer, () => "blockViewer is required");
313
- }
314
- get chainId() {
315
- return assertEx4(this.params.chainId, () => "chainId is required");
316
- }
317
- get electionService() {
318
- return assertEx4(this.params.electionService, () => "electionService is required");
319
- }
320
- get pendingTransactionsService() {
321
- return assertEx4(this.params.pendingTransactionsService, () => "Missing pendingTransactionsService");
322
- }
323
- get rejectedTransactionsArchivist() {
324
- return assertEx4(this.params.rejectedTransactionsArchivist, () => "No rejected bundled transactions archivist");
250
+ async blockByHash(hash) {
251
+ return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null;
325
252
  }
326
- get rewardAddress() {
327
- return assertEx4(this.params.rewardAddress, () => "No reward address provided");
253
+ async blockByNumber(block) {
254
+ return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null;
328
255
  }
329
- get rewardService() {
330
- return assertEx4(this.params.rewardService, () => "rewardService is required");
256
+ async blocksByHash(hash, limit = 100) {
257
+ const results = [];
258
+ let currentBlock = await this.blockByHash(hash);
259
+ while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
260
+ results.push(currentBlock);
261
+ const previousHash = currentBlock[0].previous;
262
+ if (isNull(previousHash)) break;
263
+ currentBlock = await this.blockByHash(previousHash);
264
+ }
265
+ return results;
331
266
  }
332
- get stakeIntentService() {
333
- return assertEx4(this.params.stakeIntentService, () => "No StakeIntentService provided");
267
+ async blocksByNumber(blockNumber, limit = 100) {
268
+ const results = [];
269
+ let currentBlock = await this.blockByNumber(blockNumber);
270
+ while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
271
+ results.push(currentBlock);
272
+ if (currentBlock[0].block === 0) break;
273
+ const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true);
274
+ currentBlock = await this.blockByNumber(previousNumber);
275
+ }
276
+ return results;
334
277
  }
335
- get time() {
336
- return assertEx4(this.params.time, () => "No TimeSyncViewer provided");
278
+ async currentBlock() {
279
+ return assertEx3(await this.blockByHash(await this.currentBlockHash()), () => "Current block not found");
337
280
  }
338
- get validateHydratedBlockState() {
339
- return assertEx4(this.params.validateHydratedBlockState, () => "validateHydratedBlockState is required");
281
+ async currentBlockHash() {
282
+ const head = assertEx3(await this.head(), () => "Head is not set");
283
+ return head._hash;
340
284
  }
341
- static async paramsHandler(params) {
342
- BaseBlockProducerServiceParamsZod.parse(params);
343
- return {
344
- ...await super.paramsHandler(params),
345
- ...params
346
- };
285
+ async currentBlockNumber() {
286
+ const head = assertEx3(await this.head(), () => "Head is not set");
287
+ return head.block;
347
288
  }
348
- async next(head) {
349
- if (head.chain !== this.chainId) return;
350
- const leadersStart = Date.now();
351
- const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head);
352
- const leadersDuration = Date.now() - leadersStart;
353
- if (leadersDuration > 100) {
354
- this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map((l) => l.slice(0, 6)).join(", ")}`);
289
+ async get(block) {
290
+ const head = await this.head();
291
+ assertEx3(head.block >= block, () => `Block requested is newer than the current head [${block}]`);
292
+ const cached = this._blocksByBlockNumber.get(block);
293
+ if (cached) return cached;
294
+ const startingBlock = head;
295
+ const currentBlockHash = await PayloadBuilder2.hash(startingBlock);
296
+ let currentBlock = await this.chainMap.get(currentBlockHash);
297
+ while (isDefined2(currentBlock)) {
298
+ assertEx3(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`);
299
+ if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
300
+ this._blocksByBlockNumber.set(currentBlock.block, currentBlock);
301
+ if (currentBlock.block === block) {
302
+ return currentBlock;
303
+ }
304
+ const { previous } = currentBlock;
305
+ if (isNull(previous)) break;
306
+ currentBlock = await this.chainMap.get(previous);
307
+ }
355
308
  }
356
- if (!leaders.includes(this.address)) return;
357
- return this.proposeNextValidBlock(head);
309
+ throw new Error(`Block not found: ${block}`);
358
310
  }
359
- async getBlockRewardTransfers(block) {
360
- if (!this._blockRewardDiviner) {
361
- this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({
362
- account: "random",
363
- blockRewardService: this.rewardService,
364
- config: {
365
- rewardAddress: this.rewardAddress,
366
- rewardPercentageRatio: defaultRewardRatio,
367
- schema: FixedPercentageBlockRewardDivinerConfigSchema
368
- }
369
- });
311
+ async head() {
312
+ if (isDefined2(this._currentHead)) return this._currentHead;
313
+ if (isDefined2(this.params.head)) {
314
+ const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head);
315
+ this._currentHead = newHead;
316
+ return newHead;
370
317
  }
371
- const blockHex = assertEx4(toHex(block), () => "Failed to convert block to hex");
372
- const blockId = new PayloadBuilder2({
373
- schema: BlockNumberSchema
374
- }).fields({
375
- block: blockHex
376
- }).build();
377
- const rewards = await this._blockRewardDiviner.divine([
378
- blockId
379
- ]);
380
- return rewards;
318
+ throw new Error("Head is not set");
381
319
  }
382
- /**
383
- * Handles the producer redeclaration logic
384
- * @param head The current head block
385
- * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
386
- */
387
- async getProducerRedeclaration(head) {
388
- if (this.params.config.producer.disableIntentRedeclaration) return;
389
- const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, "producer");
390
- const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
391
- if (!lastRange) return;
392
- const [, currentDeclarationEnd] = lastRange;
393
- const currentBlock = head.block;
394
- const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
395
- if (timeToProducerExpiration > _BaseBlockProducerService.RedeclarationWindow) return;
396
- return createDeclarationIntent(this.address, "producer", currentBlock, currentBlock + _BaseBlockProducerService.RedeclarationDuration);
320
+ async next(block) {
321
+ const currentBlock = block;
322
+ const nextBlockNumber = currentBlock + 1;
323
+ return await this.get(nextBlockNumber);
397
324
  }
398
- async proposeNextValidBlock(head, validateBalances = false) {
399
- return await this.spanAsync("proposeNextValidBlock", async () => {
400
- const { block: previousBlock } = assertEx4(asBlockBoundWitness(head), () => "Invalid head block");
401
- const nextBlock = previousBlock + 1;
402
- const nextBlockTransactionsStart = Date.now();
403
- const nextBlockTransactions = await this.pendingTransactionsService.pendingTransactions({
404
- limit: _BaseBlockProducerService.DefaultBlockSize
405
- });
406
- const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
407
- if (nextBlockTransactionsDuration > 200) {
408
- this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
409
- }
410
- const blockPayloads = [];
411
- const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
412
- if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
413
- if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) return;
414
- const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
415
- blockPayloads.push(...rewardTransferPayloads);
416
- const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
417
- const timeStart = Date.now();
418
- const timePayload = await this.generateTimePayload(head);
419
- const timeDuration = Date.now() - timeStart;
420
- if (timeDuration > 100) {
421
- this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
422
- }
423
- const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
424
- blockPayloads.push(...fundedTransfers, timePayload);
425
- this.logger?.info(`Building block ${head.block + 1}`);
426
- const startBuild = Date.now();
427
- const stepRewardPoolBalance = (await this.balanceService.accountsBalances([
428
- XYO_STEP_REWARD_ADDRESS
429
- ]))[XYO_STEP_REWARD_ADDRESS];
430
- const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [
431
- this.account
432
- ], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance);
433
- this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
434
- this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`);
435
- const startValidate = Date.now();
436
- const errors = await this.validateHydratedBlockState(block, this.chainId, {
437
- accountBalance: this.balanceService
438
- });
439
- this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
440
- if (errors.length > 0) {
441
- this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
442
- const rejectedTransactions = block[1];
443
- await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
444
- } else {
445
- return block;
446
- }
447
- });
325
+ payloadByHash(_hash) {
326
+ throw new Error("Method [payloadByHash] not implemented.");
448
327
  }
449
- // remove unfunded transactions and block transfers
450
- async filterByFunded(head, txs, transfers, validateBalances = false) {
451
- const fundedTransfers = [];
452
- const fundedTransactions = (await Promise.all(txs.map(async (tx) => {
453
- const transfer = transfers.find((transfer2) => transfer2.from === tx[0].from);
454
- if (!transfer) return;
455
- const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
456
- if (validateBalances) {
457
- const balance = (await this.balanceService.accountsBalances([
458
- transfer.from
459
- ]))[transfer.from] ?? AttoXL13(0n);
460
- if (balance >= totalTransferCost) {
461
- fundedTransfers.push(transfer);
462
- return tx;
463
- }
328
+ payloadsByHash(_hashes) {
329
+ throw new Error("Method [payloadsByHash] not implemented.");
330
+ }
331
+ // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)
332
+ // and then communicate via method name and documentation
333
+ async previous(block = void 0, count = 1) {
334
+ const results = [];
335
+ let currentBlock = isDefined2(block) ? await this.get(block) : await this.head();
336
+ while (isDefined2(currentBlock) && results.length < count) {
337
+ if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
338
+ results.push(currentBlock);
339
+ const { previous } = currentBlock;
340
+ if (isNull(previous)) break;
341
+ const nextBlock = await this.chainMap.get(previous);
342
+ currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock);
464
343
  } else {
465
- fundedTransfers.push(transfer);
466
- return tx;
344
+ const hash = PayloadBuilder2.hash(currentBlock);
345
+ assertEx3(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
467
346
  }
468
- }))).filter(exists);
469
- return [
470
- fundedTransactions,
471
- fundedTransfers
472
- ];
347
+ }
348
+ return results;
473
349
  }
474
- async generateTimePayload(head) {
475
- const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash("ethereum");
476
- const ethereumHash = asHash(ethHashOrNull, () => "No ethereum hash available from time sync service");
477
- const timePayload = {
478
- schema: TimeSchema,
479
- // this is for the previous block
480
- xl1: head.block,
481
- // this is for the previous block
482
- xl1Hash: head._hash,
483
- ethereum,
484
- ethereumHash,
485
- epoch: Date.now()
486
- };
487
- return timePayload;
350
+ async updateHead(head) {
351
+ const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head);
352
+ this._currentHead = newHead;
353
+ void this.emit("headUpdated", {
354
+ blocks: [
355
+ newHead
356
+ ]
357
+ });
488
358
  }
489
- /**
490
- * Check if a heartbeat block is required based on network activity.
491
- * @param head The current head block
492
- * @returns True if a heartbeat is required, false otherwise
493
- */
494
- heartbeatRequired(head) {
495
- const epoch = head.$epoch;
496
- if (isDefined(epoch)) {
497
- const { heartbeatInterval } = this.params.config.producer;
498
- if (Date.now() - epoch > heartbeatInterval) {
499
- return true;
500
- }
501
- }
502
- return false;
359
+ async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head) {
360
+ const hash = await PayloadBuilder2.hash(head);
361
+ const stored = await this.chainMap.get(hash);
362
+ const newHead = asBlockBoundWitnessWithStorageMeta(stored);
363
+ if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`);
364
+ return newHead;
503
365
  }
504
366
  };
505
- BaseBlockProducerService = _ts_decorate4([
506
- creatable4()
507
- ], BaseBlockProducerService);
508
367
 
509
- // src/BlockReward/BaseBlockRewardService.ts
510
- import { creatable as creatable5 } from "@xylabs/sdk-js";
511
- function _ts_decorate5(decorators, target, key, desc) {
512
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
513
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
514
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
515
- return c > 3 && r && Object.defineProperty(target, key, r), r;
516
- }
517
- __name(_ts_decorate5, "_ts_decorate");
518
- var BaseBlockRewardService = class extends BaseService {
368
+ // src/ChainService/Evm/Evm.ts
369
+ import { assertEx as assertEx4, toAddress, toEthAddress as toEthAddress2 } from "@xylabs/sdk-js";
370
+ import { StakedXyoChain__factory as StakedXyoChainFactory } from "@xyo-network/typechain";
371
+ import { getAddress } from "ethers/address";
372
+ var EvmChainService = class extends BaseService {
519
373
  static {
520
- __name(this, "BaseBlockRewardService");
374
+ __name(this, "EvmChainService");
521
375
  }
522
- getRewardForBlock(_blockNumber) {
523
- throw new Error("getRewardForBlock method must be implemented in derived classes");
376
+ async active() {
377
+ return await (await this.contract()).active();
524
378
  }
525
- };
526
- BaseBlockRewardService = _ts_decorate5([
527
- creatable5()
528
- ], BaseBlockRewardService);
529
-
530
- // src/BlockReward/EvmBlockRewardService.ts
531
- import { assertEx as assertEx5, creatable as creatable6, toEthAddress } from "@xylabs/sdk-js";
532
- import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
533
- function _ts_decorate6(decorators, target, key, desc) {
534
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
535
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
536
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
537
- return c > 3 && r && Object.defineProperty(target, key, r), r;
538
- }
539
- __name(_ts_decorate6, "_ts_decorate");
540
- var EvmBlockRewardService = class extends BaseBlockRewardService {
541
- static {
542
- __name(this, "EvmBlockRewardService");
379
+ async activeByStaked(staked) {
380
+ return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress2(staked)));
543
381
  }
544
- _contractAddress;
545
- get chainService() {
546
- return assertEx5(this.params.chainService, () => "chainService is required");
382
+ async activeByStaker(address) {
383
+ return await (await this.contract()).activeByStaker(getAddress(toEthAddress2(address)));
547
384
  }
548
- get contractAddress() {
549
- return assertEx5(this._contractAddress, () => "contractAddress is required");
385
+ async addStake(staked, amount) {
386
+ const result = await (await this.contract()).addStake(getAddress(toEthAddress2(staked)), amount);
387
+ await result.wait();
388
+ return true;
550
389
  }
551
- get provider() {
552
- return assertEx5(this.params.provider, () => "provider is required");
390
+ chainId() {
391
+ return assertEx4(this.params.id);
553
392
  }
554
- async createHandler() {
555
- await super.createHandler();
556
- try {
557
- this._contractAddress = await this.chainService.rewardsContract();
558
- } catch (ex) {
559
- const error = ex;
560
- throw new Error(`Failed to get rewards contract address: ${error.message}`);
393
+ async contract() {
394
+ if (this.params.contract === void 0) {
395
+ this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(await this.chainId()), this.params.runner);
561
396
  }
397
+ return assertEx4(this.params.contract);
562
398
  }
563
- async getRewardForBlock(blockNumber) {
564
- const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider);
565
- return await contract.calcBlockReward(blockNumber);
566
- }
567
- };
568
- EvmBlockRewardService = _ts_decorate6([
569
- creatable6()
570
- ], EvmBlockRewardService);
571
-
572
- // src/BlockReward/MemoryBlockRewardService.ts
573
- import { assertEx as assertEx6, creatable as creatable7, toFixedPoint } from "@xylabs/sdk-js";
574
- import { rewardFromBlockNumber } from "@xyo-network/chain-protocol";
575
- function _ts_decorate7(decorators, target, key, desc) {
576
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
577
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
578
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
579
- return c > 3 && r && Object.defineProperty(target, key, r), r;
580
- }
581
- __name(_ts_decorate7, "_ts_decorate");
582
- var MemoryBlockRewardService = class extends BaseBlockRewardService {
583
- static {
584
- __name(this, "MemoryBlockRewardService");
585
- }
586
- rewardFromBlockNumber = rewardFromBlockNumber(18);
587
- get creatorReward() {
588
- return assertEx6(this.params.creatorReward, () => "creatorReward is required");
589
- }
590
- get initialReward() {
591
- return assertEx6(this.params.initialStepReward, () => "initialStepReward is required");
592
- }
593
- get minRewardPerBlock() {
594
- return assertEx6(this.params.minRewardPerBlock, () => "minRewardPerBlock is required");
595
- }
596
- get stepFactorDenominator() {
597
- return assertEx6(this.params.stepFactorDenominator, () => "stepFactorDenominator is required");
598
- }
599
- get stepFactorNumerator() {
600
- return assertEx6(this.params.stepFactorNumerator, () => "stepFactorNumerator is required");
601
- }
602
- get stepSize() {
603
- return assertEx6(this.params.stepSize, () => "stepSize is required");
604
- }
605
- static async paramsHandler(inParams) {
606
- return {
607
- ...await super.paramsHandler(inParams),
608
- creatorReward: inParams?.creatorReward ?? toFixedPoint(20000000000n),
609
- initialStepReward: inParams?.initialStepReward ?? toFixedPoint(3000n),
610
- minRewardPerBlock: inParams?.minRewardPerBlock ?? toFixedPoint(30n),
611
- stepFactorDenominator: inParams?.stepFactorDenominator ?? 100n,
612
- stepFactorNumerator: inParams?.stepFactorNumerator ?? 90n,
613
- stepSize: inParams?.stepSize ?? 1000000n
614
- };
615
- }
616
- getRewardForBlock(blockNumber) {
617
- return this.rewardFromBlockNumber(blockNumber, this.initialReward, this.stepSize, this.stepFactorNumerator, this.stepFactorDenominator, this.minRewardPerBlock, this.creatorReward);
618
- }
619
- };
620
- MemoryBlockRewardService = _ts_decorate7([
621
- creatable7()
622
- ], MemoryBlockRewardService);
623
-
624
- // src/blockViewerFromChainIteratorAndArchivist.ts
625
- import { isDefined as isDefined2 } from "@xylabs/sdk-js";
626
- import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
627
- import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
628
- function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
629
- const result = {
630
- blockByHash: /* @__PURE__ */ __name(async function(hash) {
631
- const [payload] = await chainArchivist.get([
632
- hash
633
- ]);
634
- const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
635
- if (isDefined2(block)) {
636
- const payloads = await chainArchivist.get(block.payload_hashes);
637
- return [
638
- block,
639
- payloads
640
- ];
641
- }
642
- return null;
643
- }, "blockByHash"),
644
- blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
645
- const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
646
- const block = payload ? await PayloadBuilder3.addHashMeta(payload) : void 0;
647
- if (isDefined2(block)) {
648
- const payloads = await chainArchivist.get(block.payload_hashes);
649
- return [
650
- block,
651
- payloads
652
- ];
653
- }
654
- return null;
655
- }, "blockByNumber"),
656
- blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
657
- const results = [];
658
- for (let i = 0; i < limit; i++) {
659
- const block = await this.blockByHash(hash);
660
- if (block) {
661
- results.push(block);
662
- } else {
663
- break;
664
- }
665
- }
666
- return results;
667
- }, "blocksByHash"),
668
- blocksByNumber: /* @__PURE__ */ __name(async function(number, limit = 10) {
669
- const results = [];
670
- for (let i = 0; i < limit; i++) {
671
- const block = await this.blockByNumber(number);
672
- if (block) {
673
- results.push(block);
674
- } else {
675
- break;
676
- }
677
- }
678
- return results;
679
- }, "blocksByNumber"),
680
- currentBlock: /* @__PURE__ */ __name(async function() {
681
- const head = await chainIterator.head();
682
- return this.blockByHash(head._hash);
683
- }, "currentBlock"),
684
- currentBlockHash: /* @__PURE__ */ __name(async function() {
685
- const head = await chainIterator.head();
686
- return head._hash;
687
- }, "currentBlockHash"),
688
- currentBlockNumber: /* @__PURE__ */ __name(async function() {
689
- const head = await chainIterator.head();
690
- return head.block;
691
- }, "currentBlockNumber")
692
- };
693
- return result;
694
- }
695
- __name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
696
-
697
- // src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
698
- import { assertEx as assertEx7, isDefined as isDefined3, isNull, isUndefined } from "@xylabs/sdk-js";
699
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
700
- import { asBlockBoundWitness as asBlockBoundWitness2, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
701
- import { hydrateBlock } from "@xyo-network/xl1-protocol-sdk";
702
- import { LRUCache } from "lru-cache";
703
- var ChainBlockNumberIterationService = class extends BaseService {
704
- static {
705
- __name(this, "ChainBlockNumberIterationService");
706
- }
707
- _blocksByBlockNumber = new LRUCache({
708
- max: 1e4
709
- });
710
- _currentHead;
711
- get chainId() {
712
- return assertEx7(this._currentHead?.chain ?? this.params?.head?.chain, () => "Current head is not set");
713
- }
714
- get chainMap() {
715
- return assertEx7(this.params.chainMap);
716
- }
717
- get chainStoreRead() {
718
- return {
719
- chainMap: this.chainMap
720
- };
721
- }
722
- async blockByHash(hash) {
723
- return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null;
724
- }
725
- async blockByNumber(block) {
726
- return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null;
727
- }
728
- async blocksByHash(hash, limit = 100) {
729
- const results = [];
730
- let currentBlock = await this.blockByHash(hash);
731
- while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
732
- results.push(currentBlock);
733
- const previousHash = currentBlock[0].previous;
734
- if (isNull(previousHash)) break;
735
- currentBlock = await this.blockByHash(previousHash);
736
- }
737
- return results;
738
- }
739
- async blocksByNumber(blockNumber, limit = 100) {
740
- const results = [];
741
- let currentBlock = await this.blockByNumber(blockNumber);
742
- while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
743
- results.push(currentBlock);
744
- if (currentBlock[0].block === 0) break;
745
- const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true);
746
- currentBlock = await this.blockByNumber(previousNumber);
747
- }
748
- return results;
749
- }
750
- async currentBlock() {
751
- return assertEx7(await this.blockByHash(await this.currentBlockHash()), () => "Current block not found");
752
- }
753
- async currentBlockHash() {
754
- const head = assertEx7(await this.head(), () => "Head is not set");
755
- return head._hash;
756
- }
757
- async currentBlockNumber() {
758
- const head = assertEx7(await this.head(), () => "Head is not set");
759
- return head.block;
760
- }
761
- async get(block) {
762
- const head = await this.head();
763
- assertEx7(head.block >= block, () => `Block requested is newer than the current head [${block}]`);
764
- const cached = this._blocksByBlockNumber.get(block);
765
- if (cached) return cached;
766
- const startingBlock = head;
767
- const currentBlockHash = await PayloadBuilder4.hash(startingBlock);
768
- let currentBlock = await this.chainMap.get(currentBlockHash);
769
- while (isDefined3(currentBlock)) {
770
- assertEx7(asBlockBoundWitness2(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`);
771
- if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
772
- this._blocksByBlockNumber.set(currentBlock.block, currentBlock);
773
- if (currentBlock.block === block) {
774
- return currentBlock;
775
- }
776
- const { previous } = currentBlock;
777
- if (isNull(previous)) break;
778
- currentBlock = await this.chainMap.get(previous);
779
- }
780
- }
781
- throw new Error(`Block not found: ${block}`);
782
- }
783
- async head() {
784
- if (isDefined3(this._currentHead)) return this._currentHead;
785
- if (isDefined3(this.params.head)) {
786
- const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head);
787
- this._currentHead = newHead;
788
- return newHead;
789
- }
790
- throw new Error("Head is not set");
791
- }
792
- async next(block) {
793
- const currentBlock = block;
794
- const nextBlockNumber = currentBlock + 1;
795
- return await this.get(nextBlockNumber);
796
- }
797
- // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)
798
- // and then communicate via method name and documentation
799
- async previous(block = void 0, count = 1) {
800
- const results = [];
801
- let currentBlock = isDefined3(block) ? await this.get(block) : await this.head();
802
- while (isDefined3(currentBlock) && results.length < count) {
803
- if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
804
- results.push(currentBlock);
805
- const { previous } = currentBlock;
806
- if (isNull(previous)) break;
807
- const nextBlock = await this.chainMap.get(previous);
808
- currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock);
809
- } else {
810
- const hash = PayloadBuilder4.hash(currentBlock);
811
- assertEx7(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
812
- }
813
- }
814
- return results;
815
- }
816
- async updateHead(head) {
817
- const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head);
818
- this._currentHead = newHead;
819
- void this.emit("headUpdated", {
820
- blocks: [
821
- newHead
822
- ]
823
- });
824
- }
825
- async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head) {
826
- const hash = await PayloadBuilder4.hash(head);
827
- const stored = await this.chainMap.get(hash);
828
- const newHead = asBlockBoundWitnessWithStorageMeta(stored);
829
- if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`);
830
- return newHead;
831
- }
832
- };
833
-
834
- // src/ChainService/Evm/Evm.ts
835
- import { assertEx as assertEx8, toAddress, toEthAddress as toEthAddress2 } from "@xylabs/sdk-js";
836
- import { StakedXyoChain__factory as StakedXyoChainFactory } from "@xyo-network/typechain";
837
- import { getAddress } from "ethers/address";
838
- var EvmChainService = class extends BaseService {
839
- static {
840
- __name(this, "EvmChainService");
841
- }
842
- get runner() {
843
- return assertEx8(this.params.runner);
844
- }
845
- async active() {
846
- return await (await this.contract()).active();
847
- }
848
- async activeByStaked(staked) {
849
- return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress2(staked)));
850
- }
851
- async activeByStaker(address) {
852
- return await (await this.contract()).activeByStaker(getAddress(toEthAddress2(address)));
853
- }
854
- async addStake(staked, amount) {
855
- const result = await (await this.contract()).addStake(getAddress(toEthAddress2(staked)), amount);
856
- await result.wait();
857
- return true;
858
- }
859
- chainId() {
860
- return assertEx8(this.params.id);
861
- }
862
- async contract() {
863
- if (this.params.contract === void 0) {
864
- this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(await this.chainId()), this.params.runner);
865
- }
866
- return assertEx8(this.params.contract);
867
- }
868
- async forkedAtBlockNumber() {
869
- return await (await this.contract()).forkedAtBlockNumber();
399
+ async forkedAtBlockNumber() {
400
+ return await (await this.contract()).forkedAtBlockNumber();
870
401
  }
871
402
  async forkedAtHash() {
872
403
  return await (await this.contract()).forkedAtHash();
@@ -888,6 +419,9 @@ var EvmChainService = class extends BaseService {
888
419
  await result.wait();
889
420
  return true;
890
421
  }
422
+ rewardForBlock(_block) {
423
+ throw new Error("Method not implemented.");
424
+ }
891
425
  async rewardsContract() {
892
426
  return await (await this.contract()).rewardsContract();
893
427
  }
@@ -908,7 +442,7 @@ var EvmChainService = class extends BaseService {
908
442
  };
909
443
 
910
444
  // src/ChainService/Memory/Memory.ts
911
- import { assertEx as assertEx9, toAddress as toAddress2, ZERO_ADDRESS } from "@xylabs/sdk-js";
445
+ import { assertEx as assertEx5, toAddress as toAddress2, ZERO_ADDRESS } from "@xylabs/sdk-js";
912
446
  var MemoryChainService = class extends BaseService {
913
447
  static {
914
448
  __name(this, "MemoryChainService");
@@ -928,7 +462,7 @@ var MemoryChainService = class extends BaseService {
928
462
  return await Promise.resolve(true);
929
463
  }
930
464
  chainId() {
931
- return assertEx9(this._chainId, () => "Chain ID not set");
465
+ return assertEx5(this._chainId, () => "Chain ID not set");
932
466
  }
933
467
  createHandler() {
934
468
  const { minStake = 1 } = this.params.config.producer ?? {};
@@ -955,6 +489,9 @@ var MemoryChainService = class extends BaseService {
955
489
  async removeStake(_slot) {
956
490
  return await Promise.resolve(true);
957
491
  }
492
+ rewardForBlock(_block) {
493
+ throw new Error("Method not implemented.");
494
+ }
958
495
  async rewardsContract() {
959
496
  return await Promise.resolve("");
960
497
  }
@@ -977,39 +514,39 @@ var MemoryChainService = class extends BaseService {
977
514
  };
978
515
 
979
516
  // src/ChainValidator/XyoValidator.ts
980
- import { assertEx as assertEx10, creatable as creatable8 } from "@xylabs/sdk-js";
981
- function _ts_decorate8(decorators, target, key, desc) {
517
+ import { assertEx as assertEx6, creatable as creatable3 } from "@xylabs/sdk-js";
518
+ function _ts_decorate3(decorators, target, key, desc) {
982
519
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
983
520
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
984
521
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
985
522
  return c > 3 && r && Object.defineProperty(target, key, r), r;
986
523
  }
987
- __name(_ts_decorate8, "_ts_decorate");
524
+ __name(_ts_decorate3, "_ts_decorate");
988
525
  var XyoValidator = class extends BaseService {
989
526
  static {
990
527
  __name(this, "XyoValidator");
991
528
  }
992
- get address() {
993
- return this.account.address;
994
- }
995
- get account() {
996
- return assertEx10(this.params.account, () => "account is required");
997
- }
529
+ // get address() {
530
+ // return this.account.address
531
+ // }
532
+ // protected get account() {
533
+ // return assertEx(this.params.account, () => 'account is required')
534
+ // }
998
535
  get blockViewer() {
999
- return assertEx10(this.params.blockViewer, () => "blockViewer is required");
1000
- }
1001
- get chainInfo() {
1002
- return assertEx10(this.params.chainId, () => "chainInfo is required");
1003
- }
1004
- get electionService() {
1005
- return assertEx10(this.params.electionService, () => "electionService is required");
1006
- }
1007
- get pendingBundledTransactionsArchivist() {
1008
- return assertEx10(this.params.pendingBundledTransactionsArchivist, () => "pendingBundledTransactions is required");
1009
- }
1010
- get rewardService() {
1011
- return assertEx10(this.params.rewardService, () => "rewardService is required");
1012
- }
536
+ return assertEx6(this.params.blockViewer, () => "blockViewer is required");
537
+ }
538
+ // protected get chainInfo() {
539
+ // return assertEx(this.params.chainId, () => 'chainInfo is required')
540
+ // }
541
+ // protected get electionService() {
542
+ // return assertEx(this.params.electionService, () => 'electionService is required')
543
+ // }
544
+ // protected get pendingBundledTransactionsArchivist() {
545
+ // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')
546
+ // }
547
+ // protected get blockRewardService() {
548
+ // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')
549
+ // }
1013
550
  validatePendingBlock(_block) {
1014
551
  return [];
1015
552
  }
@@ -1020,32 +557,32 @@ var XyoValidator = class extends BaseService {
1020
557
  return await Promise.resolve(true);
1021
558
  }
1022
559
  };
1023
- XyoValidator = _ts_decorate8([
1024
- creatable8()
560
+ XyoValidator = _ts_decorate3([
561
+ creatable3()
1025
562
  ], XyoValidator);
1026
563
 
1027
564
  // src/Election/BaseElectionService.ts
1028
- import { assertEx as assertEx11, creatable as creatable9 } from "@xylabs/sdk-js";
565
+ import { assertEx as assertEx7, creatable as creatable4 } from "@xylabs/sdk-js";
1029
566
  import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
1030
- function _ts_decorate9(decorators, target, key, desc) {
567
+ function _ts_decorate4(decorators, target, key, desc) {
1031
568
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1032
569
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1033
570
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1034
571
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1035
572
  }
1036
- __name(_ts_decorate9, "_ts_decorate");
573
+ __name(_ts_decorate4, "_ts_decorate");
1037
574
  var BaseElectionService = class extends BaseService {
1038
575
  static {
1039
576
  __name(this, "BaseElectionService");
1040
577
  }
1041
578
  get blockViewer() {
1042
- return assertEx11(this.params.blockViewer, () => "No block viewer");
579
+ return assertEx7(this.params.blockViewer, () => "No block viewer");
1043
580
  }
1044
581
  get chainStakeViewer() {
1045
- return assertEx11(this.params.chainStakeViewer, () => "No chain stake viewer");
582
+ return assertEx7(this.params.chainStakeViewer, () => "No chain stake viewer");
1046
583
  }
1047
584
  get stakeIntentService() {
1048
- return assertEx11(this.params.stakeIntentService, () => "No staked intent service");
585
+ return assertEx7(this.params.stakeIntentService, () => "No staked intent service");
1049
586
  }
1050
587
  async getCreatorCommitteeForNextBlock(current) {
1051
588
  return await this.spanAsync("getCreatorCommitteeForNextBlock", async () => {
@@ -1062,96 +599,490 @@ var BaseElectionService = class extends BaseService {
1062
599
  return creatorArray.slice(0, maxSize);
1063
600
  }
1064
601
  };
1065
- BaseElectionService = _ts_decorate9([
1066
- creatable9()
602
+ BaseElectionService = _ts_decorate4([
603
+ creatable4()
1067
604
  ], BaseElectionService);
1068
605
 
1069
- // src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
1070
- import { creatable as creatable10 } from "@xylabs/sdk-js";
1071
- function _ts_decorate10(decorators, target, key, desc) {
1072
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1073
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1074
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1075
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1076
- }
1077
- __name(_ts_decorate10, "_ts_decorate");
1078
- var BaseNetworkStakeStepRewardService = class extends BaseService {
1079
- static {
1080
- __name(this, "BaseNetworkStakeStepRewardService");
1081
- }
1082
- networkStakeStepRewardAddressHistory(_address) {
1083
- throw new Error("Method not implemented.");
1084
- }
1085
- networkStakeStepRewardAddressReward(_context, _address) {
1086
- throw new Error("Method not implemented.");
1087
- }
1088
- networkStakeStepRewardAddressShare(_context, _address) {
1089
- throw new Error("Method not implemented.");
1090
- }
1091
- networkStakeStepRewardClaimedByAddress(_address) {
1092
- throw new Error("Method not implemented.");
1093
- }
1094
- networkStakeStepRewardForPosition(_position, _range) {
1095
- throw new Error("Method not implemented.");
1096
- }
1097
- networkStakeStepRewardForStep(_context) {
1098
- throw new Error("Method not implemented.");
1099
- }
1100
- networkStakeStepRewardForStepForPosition(_context, _position) {
1101
- throw new Error("Method not implemented.");
1102
- }
1103
- networkStakeStepRewardPoolRewards(_context) {
1104
- throw new Error("Method not implemented.");
1105
- }
1106
- networkStakeStepRewardPoolShares(_context) {
1107
- throw new Error("Method not implemented.");
1108
- }
1109
- networkStakeStepRewardPositionWeight(_context, _position) {
1110
- throw new Error("Method not implemented.");
1111
- }
1112
- networkStakeStepRewardPotentialPositionLoss(_context, _position) {
1113
- throw new Error("Method not implemented.");
1114
- }
1115
- networkStakeStepRewardRandomizer(_context) {
1116
- throw new Error("Method not implemented.");
1117
- }
1118
- networkStakeStepRewardStakerCount(_context) {
1119
- throw new Error("Method not implemented.");
606
+ // src/implementation/accountBalance.ts
607
+ import { isDefined as isDefined3 } from "@xylabs/sdk-js";
608
+ import { AccountBalanceViewerRpcSchemas, HttpRpcTransport, JsonRpcAccountBalanceViewer } from "@xyo-network/xl1-rpc";
609
+ var balanceServiceSingleton;
610
+ var initAccountBalanceService = /* @__PURE__ */ __name((params) => {
611
+ const { config, logger } = params;
612
+ if (balanceServiceSingleton) return balanceServiceSingleton;
613
+ const endpoint = config.services?.accountBalanceViewerEndpoint ?? config.services?.apiEndpoint;
614
+ if (isDefined3(endpoint)) {
615
+ const transport = new HttpRpcTransport(endpoint, {
616
+ ...AccountBalanceViewerRpcSchemas
617
+ });
618
+ const viewer = new JsonRpcAccountBalanceViewer(transport);
619
+ logger?.log("Using AccountBalanceViewer RPC service at", endpoint);
620
+ return viewer;
621
+ } else {
622
+ throw new Error("No AccountBalanceViewer endpoint configured");
1120
623
  }
1121
- networkStakeStepRewardUnclaimedByAddress(_address) {
1122
- throw new Error("Method not implemented.");
624
+ }, "initAccountBalanceService");
625
+
626
+ // src/implementation/blockViewer.ts
627
+ import { isDefined as isDefined4 } from "@xylabs/sdk-js";
628
+ import { BlockViewerRpcSchemas, HttpRpcTransport as HttpRpcTransport2, JsonRpcBlockViewer } from "@xyo-network/xl1-rpc";
629
+ var blockViewerSingleton;
630
+ var initBlockViewer = /* @__PURE__ */ __name((params) => {
631
+ const { config, logger } = params;
632
+ if (blockViewerSingleton) return blockViewerSingleton;
633
+ const endpoint = config.services?.apiEndpoint;
634
+ if (isDefined4(endpoint)) {
635
+ const transport = new HttpRpcTransport2(endpoint, {
636
+ ...BlockViewerRpcSchemas
637
+ });
638
+ const viewer = new JsonRpcBlockViewer(transport);
639
+ logger?.log("Using BlockViewer RPC service at", endpoint);
640
+ return viewer;
641
+ } else {
642
+ throw new Error("No BlockViewer endpoint configured");
1123
643
  }
1124
- networkStakeStepRewardWeightForAddress(_context, _address) {
1125
- throw new Error("Method not implemented.");
644
+ }, "initBlockViewer");
645
+
646
+ // src/implementation/chain/index.ts
647
+ import { assertEx as assertEx13 } from "@xylabs/sdk-js";
648
+
649
+ // src/implementation/chain/evm.ts
650
+ import { asAddress, assertEx as assertEx12, isDefined as isDefined8, ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/sdk-js";
651
+ import { Wallet } from "ethers/wallet";
652
+
653
+ // src/implementation/evm/initEvmProvider.ts
654
+ import { assertEx as assertEx11 } from "@xylabs/sdk-js";
655
+
656
+ // src/implementation/evm/initInfuraProvider.ts
657
+ import { assertEx as assertEx9, isDefined as isDefined6 } from "@xylabs/sdk-js";
658
+ import { InfuraProvider } from "ethers/providers";
659
+
660
+ // src/implementation/evm/initChainId.ts
661
+ import { assertEx as assertEx8, hexFrom, isDefined as isDefined5, isHex } from "@xylabs/sdk-js";
662
+ var canUseChainId = /* @__PURE__ */ __name((config) => {
663
+ return isDefined5(config.evm.chainId);
664
+ }, "canUseChainId");
665
+ var getChainId = /* @__PURE__ */ __name((config) => {
666
+ const chainId = assertEx8(config.evm.chainId, () => "Missing config.evm.chainId");
667
+ if (isHex(chainId, {
668
+ prefix: true
669
+ })) {
670
+ const hex = hexFrom(chainId);
671
+ const parsed = Number.parseInt(hex, 16);
672
+ return parsed;
673
+ } else {
674
+ const parsed = Number.parseInt(chainId, 10);
675
+ return parsed;
676
+ }
677
+ }, "getChainId");
678
+
679
+ // src/implementation/evm/initInfuraProvider.ts
680
+ var instance;
681
+ var initInfuraProvider = /* @__PURE__ */ __name((config) => {
682
+ if (instance) return instance;
683
+ const providerConfig = getInfuraProviderConfig(config);
684
+ instance = Promise.resolve(new InfuraProvider(...providerConfig));
685
+ return instance;
686
+ }, "initInfuraProvider");
687
+ var canUseInfuraProvider = /* @__PURE__ */ __name((config) => {
688
+ return canUseChainId(config) && isDefined6(config.evm?.infura?.projectId) && isDefined6(config.evm?.infura?.projectSecret);
689
+ }, "canUseInfuraProvider");
690
+ var getInfuraProviderConfig = /* @__PURE__ */ __name((config) => {
691
+ const projectId = assertEx9(config.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
692
+ const projectSecret = assertEx9(config.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
693
+ return [
694
+ getChainId(config),
695
+ projectId,
696
+ projectSecret
697
+ ];
698
+ }, "getInfuraProviderConfig");
699
+
700
+ // src/implementation/evm/initJsonRpcProvider.ts
701
+ import { assertEx as assertEx10, isDefined as isDefined7 } from "@xylabs/sdk-js";
702
+ import { JsonRpcProvider } from "ethers/providers";
703
+ var initJsonRpcProvider = /* @__PURE__ */ __name((config) => {
704
+ const providerConfig = getJsonRpcProviderConfig(config);
705
+ return Promise.resolve(new JsonRpcProvider(...providerConfig));
706
+ }, "initJsonRpcProvider");
707
+ var canUseJsonRpcProvider = /* @__PURE__ */ __name((config) => {
708
+ return canUseChainId(config) && isDefined7(config.evm.jsonRpc?.url);
709
+ }, "canUseJsonRpcProvider");
710
+ var getJsonRpcProviderConfig = /* @__PURE__ */ __name((config) => {
711
+ const jsonRpcUrl = assertEx10(config.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
712
+ return [
713
+ jsonRpcUrl,
714
+ getChainId(config)
715
+ ];
716
+ }, "getJsonRpcProviderConfig");
717
+
718
+ // src/implementation/evm/initEvmProvider.ts
719
+ var provider;
720
+ var initEvmProvider = /* @__PURE__ */ __name(async ({ config }) => {
721
+ if (provider) return provider;
722
+ if (canUseInfuraProvider(config)) {
723
+ provider = initInfuraProvider(config);
724
+ } else if (canUseJsonRpcProvider(config)) {
725
+ provider = initJsonRpcProvider(config);
726
+ }
727
+ return assertEx11(await provider, () => "No provider available");
728
+ }, "initEvmProvider");
729
+ var canUseEvmProvider = /* @__PURE__ */ __name(({ config }) => {
730
+ return canUseInfuraProvider(config) || canUseJsonRpcProvider(config);
731
+ }, "canUseEvmProvider");
732
+
733
+ // src/implementation/chain/evm.ts
734
+ var chainStakeServiceSingleton;
735
+ var canUseEvmContractChainService = /* @__PURE__ */ __name((config) => {
736
+ const { id } = config.chain;
737
+ return isDefined8(id) && id !== ZERO_ADDRESS2 && canUseEvmProvider({
738
+ config
739
+ });
740
+ }, "canUseEvmContractChainService");
741
+ var initEvmContractChainService = /* @__PURE__ */ __name(async ({ account, config, traceProvider, meterProvider, logger }) => {
742
+ if (chainStakeServiceSingleton) return chainStakeServiceSingleton;
743
+ const emvStakingContractAddress = assertEx12(config.chain.id, () => "config.chain.id is required");
744
+ const id = assertEx12(asAddress(emvStakingContractAddress), () => "config.chain.id is not a valid address");
745
+ const provider2 = assertEx12(await initEvmProvider({
746
+ config
747
+ }));
748
+ const privateKey = assertEx12(account.private?.hex, () => "Account does not have a private key");
749
+ const runner = new Wallet(privateKey, provider2);
750
+ chainStakeServiceSingleton = EvmChainService.create({
751
+ id,
752
+ runner,
753
+ traceProvider,
754
+ meterProvider,
755
+ logger
756
+ });
757
+ const result = await chainStakeServiceSingleton;
758
+ await result.start();
759
+ return result;
760
+ }, "initEvmContractChainService");
761
+
762
+ // src/implementation/chain/index.ts
763
+ var chainStakeServiceSingleton2;
764
+ var initChainService = /* @__PURE__ */ __name(({ account, config, logger }) => {
765
+ logger?.log("ChainService: Initializing...");
766
+ const result = init({
767
+ config,
768
+ name: "ChainService",
769
+ account
770
+ });
771
+ logger?.log("ChainService: Initialized");
772
+ return result;
773
+ }, "initChainService");
774
+ var initMemoryChainService = /* @__PURE__ */ __name(async ({ config }) => {
775
+ const result = await MemoryChainService.create({
776
+ config,
777
+ name: "MemoryChainService"
778
+ });
779
+ assertEx13(await result.start(), () => "Failed to start MemoryChainService");
780
+ return result;
781
+ }, "initMemoryChainService");
782
+ var init = /* @__PURE__ */ __name(async (params) => {
783
+ if (chainStakeServiceSingleton2) return chainStakeServiceSingleton2;
784
+ const { config } = params;
785
+ chainStakeServiceSingleton2 = canUseEvmContractChainService(config) ? await initEvmContractChainService({
786
+ ...params,
787
+ name: "ChainStakeService"
788
+ }) : await initMemoryChainService(params);
789
+ return chainStakeServiceSingleton2;
790
+ }, "init");
791
+
792
+ // src/implementation/head/head.ts
793
+ import { assertEx as assertEx14, isDefined as isDefined10 } from "@xylabs/sdk-js";
794
+ import { findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/xl1-protocol-sdk";
795
+
796
+ // src/implementation/head/createBootstrapHead.ts
797
+ import { buildNextBlock, createDeclarationIntent, createGenesisBlock } from "@xyo-network/chain-protocol";
798
+ var createBootstrapHead = /* @__PURE__ */ __name(async (account, chainService) => {
799
+ const chainId = await chainService.chainId();
800
+ const chain = [];
801
+ const genesisBlock = await createGenesisBlock(account, chainId, 10000000n, account.address);
802
+ chain.push(genesisBlock);
803
+ const producerDeclarationPayload = createDeclarationIntent(account.address, "producer", genesisBlock[0].block, genesisBlock[0].block + 1e4);
804
+ const producerDeclarationBlock = await buildNextBlock(genesisBlock[0], [], [
805
+ producerDeclarationPayload
806
+ ], [
807
+ account
808
+ ]);
809
+ chain.push(producerDeclarationBlock);
810
+ return chain;
811
+ }, "createBootstrapHead");
812
+
813
+ // src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
814
+ import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
815
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
816
+ import { BridgeDestinationObservationSchema } from "@xyo-network/xl1-protocol";
817
+
818
+ // src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
819
+ import { toHex as toHex2 } from "@xylabs/sdk-js";
820
+
821
+ // src/implementation/head/createForkedHead/config/getForkDetails.ts
822
+ import { toHex } from "@xylabs/sdk-js";
823
+ import { AttoXL1ConvertFactor } from "@xyo-network/xl1-protocol";
824
+ var getForkBlockReward = /* @__PURE__ */ __name(() => {
825
+ return 18000000000n * AttoXL1ConvertFactor.xl1;
826
+ }, "getForkBlockReward");
827
+ var getForkBlockRewardHex = /* @__PURE__ */ __name(() => {
828
+ return toHex(getForkBlockReward());
829
+ }, "getForkBlockRewardHex");
830
+
831
+ // src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
832
+ var ethChainId = toHex2("0x1");
833
+ var bridgeableTokenContract = toHex2("0xf72aE3E0DA743033AbD7A407557D684c1aE66aed");
834
+ var bridgeDestAddress = toHex2("0x0e65b65B10C791942665030402c35023d88B14dA");
835
+ var destConfirmation = toHex2("0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3");
836
+ var getBridgeDestChainId = /* @__PURE__ */ __name(() => ethChainId, "getBridgeDestChainId");
837
+ var getBridgeDestToken = /* @__PURE__ */ __name(() => bridgeableTokenContract, "getBridgeDestToken");
838
+ var getBridgeDestAddress = /* @__PURE__ */ __name(() => bridgeDestAddress, "getBridgeDestAddress");
839
+ var getBridgeDestAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeDestAmount");
840
+ var getBridgeDestConfirmation = /* @__PURE__ */ __name(() => destConfirmation, "getBridgeDestConfirmation");
841
+ var getBridgeDestinationDetails = /* @__PURE__ */ __name(() => {
842
+ return {
843
+ dest: getBridgeDestChainId(),
844
+ destToken: getBridgeDestToken(),
845
+ destAddress: getBridgeDestAddress(),
846
+ destAmount: getBridgeDestAmount()
847
+ };
848
+ }, "getBridgeDestinationDetails");
849
+
850
+ // src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts
851
+ var getBridgeSrcChainId = /* @__PURE__ */ __name((chainService) => chainService.chainId(), "getBridgeSrcChainId");
852
+ var getBridgeSrcAddress = /* @__PURE__ */ __name((account) => account.address, "getBridgeSrcAddress");
853
+ var getBridgeSrcToken = /* @__PURE__ */ __name((chainService) => chainService.chainId(), "getBridgeSrcToken");
854
+ var getBridgeSrcAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeSrcAmount");
855
+ var getBridgeSourceDetails = /* @__PURE__ */ __name(async (account, chainService) => {
856
+ return {
857
+ src: await getBridgeSrcChainId(chainService),
858
+ srcAddress: getBridgeSrcAddress(account),
859
+ srcToken: await getBridgeSrcToken(chainService),
860
+ srcAmount: getBridgeSrcAmount()
861
+ };
862
+ }, "getBridgeSourceDetails");
863
+
864
+ // src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
865
+ var getBridgeDestinationObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
866
+ const bridgeDestinationObservationFields = {
867
+ ...await getBridgeSourceDetails(account, chainService),
868
+ ...getBridgeDestinationDetails(),
869
+ destConfirmation: getBridgeDestConfirmation()
870
+ };
871
+ const bridgeDestinationObservation = new PayloadBuilder3({
872
+ schema: BridgeDestinationObservationSchema
873
+ }).fields(bridgeDestinationObservationFields).build();
874
+ return await buildNextBlock2(previousBlock[0], [], [
875
+ bridgeDestinationObservation
876
+ ], [
877
+ account
878
+ ]);
879
+ }, "getBridgeDestinationObservation");
880
+
881
+ // src/implementation/head/createForkedHead/getBridgeIntent.ts
882
+ import { buildNextBlock as buildNextBlock3, createTransferPayload } from "@xyo-network/chain-protocol";
883
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
884
+ import { BridgeIntentSchema, XYO_BRIDGE_ADDRESS } from "@xyo-network/xl1-protocol";
885
+ var getBridgeIntent = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
886
+ const transferPayload = createTransferPayload(account.address, {
887
+ [XYO_BRIDGE_ADDRESS]: getForkBlockReward()
888
+ });
889
+ const nonce = `${Date.now()}`;
890
+ const bridgeIntentFields = {
891
+ ...await getBridgeSourceDetails(account, chainService),
892
+ ...getBridgeDestinationDetails(),
893
+ nonce
894
+ };
895
+ const bridgeIntent = new PayloadBuilder4({
896
+ schema: BridgeIntentSchema
897
+ }).fields(bridgeIntentFields).build();
898
+ return await buildNextBlock3(previousBlock[0], [], [
899
+ bridgeIntent,
900
+ transferPayload
901
+ ], [
902
+ account
903
+ ]);
904
+ }, "getBridgeIntent");
905
+
906
+ // src/implementation/head/createForkedHead/getBridgeSourceObservation.ts
907
+ import { buildNextBlock as buildNextBlock4 } from "@xyo-network/chain-protocol";
908
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
909
+ import { BridgeSourceObservationSchema } from "@xyo-network/xl1-protocol";
910
+ var getBridgeSourceObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
911
+ const srcTxHash = previousBlock[0]._hash;
912
+ const bridgeSourceObservationFields = {
913
+ ...await getBridgeSourceDetails(account, chainService),
914
+ ...getBridgeDestinationDetails(),
915
+ // Observation
916
+ srcConfirmation: srcTxHash
917
+ };
918
+ const bridgeSourceObservation = new PayloadBuilder5({
919
+ schema: BridgeSourceObservationSchema
920
+ }).fields(bridgeSourceObservationFields).build();
921
+ return await buildNextBlock4(previousBlock[0], [], [
922
+ bridgeSourceObservation
923
+ ], [
924
+ account
925
+ ]);
926
+ }, "getBridgeSourceObservation");
927
+
928
+ // src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts
929
+ import { buildBlock } from "@xyo-network/chain-protocol";
930
+ import { AttoXL1, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-protocol";
931
+ var getFirstBlockForNewChain = /* @__PURE__ */ __name(async (forkBlock, account, chainService) => {
932
+ const { _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes = [], protocol } = forkBlock;
933
+ const chainId = await chainService.chainId();
934
+ const options = {
935
+ blockPayloads: [],
936
+ chainId,
937
+ previousBlockHash,
938
+ previousBlockNumber,
939
+ previousStepHashes,
940
+ signers: [
941
+ account
942
+ ],
943
+ txs: [],
944
+ protocol,
945
+ chainStepRewardAddress: XYO_STEP_REWARD_ADDRESS,
946
+ stepRewardPoolBalance: AttoXL1(0n)
947
+ };
948
+ return await buildBlock(options);
949
+ }, "getFirstBlockForNewChain");
950
+
951
+ // src/implementation/head/createForkedHead/createForkedHead.ts
952
+ var createForkedHead = /* @__PURE__ */ __name(async (forkFromBlock, account, chainService) => {
953
+ const chain = [];
954
+ const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService);
955
+ chain.push(firstBlockForNewChain);
956
+ const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService);
957
+ chain.push(bridgeIntent);
958
+ const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService);
959
+ chain.push(bridgeSourceObservation);
960
+ const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService);
961
+ chain.push(bridgeDestinationObservation);
962
+ return chain;
963
+ }, "createForkedHead");
964
+
965
+ // src/implementation/head/getForkFromBlock.ts
966
+ import { asHash, hexFromBigInt, isDefined as isDefined9 } from "@xylabs/sdk-js";
967
+ import { isSignedBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
968
+ var getForkFromBlock = /* @__PURE__ */ __name(async (head, chainService, chainArchivist) => {
969
+ if (head.chain !== await chainService.chainId()) {
970
+ const forkedAtBigInt = await chainService.forkedAtHash();
971
+ const forkedAtHex = hexFromBigInt(forkedAtBigInt);
972
+ const forkedAtHash = asHash(forkedAtHex);
973
+ if (isDefined9(forkedAtHash)) {
974
+ const [forkedAtBlock] = await chainArchivist.get([
975
+ forkedAtHash
976
+ ]);
977
+ const forkedChainId = await chainService.forkedChainId();
978
+ const forkedAtBlockNumber = Number(await chainService.forkedAtBlockNumber());
979
+ if (isSignedBlockBoundWitnessWithHashMeta(forkedAtBlock) && forkedAtBlock.chain === forkedChainId && forkedAtBlock.block === forkedAtBlockNumber) {
980
+ return forkedAtBlock;
981
+ }
982
+ }
1126
983
  }
1127
- networkStakeStepRewardsForPosition(_position, _range) {
1128
- throw new Error("Method not implemented.");
984
+ }, "getForkFromBlock");
985
+
986
+ // src/implementation/head/submitNewChain.ts
987
+ import { delay } from "@xylabs/sdk-js";
988
+ import { flattenHydratedBlock } from "@xyo-network/xl1-protocol-sdk";
989
+ var submitNewChain = /* @__PURE__ */ __name(async (chain, chainArchivist, chainSubmissionsArchivistWrite) => {
990
+ for (const block of chain) {
991
+ const [bw] = block;
992
+ await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block));
993
+ while (true) {
994
+ const result = await chainArchivist.get([
995
+ bw._hash
996
+ ]);
997
+ if (result.length > 0) break;
998
+ await delay(1e3);
999
+ }
1129
1000
  }
1130
- networkStakeStepRewardsForRange(_range) {
1131
- throw new Error("Method not implemented.");
1001
+ }, "submitNewChain");
1002
+
1003
+ // src/implementation/head/head.ts
1004
+ var headSingleton;
1005
+ var initHead = /* @__PURE__ */ __name(async (params) => {
1006
+ const { account, chainArchivist, chainSubmissionsArchivistWrite, chainService } = params;
1007
+ if (headSingleton) return headSingleton;
1008
+ let head = await findMostRecentBlock2(chainArchivist);
1009
+ if (head) {
1010
+ const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist);
1011
+ if (isDefined10(forkFromBlock)) {
1012
+ const chain = await createForkedHead(forkFromBlock, account, chainService);
1013
+ await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite);
1014
+ const newBlock = assertEx14(chain.at(-1), () => new Error("Failed to get new head after forking"));
1015
+ head = newBlock[0];
1016
+ }
1017
+ } else {
1018
+ const chain = await createBootstrapHead(account, chainService);
1019
+ await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite);
1020
+ const newBlock = assertEx14(chain.at(-1), () => new Error("Failed to get new head after genesis"));
1021
+ head = newBlock[0];
1022
+ }
1023
+ headSingleton = head;
1024
+ return headSingleton;
1025
+ }, "initHead");
1026
+
1027
+ // src/implementation/mempoolRunner.ts
1028
+ import { isDefined as isDefined11 } from "@xylabs/sdk-js";
1029
+ import { HttpRpcTransport as HttpRpcTransport3, JsonRpcMempoolRunner, MempoolRunnerRpcSchemas } from "@xyo-network/xl1-rpc";
1030
+ var mempoolRunnerSingleton;
1031
+ var initMempoolRunner = /* @__PURE__ */ __name((params) => {
1032
+ const { config, logger } = params;
1033
+ if (mempoolRunnerSingleton) return mempoolRunnerSingleton;
1034
+ const endpoint = config.services?.apiEndpoint;
1035
+ if (isDefined11(endpoint)) {
1036
+ const transport = new HttpRpcTransport3(endpoint, {
1037
+ ...MempoolRunnerRpcSchemas
1038
+ });
1039
+ const runner = new JsonRpcMempoolRunner(transport);
1040
+ logger?.log("Using mempoolRunner RPC service at", endpoint);
1041
+ return runner;
1042
+ } else {
1043
+ throw new Error("No MempoolRunner endpoint configured");
1132
1044
  }
1133
- networkStakeStepRewardsForStepLevel(_stepLevel, _range) {
1134
- throw new Error("Method not implemented.");
1045
+ }, "initMempoolRunner");
1046
+
1047
+ // src/implementation/mempoolViewer.ts
1048
+ import { isDefined as isDefined12 } from "@xylabs/sdk-js";
1049
+ import { HttpRpcTransport as HttpRpcTransport4, JsonRpcMempoolViewer, MempoolViewerRpcSchemas } from "@xyo-network/xl1-rpc";
1050
+ var mempoolViewerSingleton;
1051
+ var initMempoolViewer = /* @__PURE__ */ __name((params) => {
1052
+ const { config, logger } = params;
1053
+ if (mempoolViewerSingleton) return mempoolViewerSingleton;
1054
+ const endpoint = config.services?.apiEndpoint;
1055
+ if (isDefined12(endpoint)) {
1056
+ const transport = new HttpRpcTransport4(endpoint, {
1057
+ ...MempoolViewerRpcSchemas
1058
+ });
1059
+ const viewer = new JsonRpcMempoolViewer(transport);
1060
+ logger?.log("Using MempoolViewer RPC service at", endpoint);
1061
+ return viewer;
1062
+ } else {
1063
+ throw new Error("No MempoolViewer endpoint configured");
1135
1064
  }
1136
- };
1137
- BaseNetworkStakeStepRewardService = _ts_decorate10([
1138
- creatable10()
1139
- ], BaseNetworkStakeStepRewardService);
1065
+ }, "initMempoolViewer");
1066
+
1067
+ // src/implementation/pendingTransactions.ts
1068
+ import { isDefined as isDefined14 } from "@xylabs/sdk-js";
1069
+ import { timeBudget } from "@xyo-network/xl1-protocol-sdk";
1070
+ import { HttpRpcTransport as HttpRpcTransport5, JsonRpcMempoolViewer as JsonRpcMempoolViewer2, MempoolViewerRpcSchemas as MempoolViewerRpcSchemas2 } from "@xyo-network/xl1-rpc";
1140
1071
 
1141
1072
  // src/PendingTransactions/BasePendingTransactions.ts
1142
1073
  import { ValueType } from "@opentelemetry/api";
1143
- import { assertEx as assertEx12, creatable as creatable11, exists as exists2, filterAs, filterAsync, forget, isDefined as isDefined4, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
1074
+ import { assertEx as assertEx15, creatable as creatable5, exists, filterAs, filterAsync, forget, isDefined as isDefined13, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
1144
1075
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
1145
1076
  import { asBlockBoundWitnessWithHashMeta, asXL1BlockNumber as asXL1BlockNumber2, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
1146
- import { findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/xl1-protocol-sdk";
1077
+ import { findMostRecentBlock as findMostRecentBlock3 } from "@xyo-network/xl1-protocol-sdk";
1147
1078
  import { TransactionJsonSchemaValidator, validateTransaction } from "@xyo-network/xl1-validation";
1148
1079
  import { Mutex as Mutex2 } from "async-mutex";
1149
1080
 
1150
1081
  // src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
1151
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1082
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1152
1083
  import { asSignedTransactionBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
1153
1084
  var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
1154
- const withHashMeta = await PayloadBuilder5.addHashMeta(payload.payloads);
1085
+ const withHashMeta = await PayloadBuilder6.addHashMeta(payload.payloads);
1155
1086
  const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find((p) => p._hash === payload.root));
1156
1087
  if (tx) {
1157
1088
  return [
@@ -1162,7 +1093,7 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
1162
1093
  }, "bundledPayloadToHydratedTransaction");
1163
1094
 
1164
1095
  // src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
1165
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1096
+ import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
1166
1097
  import { PayloadBundleSchema } from "@xyo-network/payload-model";
1167
1098
  import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
1168
1099
  var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
@@ -1170,8 +1101,8 @@ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) =>
1170
1101
  return bundle(root, transaction);
1171
1102
  }, "hydratedTransactionToPayloadBundle");
1172
1103
  var bundle = /* @__PURE__ */ __name((root, transaction) => {
1173
- const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder6.omitStorageMeta(p));
1174
- return new PayloadBuilder6({
1104
+ const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder7.omitStorageMeta(p));
1105
+ return new PayloadBuilder7({
1175
1106
  schema: PayloadBundleSchema
1176
1107
  }).fields({
1177
1108
  payloads,
@@ -1180,13 +1111,13 @@ var bundle = /* @__PURE__ */ __name((root, transaction) => {
1180
1111
  }, "bundle");
1181
1112
 
1182
1113
  // src/PendingTransactions/BasePendingTransactions.ts
1183
- function _ts_decorate11(decorators, target, key, desc) {
1114
+ function _ts_decorate5(decorators, target, key, desc) {
1184
1115
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1185
1116
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1186
1117
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1187
1118
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1188
1119
  }
1189
- __name(_ts_decorate11, "_ts_decorate");
1120
+ __name(_ts_decorate5, "_ts_decorate");
1190
1121
  var BasePendingTransactionsService = class _BasePendingTransactionsService extends BaseService {
1191
1122
  static {
1192
1123
  __name(this, "BasePendingTransactionsService");
@@ -1233,213 +1164,729 @@ var BasePendingTransactionsService = class _BasePendingTransactionsService exten
1233
1164
  get additionalPendingTransactionValidators() {
1234
1165
  return this.params.additionalPendingTransactionValidators ?? [];
1235
1166
  }
1236
- get chainArchivist() {
1237
- return assertEx12(this.params.chainArchivist, () => "No completed blocks with data archivist");
1167
+ get chainArchivist() {
1168
+ return assertEx15(this.params.chainArchivist, () => "No completed blocks with data archivist");
1169
+ }
1170
+ get chainId() {
1171
+ return assertEx15(this.params.chainId, () => "No chain id");
1172
+ }
1173
+ get pendingBundledTransactionsArchivist() {
1174
+ return assertEx15(this.params.pendingBundledTransactionsArchivist, () => "No pending bundled transactions archivist");
1175
+ }
1176
+ get pendingBundledTransactionsLocalArchivist() {
1177
+ return assertEx15(this._curatedPendingBundledTransactionsArchivist, () => "No pending bundled transactions curated archivist");
1178
+ }
1179
+ get pendingTransactionsCount() {
1180
+ forget(this.countPendingTransactions());
1181
+ return this._pendingTransactionsCount;
1182
+ }
1183
+ get rejectedTransactionsArchivist() {
1184
+ return assertEx15(this.params.rejectedTransactionsArchivist, () => "No rejected transactions archivist");
1185
+ }
1186
+ async createHandler() {
1187
+ await super.createHandler();
1188
+ this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({
1189
+ account: "random"
1190
+ });
1191
+ this.pendingBundledTransactionsArchivist.on("inserted", ({ payloads }) => {
1192
+ forget(this.insertNewTransactions(payloads));
1193
+ });
1194
+ this.chainArchivist.on("inserted", ({ payloads }) => {
1195
+ this.markAnyIncludedTransactionsForRemoval(payloads);
1196
+ forget(this.cleanupWorker());
1197
+ });
1198
+ this.rejectedTransactionsArchivist.on("inserted", ({ payloads }) => {
1199
+ this.markAnyIncludedTransactionsForRemoval(payloads);
1200
+ forget(this.cleanupWorker());
1201
+ });
1202
+ const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter("xyo_pending_transactions_counter", {
1203
+ description: "The current number of pending transactions",
1204
+ valueType: ValueType.INT,
1205
+ unit: "1"
1206
+ });
1207
+ pendingTransactionsCounter?.addCallback((observer) => {
1208
+ observer.observe(this.pendingTransactionsCount);
1209
+ });
1210
+ }
1211
+ pendingBlocks(_options) {
1212
+ throw new Error("Method [pendingBlocks] not implemented.");
1213
+ }
1214
+ async pendingTransactions({ limit = 100 } = {}) {
1215
+ return await this.spanAsync("getPendingTransactions", async () => {
1216
+ return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1217
+ let lastHead = filterAs(await this.chainArchivist.next({
1218
+ limit: 100
1219
+ }), (x) => asBlockBoundWitnessWithHashMeta(x)).at(-1);
1220
+ if (isUndefined2(lastHead)) return [];
1221
+ await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
1222
+ const foundPendingTransactions = [];
1223
+ let cursor;
1224
+ while (foundPendingTransactions.length < limit) {
1225
+ const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
1226
+ limit: 100,
1227
+ order: "asc",
1228
+ cursor
1229
+ });
1230
+ if (pendingBundledTransactions.length === 0) break;
1231
+ cursor = pendingBundledTransactions.at(-1)?._sequence;
1232
+ const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
1233
+ const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists);
1234
+ const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber2(lastHead.block + 1, true)));
1235
+ const txValidationResults = await Promise.all(activeTransactions.map(async (tx) => [
1236
+ tx,
1237
+ await validateTransaction(tx, {
1238
+ chainId: this.chainId
1239
+ }, this.additionalPendingTransactionValidators)
1240
+ ]));
1241
+ const validTransactions = txValidationResults.filter(([, errors]) => errors.length === 0).map(([tx]) => tx);
1242
+ const invalidTransactions = txValidationResults.filter(([, errors]) => errors.length > 0).map(([tx]) => tx);
1243
+ if (invalidTransactions.length > 0) {
1244
+ this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`);
1245
+ for (const tx of invalidTransactions) {
1246
+ this.logger?.warn(tx[0]._hash);
1247
+ }
1248
+ }
1249
+ foundPendingTransactions.push(...validTransactions);
1250
+ }
1251
+ if (foundPendingTransactions.length > 0) {
1252
+ this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`);
1253
+ for (const tx of foundPendingTransactions) {
1254
+ this.logger?.log(tx[0]._hash);
1255
+ }
1256
+ }
1257
+ return foundPendingTransactions;
1258
+ }, _BasePendingTransactionsService.MutexPriority.ReadTransactions);
1259
+ });
1260
+ }
1261
+ async cleanupWorker() {
1262
+ return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1263
+ const lastHead = await findMostRecentBlock3(this.chainArchivist);
1264
+ if (isDefined13(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
1265
+ }, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
1266
+ }
1267
+ async countPendingTransactions() {
1268
+ if (this._countPendingTransactionsMutex.isLocked()) return;
1269
+ await this._countPendingTransactionsMutex.runExclusive(async () => {
1270
+ const payloads = await this._curatedPendingBundledTransactionsArchivist?.all() ?? [];
1271
+ this._pendingTransactionsCount = payloads.length;
1272
+ });
1273
+ }
1274
+ async filterAlreadyFinalizedTransactions(incomingTransactions) {
1275
+ const incomingTransactionHashes = incomingTransactions.map((payload) => payload.root);
1276
+ const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes);
1277
+ const finalizedTransactionHashes = new Set(finalizedTransactions.map((item) => item._hash));
1278
+ const nonFinalizedTransactions = incomingTransactions.filter((item) => !finalizedTransactionHashes.has(item._hash));
1279
+ return nonFinalizedTransactions;
1280
+ }
1281
+ async insertNewTransactions(payloads) {
1282
+ if (payloads.length === 0) return;
1283
+ return await this.spanAsync("InsertNewTransactions", async () => {
1284
+ return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1285
+ const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads);
1286
+ const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {
1287
+ return await bundledPayloadToHydratedTransaction(tx);
1288
+ }))).filter(exists);
1289
+ const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {
1290
+ const errors = await validateTransaction(tx, {
1291
+ chainId: this.chainId
1292
+ }, [
1293
+ TransactionJsonSchemaValidator
1294
+ ]);
1295
+ if (errors.length > 0) {
1296
+ this.logger?.warn("validateTransaction", errors);
1297
+ }
1298
+ return errors.length > 0 ? false : true;
1299
+ });
1300
+ if (validTransactions.length > 0) {
1301
+ const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
1302
+ await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
1303
+ }
1304
+ }, _BasePendingTransactionsService.MutexPriority.InsertNewTransactions);
1305
+ });
1306
+ }
1307
+ /**
1308
+ * Marks any included transactions in the provided payloads for removal preventing them
1309
+ * from being included in the curated pending transactions archivist and from being offered
1310
+ * during the next retrieval of pending transactions.
1311
+ * @param payloads An array of payloads that may contain transactions.
1312
+ */
1313
+ markAnyIncludedTransactionsForRemoval(payloads) {
1314
+ const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map((p) => p._hash);
1315
+ for (const hash of hashes) {
1316
+ this._removablePendingTransactionHashes.add(hash);
1317
+ }
1318
+ }
1319
+ async pruneCuratedPendingTransactionsArchivist(head) {
1320
+ return await this.spanAsync("pruneCuratedPendingTransactionsArchivist", async () => {
1321
+ const foundPendingTransactionsToDeleteHashes = [];
1322
+ let cursor;
1323
+ let [lastHead] = filterAs(await this.chainArchivist.get([
1324
+ head
1325
+ ]), (x) => asBlockBoundWitnessWithHashMeta(x));
1326
+ while (isDefined13(lastHead)) {
1327
+ const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
1328
+ limit: 100,
1329
+ order: "asc",
1330
+ cursor
1331
+ });
1332
+ if (pendingBundledTransactions.length === 0) {
1333
+ break;
1334
+ }
1335
+ cursor = pendingBundledTransactions.at(-1)?._sequence;
1336
+ const deletedTransactionBundles = pendingBundledTransactions.filter((tx) => this._removablePendingTransactionHashes.has(tx.root));
1337
+ foundPendingTransactionsToDeleteHashes.push(...deletedTransactionBundles.map((tx) => tx._hash).filter(exists));
1338
+ const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
1339
+ const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists);
1340
+ const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber2(lastHead.block + 1, true)));
1341
+ const expiredBundleHashes = expiredTransactions.map((expiredHydratedTx) => (
1342
+ // Find the corresponding payload bundle hash for the expired transaction
1343
+ pendingBundledTransactions.find((bundledTx) => bundledTx.root === expiredHydratedTx[0]._hash)?._hash
1344
+ )).filter(exists);
1345
+ foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes);
1346
+ }
1347
+ const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes);
1348
+ for (const payload of deletedHashes) {
1349
+ this._removablePendingTransactionHashes.delete(payload._hash);
1350
+ }
1351
+ if (deletedHashes.length > 0) {
1352
+ this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`);
1353
+ for (const payload of deletedHashes) {
1354
+ this.logger?.log(payload._hash);
1355
+ }
1356
+ }
1357
+ });
1358
+ }
1359
+ };
1360
+ BasePendingTransactionsService = _ts_decorate5([
1361
+ creatable5()
1362
+ ], BasePendingTransactionsService);
1363
+ var isTransactionExpired = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.exp < block, "isTransactionExpired");
1364
+ var isTransactionActive = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.nbf <= block && txBw.exp >= block, "isTransactionActive");
1365
+
1366
+ // src/implementation/pendingTransactions.ts
1367
+ var serviceSingleton;
1368
+ var initPendingTransactions = /* @__PURE__ */ __name(async ({ config, params, logger }) => {
1369
+ if (serviceSingleton) return serviceSingleton;
1370
+ return await timeBudget("initPendingTransactions", logger, async () => {
1371
+ const endpoint = config.services?.apiEndpoint;
1372
+ if (isDefined14(endpoint)) {
1373
+ const transport = new HttpRpcTransport5(endpoint, {
1374
+ ...MempoolViewerRpcSchemas2
1375
+ });
1376
+ const viewer = new JsonRpcMempoolViewer2(transport);
1377
+ logger?.log("Using MempoolViewer RPC service at", endpoint);
1378
+ return viewer;
1379
+ } else {
1380
+ serviceSingleton = await BasePendingTransactionsService.create(params);
1381
+ }
1382
+ return serviceSingleton;
1383
+ }, 2e3, true);
1384
+ }, "initPendingTransactions");
1385
+
1386
+ // src/implementation/producer.ts
1387
+ import { timeBudget as timeBudget2 } from "@xyo-network/xl1-protocol-sdk";
1388
+
1389
+ // src/simple/block/runner/SimpleBlockRunner.ts
1390
+ import { AbstractCreatable as AbstractCreatable3, AddressZod, asHash as asHash2, assertEx as assertEx17, creatable as creatable6, exists as exists2, hexToBigInt, isDefined as isDefined15 } from "@xylabs/sdk-js";
1391
+ import { MemoryArchivist as MemoryArchivist2 } from "@xyo-network/archivist-memory";
1392
+ import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
1393
+ import { buildNextBlock as buildNextBlock5, createDeclarationIntent as createDeclarationIntent2 } from "@xyo-network/chain-protocol";
1394
+ import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/payload-builder";
1395
+ import { asBlockBoundWitness as asBlockBoundWitness2, AttoXL1 as AttoXL12, BlockNumberSchema, defaultRewardRatio, TimeSchema, XYO_STEP_REWARD_ADDRESS as XYO_STEP_REWARD_ADDRESS2 } from "@xyo-network/xl1-protocol";
1396
+ import z from "zod";
1397
+
1398
+ // src/simple/block/runner/generateTransactionFeeTransfers.ts
1399
+ import { hexFromBigInt as hexFromBigInt2 } from "@xylabs/sdk-js";
1400
+ import { assertEx as assertEx16 } from "@xylabs/sdk-js";
1401
+ import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
1402
+ import { TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-protocol";
1403
+ import { transactionRequiredGas } from "@xyo-network/xl1-protocol-sdk";
1404
+ import { HydratedTransactionWrapper } from "@xyo-network/xl1-wrappers";
1405
+ async function generateTransactionFeeTransfers(address, transactions) {
1406
+ const txs = await Promise.all(transactions.map(async (tx) => {
1407
+ return HydratedTransactionWrapper.parse([
1408
+ await PayloadBuilder8.addStorageMeta(tx[0]),
1409
+ await PayloadBuilder8.addStorageMeta(tx[1])
1410
+ ]);
1411
+ }));
1412
+ const txBaseFeeCosts = {};
1413
+ for (const tx of txs) {
1414
+ txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + tx.fees.base;
1415
+ }
1416
+ const txGasCosts = {};
1417
+ for (const tx of txs) {
1418
+ const requiredGas = transactionRequiredGas(tx.data);
1419
+ const totalGasCost = requiredGas * tx.fees.gasPrice;
1420
+ txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + totalGasCost;
1421
+ }
1422
+ const payloads = Object.entries(txBaseFeeCosts).map(([from, amount]) => {
1423
+ const payload = {
1424
+ schema: TransferSchema,
1425
+ epoch: Date.now(),
1426
+ from,
1427
+ transfers: {
1428
+ // burn the base fee
1429
+ [XYO_ZERO_ADDRESS]: hexFromBigInt2(amount)
1430
+ }
1431
+ };
1432
+ return payload;
1433
+ });
1434
+ for (const [from, amount] of Object.entries(txGasCosts)) {
1435
+ const fromPayload = assertEx16(payloads.find((p) => p.from === from), () => "from payload not found");
1436
+ fromPayload.transfers[address] = hexFromBigInt2(amount);
1437
+ }
1438
+ return payloads;
1439
+ }
1440
+ __name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
1441
+
1442
+ // src/simple/block/runner/SimpleBlockRunner.ts
1443
+ function _ts_decorate6(decorators, target, key, desc) {
1444
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1445
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1446
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1447
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1448
+ }
1449
+ __name(_ts_decorate6, "_ts_decorate");
1450
+ var DEFAULT_BLOCK_SIZE = 10;
1451
+ var XYO_PRODUCER_REDECLARATION_DURATION = 1e4;
1452
+ var XYO_PRODUCER_REDECLARATION_WINDOW = 500;
1453
+ var SimpleBlockRunnerParamsZod = z.object({
1454
+ balanceViewer: z.object().loose(),
1455
+ blockRewardViewer: z.object().loose(),
1456
+ chainId: z.string(),
1457
+ config: z.object().loose(),
1458
+ mempoolViewer: z.object().loose(),
1459
+ mempoolRunner: z.object().loose(),
1460
+ rejectedTransactionsArchivist: z.object().loose().optional(),
1461
+ rewardAddress: AddressZod,
1462
+ time: z.object().loose(),
1463
+ validateHydratedBlockState: z.function().optional()
1464
+ });
1465
+ var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatable3 {
1466
+ static {
1467
+ __name(this, "SimpleBlockRunner");
1468
+ }
1469
+ _blockRewardDiviner;
1470
+ _lastRedeclarationBlock;
1471
+ _rejectedTransactionsArchivist;
1472
+ /**
1473
+ * The default block size for a block
1474
+ */
1475
+ static get DefaultBlockSize() {
1476
+ return DEFAULT_BLOCK_SIZE;
1477
+ }
1478
+ /**
1479
+ * The amount of time for which the producer will redeclare
1480
+ * their intent to continue producing blocks
1481
+ */
1482
+ static get RedeclarationDuration() {
1483
+ return XYO_PRODUCER_REDECLARATION_DURATION;
1484
+ }
1485
+ /**
1486
+ * The number of blocks within which the producer will redeclare
1487
+ * their intent to continue producing blocks
1488
+ */
1489
+ static get RedeclarationWindow() {
1490
+ return XYO_PRODUCER_REDECLARATION_WINDOW;
1491
+ }
1492
+ get address() {
1493
+ return this.account.address;
1494
+ }
1495
+ get account() {
1496
+ return assertEx17(this.params.account, () => "account is required");
1497
+ }
1498
+ get balanceViewer() {
1499
+ return assertEx17(this.params.balanceViewer, () => "balanceViewer is required");
1500
+ }
1501
+ get blockRewardViewer() {
1502
+ return assertEx17(this.params.blockRewardViewer, () => "blockRewardViewer is required");
1503
+ }
1504
+ get chainId() {
1505
+ return assertEx17(this.params.chainId, () => "chainId is required");
1506
+ }
1507
+ // protected get electionService() {
1508
+ // return assertEx(this.params.electionService, () => 'electionService is required')
1509
+ // }
1510
+ get mempoolRunner() {
1511
+ return assertEx17(this.params.mempoolRunner, () => "mempoolRunner is required");
1512
+ }
1513
+ get mempoolViewer() {
1514
+ return assertEx17(this.params.mempoolViewer, () => "mempoolViewer is required");
1515
+ }
1516
+ // protected get pendingTransactionsService() {
1517
+ // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')
1518
+ // }
1519
+ get rejectedTransactionsArchivist() {
1520
+ return this._rejectedTransactionsArchivist;
1521
+ }
1522
+ get rewardAddress() {
1523
+ return assertEx17(this.params.rewardAddress, () => "No reward address provided");
1524
+ }
1525
+ // protected get stakeIntentService(): StakeIntentService {
1526
+ // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')
1527
+ // }
1528
+ get time() {
1529
+ return assertEx17(this.params.time, () => "No TimeSyncViewer provided");
1530
+ }
1531
+ // protected get validateHydratedBlockState() {
1532
+ // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')
1533
+ // }
1534
+ static async paramsHandler(params) {
1535
+ SimpleBlockRunnerParamsZod.parse(params);
1536
+ const rejectedTransactionsArchivist = params?.rejectedTransactionsArchivist ?? await MemoryArchivist2.create();
1537
+ return {
1538
+ ...await super.paramsHandler(params),
1539
+ ...params,
1540
+ rejectedTransactionsArchivist
1541
+ };
1542
+ }
1543
+ async next(head) {
1544
+ if (head.chain !== this.chainId) return;
1545
+ return await this.proposeNextValidBlock(head);
1546
+ }
1547
+ async produceNextBlock(head, force) {
1548
+ assertEx17(head.chain === this.chainId, () => "Block chain ID does not match");
1549
+ const result = await this.proposeNextValidBlock(head);
1550
+ return force ? assertEx17(result, () => "Failed to produce next block") : result;
1551
+ }
1552
+ async getBlockRewardTransfers(block) {
1553
+ if (!this._blockRewardDiviner) {
1554
+ this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({
1555
+ account: "random",
1556
+ blockRewardViewer: this.blockRewardViewer,
1557
+ config: {
1558
+ rewardAddress: this.rewardAddress,
1559
+ rewardPercentageRatio: defaultRewardRatio,
1560
+ schema: FixedPercentageBlockRewardDivinerConfigSchema
1561
+ }
1562
+ });
1563
+ }
1564
+ const blockId = new PayloadBuilder9({
1565
+ schema: BlockNumberSchema
1566
+ }).fields({
1567
+ block
1568
+ }).build();
1569
+ const rewards = await this._blockRewardDiviner.divine([
1570
+ blockId
1571
+ ]);
1572
+ return rewards;
1573
+ }
1574
+ /**
1575
+ * Handles the producer redeclaration logic
1576
+ * @param head The current head block
1577
+ * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
1578
+ */
1579
+ getProducerRedeclaration(head) {
1580
+ if (this.params.config.producer.disableIntentRedeclaration) return;
1581
+ const currentBlock = head.block;
1582
+ return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock + _SimpleBlockRunner.RedeclarationDuration);
1583
+ }
1584
+ async proposeNextValidBlock(head, validateBalances = false, force = false) {
1585
+ return await this.spanAsync("proposeNextValidBlock", async () => {
1586
+ const { block: previousBlock } = assertEx17(asBlockBoundWitness2(head), () => "Invalid head block");
1587
+ const nextBlock = previousBlock + 1;
1588
+ const nextBlockTransactionsStart = Date.now();
1589
+ const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({
1590
+ limit: _SimpleBlockRunner.DefaultBlockSize
1591
+ });
1592
+ const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
1593
+ if (nextBlockTransactionsDuration > 200) {
1594
+ this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
1595
+ }
1596
+ const blockPayloads = [];
1597
+ const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
1598
+ if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
1599
+ if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return;
1600
+ const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
1601
+ blockPayloads.push(...rewardTransferPayloads);
1602
+ const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
1603
+ const timeStart = Date.now();
1604
+ const timePayload = await this.generateTimePayload(head);
1605
+ const timeDuration = Date.now() - timeStart;
1606
+ if (timeDuration > 100) {
1607
+ this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
1608
+ }
1609
+ const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
1610
+ blockPayloads.push(...fundedTransfers, timePayload);
1611
+ this.logger?.info(`Building block ${head.block + 1}`);
1612
+ const startBuild = Date.now();
1613
+ const stepRewardPoolBalance = (await this.balanceViewer.accountBalances([
1614
+ XYO_STEP_REWARD_ADDRESS2
1615
+ ]))[XYO_STEP_REWARD_ADDRESS2];
1616
+ const block = await buildNextBlock5(head, fundedNextBlockTransactions, blockPayloads, [
1617
+ this.account
1618
+ ], XYO_STEP_REWARD_ADDRESS2, stepRewardPoolBalance);
1619
+ this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
1620
+ await this.mempoolRunner.submitBlocks([
1621
+ block
1622
+ ]);
1623
+ return block;
1624
+ });
1625
+ }
1626
+ // remove unfunded transactions and block transfers
1627
+ async filterByFunded(head, txs, transfers, validateBalances = false) {
1628
+ const fundedTransfers = [];
1629
+ const fundedTransactions = (await Promise.all(txs.map(async (tx) => {
1630
+ const transfer = transfers.find((transfer2) => transfer2.from === tx[0].from);
1631
+ if (!transfer) return;
1632
+ const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
1633
+ if (validateBalances) {
1634
+ const balance = (await this.balanceViewer.accountBalances([
1635
+ transfer.from
1636
+ ]))[transfer.from] ?? AttoXL12(0n);
1637
+ if (balance >= totalTransferCost) {
1638
+ fundedTransfers.push(transfer);
1639
+ return tx;
1640
+ }
1641
+ } else {
1642
+ fundedTransfers.push(transfer);
1643
+ return tx;
1644
+ }
1645
+ }))).filter(exists2);
1646
+ return [
1647
+ fundedTransactions,
1648
+ fundedTransfers
1649
+ ];
1650
+ }
1651
+ async generateTimePayload(head) {
1652
+ const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash("ethereum");
1653
+ const ethereumHash = asHash2(ethHashOrNull, () => "No ethereum hash available from time sync service");
1654
+ const timePayload = {
1655
+ schema: TimeSchema,
1656
+ // this is for the previous block
1657
+ xl1: head.block,
1658
+ // this is for the previous block
1659
+ xl1Hash: head._hash,
1660
+ ethereum,
1661
+ ethereumHash,
1662
+ epoch: Date.now()
1663
+ };
1664
+ return timePayload;
1665
+ }
1666
+ /**
1667
+ * Check if a heartbeat block is required based on network activity.
1668
+ * @param head The current head block
1669
+ * @returns True if a heartbeat is required, false otherwise
1670
+ */
1671
+ heartbeatRequired(head) {
1672
+ const epoch = head.$epoch;
1673
+ if (isDefined15(epoch)) {
1674
+ const { heartbeatInterval } = this.params.config.producer;
1675
+ if (Date.now() - epoch > heartbeatInterval) {
1676
+ return true;
1677
+ }
1678
+ }
1679
+ return false;
1680
+ }
1681
+ };
1682
+ SimpleBlockRunner = _ts_decorate6([
1683
+ creatable6()
1684
+ ], SimpleBlockRunner);
1685
+
1686
+ // src/implementation/producer.ts
1687
+ var serviceSingleton2;
1688
+ var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
1689
+ if (serviceSingleton2) return serviceSingleton2;
1690
+ return await timeBudget2("initBlockProducer", params.logger, async () => {
1691
+ serviceSingleton2 = await SimpleBlockRunner.create(params);
1692
+ return serviceSingleton2;
1693
+ }, 2e3, true);
1694
+ }, "initBlockProducer");
1695
+
1696
+ // src/implementation/reward.ts
1697
+ import { assertEx as assertEx18 } from "@xylabs/sdk-js";
1698
+ import { SimpleBlockRewardViewer, timeBudget as timeBudget3 } from "@xyo-network/xl1-protocol-sdk";
1699
+ var rewardServiceSingleton;
1700
+ var initBlockRewardViewer = /* @__PURE__ */ __name((params) => {
1701
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1702
+ return timeBudget3("initBlockRewardViewer", params.logger, () => {
1703
+ const { config } = params;
1704
+ rewardServiceSingleton = canUseEvmBlockRewardViewer({
1705
+ config
1706
+ }) ? initEvmBlockRewardViewer(params) : initXyoBlockRewardViewer(params);
1707
+ return rewardServiceSingleton;
1708
+ }, 2e3, true);
1709
+ }, "initBlockRewardViewer");
1710
+ var initXyoBlockRewardViewer = /* @__PURE__ */ __name((params) => {
1711
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1712
+ return timeBudget3("initXyoBlockRewardViewer", params.logger, () => {
1713
+ rewardServiceSingleton = SimpleBlockRewardViewer.create(params);
1714
+ return rewardServiceSingleton;
1715
+ }, 2e3, true);
1716
+ }, "initXyoBlockRewardViewer");
1717
+ var canUseEvmBlockRewardViewer = /* @__PURE__ */ __name((params) => canUseEvmProvider({
1718
+ config: params.config
1719
+ }), "canUseEvmBlockRewardViewer");
1720
+ var initEvmBlockRewardViewer = /* @__PURE__ */ __name(async (params) => {
1721
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1722
+ return await timeBudget3("initEvmBlockRewardViewer", params.logger, async () => {
1723
+ const provider2 = assertEx18(await initEvmProvider(params));
1724
+ const evmBlockRewardViewerParams = {
1725
+ ...params,
1726
+ provider: provider2
1727
+ };
1728
+ rewardServiceSingleton = EvmBlockRewardViewer.create(evmBlockRewardViewerParams);
1729
+ return rewardServiceSingleton;
1730
+ }, 2e3, true);
1731
+ }, "initEvmBlockRewardViewer");
1732
+
1733
+ // src/implementation/time.ts
1734
+ import { timeBudget as timeBudget4 } from "@xyo-network/xl1-protocol-sdk";
1735
+
1736
+ // src/Time/BaseTimeSyncService.ts
1737
+ import { creatable as creatable7 } from "@xylabs/sdk-js";
1738
+ import { SimpleTimeSyncViewer } from "@xyo-network/xl1-protocol-sdk";
1739
+ function _ts_decorate7(decorators, target, key, desc) {
1740
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1741
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1742
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1743
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1744
+ }
1745
+ __name(_ts_decorate7, "_ts_decorate");
1746
+ var BaseTimeSyncService = class extends BaseService {
1747
+ static {
1748
+ __name(this, "BaseTimeSyncService");
1749
+ }
1750
+ timeSyncViewer;
1751
+ get blockViewer() {
1752
+ return this.params.blockViewer;
1753
+ }
1754
+ get ethProvider() {
1755
+ return this.params.ethProvider;
1756
+ }
1757
+ async convertTime(fromDomain, toDomain, from) {
1758
+ return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from);
1759
+ }
1760
+ async createHandler() {
1761
+ await super.createHandler();
1762
+ this.timeSyncViewer = new SimpleTimeSyncViewer(this.blockViewer, this.ethProvider);
1763
+ }
1764
+ async currentTime(domain) {
1765
+ return await this.timeSyncViewer.currentTime(domain);
1766
+ }
1767
+ async currentTimeAndHash(domain) {
1768
+ return await this.timeSyncViewer.currentTimeAndHash(domain);
1769
+ }
1770
+ async currentTimePayload() {
1771
+ return await this.timeSyncViewer.currentTimePayload();
1772
+ }
1773
+ };
1774
+ BaseTimeSyncService = _ts_decorate7([
1775
+ creatable7()
1776
+ ], BaseTimeSyncService);
1777
+
1778
+ // src/implementation/time.ts
1779
+ var timeSyncServiceSingleton;
1780
+ var initTimeService = /* @__PURE__ */ __name(async ({ blockViewer, config, logger, meterProvider, traceProvider }) => {
1781
+ if (timeSyncServiceSingleton) return timeSyncServiceSingleton;
1782
+ return await timeBudget4("initTimeService", logger, async () => {
1783
+ const ethProvider = canUseEvmProvider({
1784
+ config
1785
+ }) ? await initEvmProvider({
1786
+ config
1787
+ }) : void 0;
1788
+ timeSyncServiceSingleton = BaseTimeSyncService.create({
1789
+ blockViewer,
1790
+ ethProvider,
1791
+ logger,
1792
+ meterProvider,
1793
+ traceProvider
1794
+ });
1795
+ return await timeSyncServiceSingleton;
1796
+ }, 2e3, true);
1797
+ }, "initTimeService");
1798
+
1799
+ // src/implementation/validator.ts
1800
+ var serviceSingleton3;
1801
+ var initValidator = /* @__PURE__ */ __name((params) => {
1802
+ if (serviceSingleton3) return serviceSingleton3;
1803
+ serviceSingleton3 = initBlockProducer(params);
1804
+ return serviceSingleton3;
1805
+ }, "initValidator");
1806
+
1807
+ // src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
1808
+ import { creatable as creatable8 } from "@xylabs/sdk-js";
1809
+ function _ts_decorate8(decorators, target, key, desc) {
1810
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1811
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1812
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1813
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1814
+ }
1815
+ __name(_ts_decorate8, "_ts_decorate");
1816
+ var BaseNetworkStakeStepRewardService = class extends BaseService {
1817
+ static {
1818
+ __name(this, "BaseNetworkStakeStepRewardService");
1819
+ }
1820
+ networkStakeStepRewardAddressHistory(_address) {
1821
+ throw new Error("Method [networkStakeStepRewardAddressHistory] not implemented.");
1238
1822
  }
1239
- get chainId() {
1240
- return assertEx12(this.params.chainId, () => "No chain id");
1823
+ networkStakeStepRewardAddressReward(_context, _address) {
1824
+ throw new Error("Method [networkStakeStepRewardAddressReward] not implemented.");
1241
1825
  }
1242
- get pendingBundledTransactionsArchivist() {
1243
- return assertEx12(this.params.pendingBundledTransactionsArchivist, () => "No pending bundled transactions archivist");
1826
+ networkStakeStepRewardAddressShare(_context, _address) {
1827
+ throw new Error("Method [networkStakeStepRewardAddressShare] not implemented.");
1244
1828
  }
1245
- get pendingBundledTransactionsLocalArchivist() {
1246
- return assertEx12(this._curatedPendingBundledTransactionsArchivist, () => "No pending bundled transactions curated archivist");
1829
+ networkStakeStepRewardClaimedByAddress(_address) {
1830
+ throw new Error("Method [networkStakeStepRewardClaimedByAddress] not implemented.");
1247
1831
  }
1248
- get pendingTransactionsCount() {
1249
- forget(this.countPendingTransactions());
1250
- return this._pendingTransactionsCount;
1832
+ networkStakeStepRewardForPosition(_position, _range) {
1833
+ throw new Error("Method [networkStakeStepRewardForPosition] not implemented.");
1251
1834
  }
1252
- get rejectedTransactionsArchivist() {
1253
- return assertEx12(this.params.rejectedTransactionsArchivist, () => "No rejected transactions archivist");
1835
+ networkStakeStepRewardForStep(_context) {
1836
+ throw new Error("Method [networkStakeStepRewardForStep] not implemented.");
1254
1837
  }
1255
- async createHandler() {
1256
- await super.createHandler();
1257
- this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({
1258
- account: "random"
1259
- });
1260
- this.pendingBundledTransactionsArchivist.on("inserted", ({ payloads }) => {
1261
- forget(this.insertNewTransactions(payloads));
1262
- });
1263
- this.chainArchivist.on("inserted", ({ payloads }) => {
1264
- this.markAnyIncludedTransactionsForRemoval(payloads);
1265
- forget(this.cleanupWorker());
1266
- });
1267
- this.rejectedTransactionsArchivist.on("inserted", ({ payloads }) => {
1268
- this.markAnyIncludedTransactionsForRemoval(payloads);
1269
- forget(this.cleanupWorker());
1270
- });
1271
- const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter("xyo_pending_transactions_counter", {
1272
- description: "The current number of pending transactions",
1273
- valueType: ValueType.INT,
1274
- unit: "1"
1275
- });
1276
- pendingTransactionsCounter?.addCallback((observer) => {
1277
- observer.observe(this.pendingTransactionsCount);
1278
- });
1838
+ networkStakeStepRewardForStepForPosition(_context, _position) {
1839
+ throw new Error("Method [networkStakeStepRewardForStepForPosition] not implemented.");
1279
1840
  }
1280
- async pendingTransactions({ limit = 100 } = {}) {
1281
- return await this.spanAsync("getPendingTransactions", async () => {
1282
- return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1283
- let lastHead = filterAs(await this.chainArchivist.next({
1284
- limit: 100
1285
- }), (x) => asBlockBoundWitnessWithHashMeta(x)).at(-1);
1286
- if (isUndefined2(lastHead)) return [];
1287
- await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
1288
- const foundPendingTransactions = [];
1289
- let cursor;
1290
- while (foundPendingTransactions.length < limit) {
1291
- const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
1292
- limit: 100,
1293
- order: "asc",
1294
- cursor
1295
- });
1296
- if (pendingBundledTransactions.length === 0) break;
1297
- cursor = pendingBundledTransactions.at(-1)?._sequence;
1298
- const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
1299
- const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
1300
- const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber2(lastHead.block + 1, true)));
1301
- const txValidationResults = await Promise.all(activeTransactions.map(async (tx) => [
1302
- tx,
1303
- await validateTransaction(tx, {
1304
- chainId: this.chainId
1305
- }, this.additionalPendingTransactionValidators)
1306
- ]));
1307
- const validTransactions = txValidationResults.filter(([, errors]) => errors.length === 0).map(([tx]) => tx);
1308
- const invalidTransactions = txValidationResults.filter(([, errors]) => errors.length > 0).map(([tx]) => tx);
1309
- if (invalidTransactions.length > 0) {
1310
- this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`);
1311
- for (const tx of invalidTransactions) {
1312
- this.logger?.warn(tx[0]._hash);
1313
- }
1314
- }
1315
- foundPendingTransactions.push(...validTransactions);
1316
- }
1317
- if (foundPendingTransactions.length > 0) {
1318
- this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`);
1319
- for (const tx of foundPendingTransactions) {
1320
- this.logger?.log(tx[0]._hash);
1321
- }
1322
- }
1323
- return foundPendingTransactions;
1324
- }, _BasePendingTransactionsService.MutexPriority.ReadTransactions);
1325
- });
1841
+ networkStakeStepRewardPoolRewards(_context) {
1842
+ throw new Error("Method [networkStakeStepRewardPoolRewards] not implemented.");
1326
1843
  }
1327
- async cleanupWorker() {
1328
- return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1329
- const lastHead = await findMostRecentBlock2(this.chainArchivist);
1330
- if (isDefined4(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
1331
- }, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
1844
+ networkStakeStepRewardPoolShares(_context) {
1845
+ throw new Error("Method [networkStakeStepRewardPoolShares] not implemented.");
1332
1846
  }
1333
- async countPendingTransactions() {
1334
- if (this._countPendingTransactionsMutex.isLocked()) return;
1335
- await this._countPendingTransactionsMutex.runExclusive(async () => {
1336
- const payloads = await this._curatedPendingBundledTransactionsArchivist?.all() ?? [];
1337
- this._pendingTransactionsCount = payloads.length;
1338
- });
1847
+ networkStakeStepRewardPositionWeight(_context, _position) {
1848
+ throw new Error("Method [networkStakeStepRewardPositionWeight] not implemented.");
1339
1849
  }
1340
- async filterAlreadyFinalizedTransactions(incomingTransactions) {
1341
- const incomingTransactionHashes = incomingTransactions.map((payload) => payload.root);
1342
- const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes);
1343
- const finalizedTransactionHashes = new Set(finalizedTransactions.map((item) => item._hash));
1344
- const nonFinalizedTransactions = incomingTransactions.filter((item) => !finalizedTransactionHashes.has(item._hash));
1345
- return nonFinalizedTransactions;
1850
+ networkStakeStepRewardPotentialPositionLoss(_context, _position) {
1851
+ throw new Error("Method [networkStakeStepRewardPotentialPositionLoss] not implemented.");
1346
1852
  }
1347
- async insertNewTransactions(payloads) {
1348
- if (payloads.length === 0) return;
1349
- return await this.spanAsync("InsertNewTransactions", async () => {
1350
- return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
1351
- const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads);
1352
- const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {
1353
- return await bundledPayloadToHydratedTransaction(tx);
1354
- }))).filter(exists2);
1355
- const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {
1356
- const errors = await validateTransaction(tx, {
1357
- chainId: this.chainId
1358
- }, [
1359
- TransactionJsonSchemaValidator
1360
- ]);
1361
- if (errors.length > 0) {
1362
- this.logger?.warn("validateTransaction", errors);
1363
- }
1364
- return errors.length > 0 ? false : true;
1365
- });
1366
- if (validTransactions.length > 0) {
1367
- const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
1368
- await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
1369
- }
1370
- }, _BasePendingTransactionsService.MutexPriority.InsertNewTransactions);
1371
- });
1853
+ networkStakeStepRewardRandomizer(_context) {
1854
+ throw new Error("Method [networkStakeStepRewardRandomizer] not implemented.");
1372
1855
  }
1373
- /**
1374
- * Marks any included transactions in the provided payloads for removal preventing them
1375
- * from being included in the curated pending transactions archivist and from being offered
1376
- * during the next retrieval of pending transactions.
1377
- * @param payloads An array of payloads that may contain transactions.
1378
- */
1379
- markAnyIncludedTransactionsForRemoval(payloads) {
1380
- const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map((p) => p._hash);
1381
- for (const hash of hashes) {
1382
- this._removablePendingTransactionHashes.add(hash);
1383
- }
1856
+ networkStakeStepRewardStakerCount(_context) {
1857
+ throw new Error("Method [networkStakeStepRewardStakerCount] not implemented.");
1384
1858
  }
1385
- async pruneCuratedPendingTransactionsArchivist(head) {
1386
- return await this.spanAsync("pruneCuratedPendingTransactionsArchivist", async () => {
1387
- const foundPendingTransactionsToDeleteHashes = [];
1388
- let cursor;
1389
- let [lastHead] = filterAs(await this.chainArchivist.get([
1390
- head
1391
- ]), (x) => asBlockBoundWitnessWithHashMeta(x));
1392
- while (isDefined4(lastHead)) {
1393
- const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
1394
- limit: 100,
1395
- order: "asc",
1396
- cursor
1397
- });
1398
- if (pendingBundledTransactions.length === 0) {
1399
- break;
1400
- }
1401
- cursor = pendingBundledTransactions.at(-1)?._sequence;
1402
- const deletedTransactionBundles = pendingBundledTransactions.filter((tx) => this._removablePendingTransactionHashes.has(tx.root));
1403
- foundPendingTransactionsToDeleteHashes.push(...deletedTransactionBundles.map((tx) => tx._hash).filter(exists2));
1404
- const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
1405
- const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
1406
- const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber2(lastHead.block + 1, true)));
1407
- const expiredBundleHashes = expiredTransactions.map((expiredHydratedTx) => (
1408
- // Find the corresponding payload bundle hash for the expired transaction
1409
- pendingBundledTransactions.find((bundledTx) => bundledTx.root === expiredHydratedTx[0]._hash)?._hash
1410
- )).filter(exists2);
1411
- foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes);
1412
- }
1413
- const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes);
1414
- for (const payload of deletedHashes) {
1415
- this._removablePendingTransactionHashes.delete(payload._hash);
1416
- }
1417
- if (deletedHashes.length > 0) {
1418
- this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`);
1419
- for (const payload of deletedHashes) {
1420
- this.logger?.log(payload._hash);
1421
- }
1422
- }
1423
- });
1859
+ networkStakeStepRewardUnclaimedByAddress(_address) {
1860
+ throw new Error("Method [networkStakeStepRewardUnclaimedByAddress] not implemented.");
1861
+ }
1862
+ networkStakeStepRewardWeightForAddress(_context, _address) {
1863
+ throw new Error("Method [networkStakeStepRewardWeightForAddress] not implemented.");
1864
+ }
1865
+ networkStakeStepRewardsForPosition(_position, _range) {
1866
+ throw new Error("Method [networkStakeStepRewardsForPosition] not implemented.");
1867
+ }
1868
+ networkStakeStepRewardsForRange(_range) {
1869
+ throw new Error("Method [networkStakeStepRewardsForRange] not implemented.");
1870
+ }
1871
+ networkStakeStepRewardsForStepLevel(_stepLevel, _range) {
1872
+ throw new Error("Method [networkStakeStepRewardsForStepLevel] not implemented.");
1424
1873
  }
1425
1874
  };
1426
- BasePendingTransactionsService = _ts_decorate11([
1427
- creatable11()
1428
- ], BasePendingTransactionsService);
1429
- var isTransactionExpired = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.exp < block, "isTransactionExpired");
1430
- var isTransactionActive = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.nbf <= block && txBw.exp >= block, "isTransactionActive");
1875
+ BaseNetworkStakeStepRewardService = _ts_decorate8([
1876
+ creatable8()
1877
+ ], BaseNetworkStakeStepRewardService);
1431
1878
 
1432
1879
  // src/Schemas/BaseSchemasService.ts
1433
- import { creatable as creatable12 } from "@xylabs/sdk-js";
1434
- import { spanRootAsync as spanRootAsync4 } from "@xylabs/telemetry";
1880
+ import { creatable as creatable9 } from "@xylabs/sdk-js";
1881
+ import { spanRootAsync } from "@xylabs/telemetry";
1435
1882
  import { schemasSummary } from "@xyo-network/xl1-protocol-sdk";
1436
- function _ts_decorate12(decorators, target, key, desc) {
1883
+ function _ts_decorate9(decorators, target, key, desc) {
1437
1884
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1438
1885
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1439
1886
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1440
1887
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1441
1888
  }
1442
- __name(_ts_decorate12, "_ts_decorate");
1889
+ __name(_ts_decorate9, "_ts_decorate");
1443
1890
  var BaseSchemasService = class extends BaseService {
1444
1891
  static {
1445
1892
  __name(this, "BaseSchemasService");
@@ -1450,8 +1897,8 @@ var BaseSchemasService = class extends BaseService {
1450
1897
  ]))[schema] ?? 0;
1451
1898
  }
1452
1899
  async schemas(head, schemas) {
1453
- return await spanRootAsync4("transfers", async () => {
1454
- const summary = await schemasSummary(this.params.context);
1900
+ return await spanRootAsync("transfers", async () => {
1901
+ const [summary] = await schemasSummary(this.params.context);
1455
1902
  const result = {};
1456
1903
  for (const schema of schemas) {
1457
1904
  const count = summary[schema] ?? 0;
@@ -1461,8 +1908,8 @@ var BaseSchemasService = class extends BaseService {
1461
1908
  });
1462
1909
  }
1463
1910
  };
1464
- BaseSchemasService = _ts_decorate12([
1465
- creatable12()
1911
+ BaseSchemasService = _ts_decorate9([
1912
+ creatable9()
1466
1913
  ], BaseSchemasService);
1467
1914
 
1468
1915
  // src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts
@@ -1492,21 +1939,21 @@ var mapBoundWitnessToStakeIntentHashes = /* @__PURE__ */ __name((bw) => {
1492
1939
  }, "mapBoundWitnessToStakeIntentHashes");
1493
1940
 
1494
1941
  // src/StakeIntent/XyoStakeIntentService.ts
1495
- import { asAddress, assertEx as assertEx13, creatable as creatable13, filterAs as filterAs3, isUndefined as isUndefined3 } from "@xylabs/sdk-js";
1942
+ import { asAddress as asAddress2, assertEx as assertEx19, creatable as creatable10, filterAs as filterAs3, isUndefined as isUndefined3 } from "@xylabs/sdk-js";
1496
1943
  import { analyzeChain, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
1497
1944
  import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
1498
- import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
1945
+ import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/payload-builder";
1499
1946
  import { asBlockBoundWitness as asBlockBoundWitness3, asBlockBoundWitnessWithStorageMeta as asBlockBoundWitnessWithStorageMeta2, asChainStakeIntent as asChainStakeIntent2 } from "@xyo-network/xl1-protocol";
1500
- import { asChainIndexingServiceStateWithStorageMeta, ChainIndexingServiceStateSchema, isChainIndexingServiceState, readPayloadMapFromStore as readPayloadMapFromStore2, timeBudget } from "@xyo-network/xl1-protocol-sdk";
1947
+ import { asChainIndexingServiceStateWithStorageMeta, ChainIndexingServiceStateSchema, isChainIndexingServiceState, readPayloadMapFromStore as readPayloadMapFromStore2, timeBudget as timeBudget5 } from "@xyo-network/xl1-protocol-sdk";
1501
1948
  import { Mutex as Mutex3 } from "async-mutex";
1502
1949
  import { LRUCache as LRUCache2 } from "lru-cache";
1503
- function _ts_decorate13(decorators, target, key, desc) {
1950
+ function _ts_decorate10(decorators, target, key, desc) {
1504
1951
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1505
1952
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1506
1953
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1507
1954
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1508
1955
  }
1509
- __name(_ts_decorate13, "_ts_decorate");
1956
+ __name(_ts_decorate10, "_ts_decorate");
1510
1957
  var ACTIVE_STAKE_TTL = 1e3 * 60 * 60 * 2;
1511
1958
  var NO_ACTIVE_STAKE_TTL = 1e3 * 2;
1512
1959
  var STAKE_CACHE_MAX_ENTRIES = 1e4;
@@ -1529,16 +1976,25 @@ var XyoStakeIntentService = class extends BaseService {
1529
1976
  });
1530
1977
  _updateMutex = new Mutex3();
1531
1978
  get blockViewer() {
1532
- return assertEx13(this.params.blockViewer, () => "blockViewer not set");
1979
+ return this.params.blockViewer;
1533
1980
  }
1534
1981
  get chainArchivist() {
1535
- return assertEx13(this.params.chainArchivist, () => "chainArchivist not set");
1982
+ return assertEx19(this.params.chainArchivist, () => "chainArchivist not set");
1536
1983
  }
1537
1984
  get chainStakeViewer() {
1538
- return assertEx13(this.params.chainStakeViewer, () => "chainStakeViewer not set");
1985
+ return assertEx19(this.params.chainStakeViewer, () => "chainStakeViewer not set");
1539
1986
  }
1540
1987
  get stakeIntentStateArchivist() {
1541
- return assertEx13(this.params.stakeIntentStateArchivist, () => "stakeIntentStateArchivist not set");
1988
+ return assertEx19(this.params.stakeIntentStateArchivist, () => "stakeIntentStateArchivist not set");
1989
+ }
1990
+ static async paramsHandler(params) {
1991
+ return {
1992
+ ...await super.paramsHandler(params),
1993
+ blockViewer: assertEx19(params?.blockViewer, () => "blockViewer is required"),
1994
+ chainArchivist: assertEx19(params?.chainArchivist, () => "chainArchivist is required"),
1995
+ chainStakeViewer: assertEx19(params?.chainStakeViewer, () => "chainStakeViewer is required"),
1996
+ stakeIntentStateArchivist: assertEx19(params?.stakeIntentStateArchivist, () => "stakeIntentStateArchivist is required")
1997
+ };
1542
1998
  }
1543
1999
  async createHandler() {
1544
2000
  const head = await this.blockViewer.currentBlock();
@@ -1547,13 +2003,13 @@ var XyoStakeIntentService = class extends BaseService {
1547
2003
  }
1548
2004
  async getDeclaredCandidateRanges(address, intent) {
1549
2005
  await Promise.resolve();
1550
- assertEx13(intent === "producer", () => `Support not yet added for intent ${intent}`);
2006
+ assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
1551
2007
  const results = this._producers.get(address);
1552
2008
  return results ?? [];
1553
2009
  }
1554
2010
  async getDeclaredCandidatesForBlock(block, intent) {
1555
2011
  return await this.spanAsync("getDeclaredCandidatesForBlock", async () => {
1556
- assertEx13(intent === "producer", () => `Support not yet added for intent ${intent}`);
2012
+ assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
1557
2013
  const results = this._producers.findAllContaining(block);
1558
2014
  const candidates = [
1559
2015
  ...results
@@ -1607,7 +2063,7 @@ var XyoStakeIntentService = class extends BaseService {
1607
2063
  }
1608
2064
  async persistState(current) {
1609
2065
  const state = this._producers.serialize();
1610
- const payload = new PayloadBuilder7({
2066
+ const payload = new PayloadBuilder10({
1611
2067
  schema: ChainIndexingServiceStateSchema
1612
2068
  }).fields({
1613
2069
  endBlockHash: current,
@@ -1618,8 +2074,8 @@ var XyoStakeIntentService = class extends BaseService {
1618
2074
  ]);
1619
2075
  }
1620
2076
  async recoverState(current) {
1621
- return await timeBudget("XyoStakeIntentService.recoverState", console, async () => {
1622
- const currentBlock = assertEx13(asBlockBoundWitness3((await this.chainArchivist.get([
2077
+ return await timeBudget5("XyoStakeIntentService.recoverState", console, async () => {
2078
+ const currentBlock = assertEx19(asBlockBoundWitness3((await this.chainArchivist.get([
1623
2079
  current
1624
2080
  ]))?.[0]), () => `Block ${current} not found`);
1625
2081
  const currentBlockNum = currentBlock.block;
@@ -1661,7 +2117,7 @@ var XyoStakeIntentService = class extends BaseService {
1661
2117
  return await this.spanAsync("updateIndex", async () => {
1662
2118
  const currentHead = (await this.blockViewer.currentBlock())[0];
1663
2119
  if (isUndefined3(currentHead)) return;
1664
- return await timeBudget("XyoStakeIntentService.updateIndex", console, async () => {
2120
+ return await timeBudget5("XyoStakeIntentService.updateIndex", console, async () => {
1665
2121
  const currentHeadHash = currentHead._hash;
1666
2122
  const chainMap = readPayloadMapFromStore2(this.chainArchivist);
1667
2123
  const result = await analyzeChain({
@@ -1677,7 +2133,7 @@ var XyoStakeIntentService = class extends BaseService {
1677
2133
  const { exp, nbf } = signedDeclaration;
1678
2134
  const start = nbf;
1679
2135
  const stop = exp;
1680
- const address = asAddress(signedDeclaration?.from);
2136
+ const address = asAddress2(signedDeclaration?.from);
1681
2137
  if (start !== void 0 && stop !== void 0 && address !== void 0) {
1682
2138
  this._producers.insert(address, start, stop);
1683
2139
  }
@@ -1688,83 +2144,35 @@ var XyoStakeIntentService = class extends BaseService {
1688
2144
  });
1689
2145
  }
1690
2146
  };
1691
- XyoStakeIntentService = _ts_decorate13([
1692
- creatable13()
2147
+ XyoStakeIntentService = _ts_decorate10([
2148
+ creatable10()
1693
2149
  ], XyoStakeIntentService);
1694
2150
 
1695
2151
  // src/StepStake/BaseStepStakeService.ts
1696
- import { creatable as creatable14 } from "@xylabs/sdk-js";
1697
- function _ts_decorate14(decorators, target, key, desc) {
2152
+ import { creatable as creatable11 } from "@xylabs/sdk-js";
2153
+ function _ts_decorate11(decorators, target, key, desc) {
1698
2154
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1699
2155
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1700
2156
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1701
2157
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1702
2158
  }
1703
- __name(_ts_decorate14, "_ts_decorate");
2159
+ __name(_ts_decorate11, "_ts_decorate");
1704
2160
  var BaseStepStakeService = class extends BaseService {
1705
2161
  static {
1706
2162
  __name(this, "BaseStepStakeService");
1707
2163
  }
1708
2164
  stepStake(_step) {
1709
- throw new Error("Method not implemented.");
2165
+ throw new Error("Method [stepStake] not implemented.");
1710
2166
  }
1711
2167
  stepStakeForAddress(_address, _step) {
1712
- throw new Error("Method not implemented.");
2168
+ throw new Error("Method [stepStakeForAddress] not implemented.");
1713
2169
  }
1714
2170
  };
1715
- BaseStepStakeService = _ts_decorate14([
1716
- creatable14()
2171
+ BaseStepStakeService = _ts_decorate11([
2172
+ creatable11()
1717
2173
  ], BaseStepStakeService);
1718
-
1719
- // src/Time/BaseTimeSyncService.ts
1720
- import { creatable as creatable15 } from "@xylabs/sdk-js";
1721
- import { SimpleTimeSyncViewer } from "@xyo-network/xl1-protocol-sdk";
1722
- function _ts_decorate15(decorators, target, key, desc) {
1723
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1724
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1725
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1726
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1727
- }
1728
- __name(_ts_decorate15, "_ts_decorate");
1729
- var BaseTimeSyncService = class extends BaseService {
1730
- static {
1731
- __name(this, "BaseTimeSyncService");
1732
- }
1733
- timeSyncViewer;
1734
- get blockViewer() {
1735
- return this.params.blockViewer;
1736
- }
1737
- get ethProvider() {
1738
- return this.params.ethProvider;
1739
- }
1740
- async convertTime(fromDomain, toDomain, from) {
1741
- return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from);
1742
- }
1743
- async createHandler() {
1744
- await super.createHandler();
1745
- this.timeSyncViewer = new SimpleTimeSyncViewer(this.blockViewer, this.ethProvider);
1746
- }
1747
- async currentTime(domain) {
1748
- return await this.timeSyncViewer.currentTime(domain);
1749
- }
1750
- async currentTimeAndHash(domain) {
1751
- return await this.timeSyncViewer.currentTimeAndHash(domain);
1752
- }
1753
- async currentTimePayload() {
1754
- return await this.timeSyncViewer.currentTimePayload();
1755
- }
1756
- };
1757
- BaseTimeSyncService = _ts_decorate15([
1758
- creatable15()
1759
- ], BaseTimeSyncService);
1760
2174
  export {
1761
- BaseAccountBalanceService,
1762
- BaseAccountBalanceServiceParamsZod,
1763
- BaseAccountTransfersService,
1764
2175
  BaseAccountableService,
1765
- BaseBlockProducerService,
1766
- BaseBlockProducerServiceParamsZod,
1767
- BaseBlockRewardService,
1768
2176
  BaseElectionService,
1769
2177
  BaseNetworkStakeStepRewardService,
1770
2178
  BasePendingTransactionsService,
@@ -1774,17 +2182,34 @@ export {
1774
2182
  BaseTimeSyncService,
1775
2183
  ChainBlockNumberIterationService,
1776
2184
  DEFAULT_BLOCK_SIZE,
1777
- EvmBlockRewardService,
2185
+ EvmBlockRewardViewer,
1778
2186
  EvmChainService,
1779
- MemoryBlockRewardService,
1780
2187
  MemoryChainService,
2188
+ SimpleBlockRunner,
2189
+ SimpleBlockRunnerParamsZod,
1781
2190
  XYO_PRODUCER_REDECLARATION_DURATION,
1782
2191
  XYO_PRODUCER_REDECLARATION_WINDOW,
1783
2192
  XyoStakeIntentService,
1784
2193
  XyoValidator,
1785
- accountBalancesServiceFromArchivist,
2194
+ accountBalancesViewerFromArchivist,
1786
2195
  blockViewerFromChainIteratorAndArchivist,
2196
+ canUseEvmProvider,
1787
2197
  creatableService,
1788
- getBlockSignedStakeDeclarations
2198
+ getBlockSignedStakeDeclarations,
2199
+ initAccountBalanceService,
2200
+ initBlockProducer,
2201
+ initBlockRewardViewer,
2202
+ initBlockViewer,
2203
+ initChainService,
2204
+ initEvmBlockRewardViewer,
2205
+ initEvmProvider,
2206
+ initHead,
2207
+ initMemoryChainService,
2208
+ initMempoolRunner,
2209
+ initMempoolViewer,
2210
+ initPendingTransactions,
2211
+ initTimeService,
2212
+ initValidator,
2213
+ initXyoBlockRewardViewer
1789
2214
  };
1790
2215
  //# sourceMappingURL=index.mjs.map