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