@xyo-network/chain-services 1.17.0 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts +1 -1
  2. package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts.map +1 -1
  3. package/dist/neutral/AccountBalance/index.d.ts +0 -1
  4. package/dist/neutral/AccountBalance/index.d.ts.map +1 -1
  5. package/dist/neutral/BaseService.d.ts +0 -3
  6. package/dist/neutral/BaseService.d.ts.map +1 -1
  7. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts +17 -0
  8. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -0
  9. package/dist/neutral/BlockReward/index.d.ts +1 -3
  10. package/dist/neutral/BlockReward/index.d.ts.map +1 -1
  11. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts +4 -2
  12. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
  13. package/dist/neutral/ChainService/Evm/Evm.d.ts +2 -1
  14. package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
  15. package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -0
  16. package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
  17. package/dist/neutral/ChainValidator/XyoValidator.d.ts +2 -16
  18. package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
  19. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +7 -6
  20. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
  21. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +5 -4
  22. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
  23. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -1
  24. package/dist/neutral/implementation/accountBalance.d.ts +7 -0
  25. package/dist/neutral/implementation/accountBalance.d.ts.map +1 -0
  26. package/dist/neutral/implementation/blockViewer.d.ts +7 -0
  27. package/dist/neutral/implementation/blockViewer.d.ts.map +1 -0
  28. package/dist/neutral/implementation/chain/evm.d.ts +7 -0
  29. package/dist/neutral/implementation/chain/evm.d.ts.map +1 -0
  30. package/dist/neutral/implementation/chain/index.d.ts +7 -0
  31. package/dist/neutral/implementation/chain/index.d.ts.map +1 -0
  32. package/dist/neutral/implementation/evm/index.d.ts +2 -0
  33. package/dist/neutral/implementation/evm/index.d.ts.map +1 -0
  34. package/dist/neutral/implementation/evm/initChainId.d.ts +4 -0
  35. package/dist/neutral/implementation/evm/initChainId.d.ts.map +1 -0
  36. package/dist/neutral/implementation/evm/initEvmProvider.d.ts +11 -0
  37. package/dist/neutral/implementation/evm/initEvmProvider.d.ts.map +1 -0
  38. package/dist/neutral/implementation/evm/initInfuraProvider.d.ts +6 -0
  39. package/dist/neutral/implementation/evm/initInfuraProvider.d.ts.map +1 -0
  40. package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts +6 -0
  41. package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts.map +1 -0
  42. package/dist/neutral/implementation/head/createBootstrapHead.d.ts +5 -0
  43. package/dist/neutral/implementation/head/createBootstrapHead.d.ts.map +1 -0
  44. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +8 -0
  45. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
  46. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +9 -0
  47. package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
  48. package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
  49. package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
  50. package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts +4 -0
  51. package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
  52. package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
  53. package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
  54. package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +11 -0
  55. package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
  56. package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts +11 -0
  57. package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
  58. package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +11 -0
  59. package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
  60. package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +13 -0
  61. package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
  62. package/dist/neutral/implementation/head/createForkedHead/index.d.ts +2 -0
  63. package/dist/neutral/implementation/head/createForkedHead/index.d.ts.map +1 -0
  64. package/dist/neutral/implementation/head/getForkFromBlock.d.ts +12 -0
  65. package/dist/neutral/implementation/head/getForkFromBlock.d.ts.map +1 -0
  66. package/dist/neutral/implementation/head/head.d.ts +11 -0
  67. package/dist/neutral/implementation/head/head.d.ts.map +1 -0
  68. package/dist/neutral/implementation/head/index.d.ts +2 -0
  69. package/dist/neutral/implementation/head/index.d.ts.map +1 -0
  70. package/dist/neutral/implementation/head/submitNewChain.d.ts +10 -0
  71. package/dist/neutral/implementation/head/submitNewChain.d.ts.map +1 -0
  72. package/dist/neutral/implementation/index.d.ts +13 -0
  73. package/dist/neutral/implementation/index.d.ts.map +1 -0
  74. package/dist/neutral/implementation/mempoolRunner.d.ts +7 -0
  75. package/dist/neutral/implementation/mempoolRunner.d.ts.map +1 -0
  76. package/dist/neutral/implementation/mempoolViewer.d.ts +7 -0
  77. package/dist/neutral/implementation/mempoolViewer.d.ts.map +1 -0
  78. package/dist/neutral/implementation/pendingTransactions.d.ts +9 -0
  79. package/dist/neutral/implementation/pendingTransactions.d.ts.map +1 -0
  80. package/dist/neutral/implementation/producer.d.ts +5 -0
  81. package/dist/neutral/implementation/producer.d.ts.map +1 -0
  82. package/dist/neutral/implementation/reward.d.ts +14 -0
  83. package/dist/neutral/implementation/reward.d.ts.map +1 -0
  84. package/dist/neutral/implementation/time.d.ts +6 -0
  85. package/dist/neutral/implementation/time.d.ts.map +1 -0
  86. package/dist/neutral/implementation/validator.d.ts +5 -0
  87. package/dist/neutral/implementation/validator.d.ts.map +1 -0
  88. package/dist/neutral/index.d.ts +2 -2
  89. package/dist/neutral/index.d.ts.map +1 -1
  90. package/dist/neutral/index.mjs +1565 -1140
  91. package/dist/neutral/index.mjs.map +1 -1
  92. package/dist/neutral/simple/block/index.d.ts +2 -0
  93. package/dist/neutral/simple/block/index.d.ts.map +1 -0
  94. package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts +117 -0
  95. package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -0
  96. package/dist/neutral/simple/block/runner/generateTransactionFeeTransfers.d.ts.map +1 -0
  97. package/dist/neutral/simple/block/runner/index.d.ts +2 -0
  98. package/dist/neutral/simple/block/runner/index.d.ts.map +1 -0
  99. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts +2 -0
  100. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts.map +1 -0
  101. package/dist/neutral/simple/index.d.ts +2 -0
  102. package/dist/neutral/simple/index.d.ts.map +1 -0
  103. package/package.json +30 -27
  104. package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +35 -8
  105. package/src/AccountBalance/index.ts +0 -1
  106. package/src/BaseService.ts +0 -13
  107. package/src/BlockReward/EvmBlockRewardViewer.ts +50 -0
  108. package/src/BlockReward/index.ts +1 -3
  109. package/src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts +14 -2
  110. package/src/ChainService/Evm/Evm.ts +5 -4
  111. package/src/ChainService/Memory/Memory.ts +5 -0
  112. package/src/ChainValidator/XyoValidator.ts +25 -30
  113. package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +18 -18
  114. package/src/PendingTransactions/BasePendingTransactions.ts +10 -5
  115. package/src/Schemas/BaseSchemasService.ts +1 -1
  116. package/src/StakeIntent/XyoStakeIntentService.ts +18 -8
  117. package/src/StepStake/BaseStepStakeService.ts +2 -2
  118. package/src/blockViewerFromChainIteratorAndArchivist.ts +8 -1
  119. package/src/implementation/accountBalance.ts +29 -0
  120. package/src/implementation/blockViewer.ts +29 -0
  121. package/src/implementation/chain/evm.ts +39 -0
  122. package/src/implementation/chain/index.ts +46 -0
  123. package/src/implementation/evm/index.ts +1 -0
  124. package/src/implementation/evm/initChainId.ts +20 -0
  125. package/src/implementation/evm/initEvmProvider.ts +24 -0
  126. package/src/implementation/evm/initInfuraProvider.ts +26 -0
  127. package/src/implementation/evm/initJsonRpcProvider.ts +20 -0
  128. package/src/implementation/head/createBootstrapHead.ts +31 -0
  129. package/src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
  130. package/src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +19 -0
  131. package/src/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
  132. package/src/implementation/head/createForkedHead/config/index.ts +3 -0
  133. package/src/implementation/head/createForkedHead/createForkedHead.ts +29 -0
  134. package/src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +42 -0
  135. package/src/implementation/head/createForkedHead/getBridgeIntent.ts +51 -0
  136. package/src/implementation/head/createForkedHead/getBridgeSourceObservation.ts +46 -0
  137. package/src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +41 -0
  138. package/src/implementation/head/createForkedHead/index.ts +1 -0
  139. package/src/implementation/head/getForkFromBlock.ts +43 -0
  140. package/src/implementation/head/head.ts +49 -0
  141. package/src/implementation/head/index.ts +1 -0
  142. package/src/implementation/head/submitNewChain.ts +27 -0
  143. package/src/implementation/index.ts +12 -0
  144. package/src/implementation/mempoolRunner.ts +29 -0
  145. package/src/implementation/mempoolViewer.ts +29 -0
  146. package/src/implementation/pendingTransactions.ts +36 -0
  147. package/src/implementation/producer.ts +16 -0
  148. package/src/implementation/reward.ts +53 -0
  149. package/src/implementation/time.ts +26 -0
  150. package/src/implementation/validator.ts +15 -0
  151. package/src/index.ts +2 -2
  152. package/src/simple/block/index.ts +1 -0
  153. package/src/{BlockProducer/BaseBlockProducerService.ts → simple/block/runner/SimpleBlockRunner.ts} +111 -74
  154. package/src/simple/block/runner/index.ts +1 -0
  155. package/src/simple/block/runner/spec/SimpleBlockRewardViewer.ts +413 -0
  156. package/src/simple/index.ts +1 -0
  157. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts +0 -35
  158. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +0 -1
  159. package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts +0 -13
  160. package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts.map +0 -1
  161. package/dist/neutral/AccountTransfers/index.d.ts +0 -2
  162. package/dist/neutral/AccountTransfers/index.d.ts.map +0 -1
  163. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +0 -85
  164. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +0 -1
  165. package/dist/neutral/BlockProducer/generateTransactionFeeTransfers.d.ts.map +0 -1
  166. package/dist/neutral/BlockProducer/index.d.ts +0 -2
  167. package/dist/neutral/BlockProducer/index.d.ts.map +0 -1
  168. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts +0 -10
  169. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +0 -1
  170. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +0 -18
  171. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +0 -1
  172. package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts +0 -23
  173. package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts.map +0 -1
  174. package/src/AccountBalance/BaseAccountBalanceService.ts +0 -98
  175. package/src/AccountTransfers/BaseAccountTransfersService.ts +0 -36
  176. package/src/AccountTransfers/index.ts +0 -1
  177. package/src/BlockProducer/index.ts +0 -1
  178. package/src/BlockReward/BaseBlockRewardService.ts +0 -17
  179. package/src/BlockReward/EvmBlockRewardService.ts +0 -49
  180. package/src/BlockReward/MemoryBlockRewardService.ts +0 -72
  181. /package/dist/neutral/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.d.ts +0 -0
  182. /package/src/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.ts +0 -0
@@ -1,7 +1,10 @@
1
- /* eslint-disable max-statements */
2
1
  import {
3
- Address, AddressZod, asHash, assertEx, creatable, exists, Hex, hexToBigInt, isDefined, toHex,
2
+ AbstractCreatable,
3
+ Address,
4
+ AddressZod, asHash, assertEx, creatable, CreatableParams, exists, Hex, hexToBigInt, isDefined, Promisable,
4
5
  } from '@xylabs/sdk-js'
6
+ import { AccountInstance } from '@xyo-network/account-model'
7
+ import { MemoryArchivist } from '@xyo-network/archivist-memory'
5
8
  import { ArchivistInstance } from '@xyo-network/archivist-model'
6
9
  import {
7
10
  BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,
@@ -11,16 +14,20 @@ import { PayloadBuilder } from '@xyo-network/payload-builder'
11
14
  import { WithHashMeta } from '@xyo-network/payload-model'
12
15
  import {
13
16
  AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness, BlockNumberPayload, BlockNumberSchema,
14
- ChainStakeIntent, defaultRewardRatio, HydratedBlockWithHashMeta, SignedHydratedTransaction, TimePayload, TimeSchema,
17
+ ChainId,
18
+ ChainStakeIntent, defaultRewardRatio, SignedBlockBoundWitnessWithHashMeta,
19
+ SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimePayload, TimeSchema,
15
20
  Transfer, XYO_STEP_REWARD_ADDRESS,
16
21
  } from '@xyo-network/xl1-protocol'
17
22
  import {
18
- AccountBalanceViewer, BlockProducerService, Config, MempoolViewer, StakeIntentService, TimeSyncViewer,
23
+ AccountBalanceViewer, BlockRewardViewer, BlockRunner, Config,
24
+ HydratedBlockStateValidationFunction,
25
+ MempoolRunner,
26
+ MempoolViewer,
27
+ TimeSyncViewer,
19
28
  } from '@xyo-network/xl1-protocol-sdk'
20
29
  import z from 'zod'
21
30
 
22
- import { BaseService } from '../BaseService.ts'
23
- import { XyoValidatorParams } from '../ChainValidator/index.ts'
24
31
  import { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'
25
32
 
26
33
  /**
@@ -39,25 +46,38 @@ export const XYO_PRODUCER_REDECLARATION_DURATION = 10_000
39
46
  */
40
47
  export const XYO_PRODUCER_REDECLARATION_WINDOW = 500
41
48
 
42
- export const BaseBlockProducerServiceParamsZod = z.object({
43
- balanceService: z.object().loose(),
44
- pendingTransactionsService: z.object().loose(),
45
- rejectedTransactionsArchivist: z.object().loose(),
49
+ export const SimpleBlockRunnerParamsZod = z.object({
50
+ balanceViewer: z.object().loose(),
51
+ blockRewardViewer: z.object().loose(),
52
+ chainId: z.string(),
53
+ config: z.object().loose(),
54
+ mempoolViewer: z.object().loose(),
55
+ mempoolRunner: z.object().loose(),
56
+ rejectedTransactionsArchivist: z.object().loose().optional(),
46
57
  rewardAddress: AddressZod,
47
58
  time: z.object().loose(),
59
+ validateHydratedBlockState: z.function().optional(),
48
60
  })
49
61
 
50
- export interface BaseBlockProducerServiceParams extends XyoValidatorParams<Pick<Config, 'producer'>> {
51
- balanceService: AccountBalanceViewer
52
- pendingTransactionsService: MempoolViewer
53
- rejectedTransactionsArchivist: ArchivistInstance
62
+ export type SimpleBlockRunnerParams = CreatableParams & {
63
+ account: AccountInstance
64
+ balanceViewer: AccountBalanceViewer
65
+ blockRewardViewer: BlockRewardViewer
66
+ chainId: ChainId
67
+ config: Config
68
+ mempoolRunner: MempoolRunner
69
+ mempoolViewer: MempoolViewer
70
+ rejectedTransactionsArchivist?: ArchivistInstance
54
71
  rewardAddress: Address
55
72
  time: TimeSyncViewer
73
+ validateHydratedBlockState?: HydratedBlockStateValidationFunction
56
74
  }
57
75
 
58
76
  @creatable()
59
- export class BaseBlockProducerService extends BaseService<BaseBlockProducerServiceParams> implements BlockProducerService {
77
+ export class SimpleBlockRunner extends AbstractCreatable<SimpleBlockRunnerParams> implements BlockRunner {
60
78
  protected _blockRewardDiviner: BlockRewardDiviner | undefined
79
+ protected _lastRedeclarationBlock: number | undefined
80
+ protected _rejectedTransactionsArchivist: ArchivistInstance | undefined
61
81
 
62
82
  /**
63
83
  * The default block size for a block
@@ -90,70 +110,85 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
90
110
  return assertEx(this.params.account, () => 'account is required')
91
111
  }
92
112
 
93
- protected get balanceService() {
94
- return assertEx(this.params.balanceService, () => 'balanceService is required')
113
+ protected get balanceViewer() {
114
+ return assertEx(this.params.balanceViewer, () => 'balanceViewer is required')
95
115
  }
96
116
 
97
- protected get blockViewer() {
98
- return assertEx(this.params.blockViewer, () => 'blockViewer is required')
117
+ protected get blockRewardViewer() {
118
+ return assertEx(this.params.blockRewardViewer, () => 'blockRewardViewer is required')
99
119
  }
100
120
 
101
121
  protected get chainId() {
102
122
  return assertEx(this.params.chainId, () => 'chainId is required')
103
123
  }
104
124
 
105
- protected get electionService() {
106
- return assertEx(this.params.electionService, () => 'electionService is required')
125
+ // protected get electionService() {
126
+ // return assertEx(this.params.electionService, () => 'electionService is required')
127
+ // }
128
+
129
+ protected get mempoolRunner() {
130
+ return assertEx(this.params.mempoolRunner, () => 'mempoolRunner is required')
107
131
  }
108
132
 
109
- protected get pendingTransactionsService() {
110
- return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')
133
+ protected get mempoolViewer() {
134
+ return assertEx(this.params.mempoolViewer, () => 'mempoolViewer is required')
111
135
  }
112
136
 
137
+ // protected get pendingTransactionsService() {
138
+ // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')
139
+ // }
140
+
113
141
  protected get rejectedTransactionsArchivist() {
114
- return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected bundled transactions archivist')
142
+ return this._rejectedTransactionsArchivist!
115
143
  }
116
144
 
117
145
  protected get rewardAddress(): Address {
118
146
  return assertEx(this.params.rewardAddress, () => 'No reward address provided')
119
147
  }
120
148
 
121
- protected get rewardService() {
122
- return assertEx(this.params.rewardService, () => 'rewardService is required')
123
- }
124
-
125
- protected get stakeIntentService(): StakeIntentService {
126
- return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')
127
- }
149
+ // protected get stakeIntentService(): StakeIntentService {
150
+ // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')
151
+ // }
128
152
 
129
153
  protected get time(): TimeSyncViewer {
130
154
  return assertEx(this.params.time, () => 'No TimeSyncViewer provided')
131
155
  }
132
156
 
133
- protected get validateHydratedBlockState() {
134
- return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')
135
- }
157
+ // protected get validateHydratedBlockState() {
158
+ // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')
159
+ // }
136
160
 
137
- static override async paramsHandler(params?: Partial<BaseBlockProducerServiceParams> | undefined): Promise<BaseBlockProducerServiceParams> {
161
+ static override async paramsHandler(params?: Partial<SimpleBlockRunnerParams> | undefined): Promise<SimpleBlockRunnerParams> {
138
162
  // TODO: Use a real zod and move the zod check to the AbstractCreatable class
139
- BaseBlockProducerServiceParamsZod.parse(params)
140
- return { ...(await super.paramsHandler(params)), ...params } as BaseBlockProducerServiceParams
163
+ SimpleBlockRunnerParamsZod.parse(params)
164
+ const rejectedTransactionsArchivist = params?.rejectedTransactionsArchivist ?? await MemoryArchivist.create()
165
+ return {
166
+ ...(await super.paramsHandler(params)), ...params, rejectedTransactionsArchivist,
167
+ } as SimpleBlockRunnerParams
141
168
  }
142
169
 
143
- async next(head: WithHashMeta<BlockBoundWitness>): Promise<HydratedBlockWithHashMeta | undefined> {
170
+ async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {
144
171
  // If the block is for another chain, ignore
145
172
  if (head.chain !== this.chainId) return
146
- const leadersStart = Date.now()
147
- const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)
148
- const leadersDuration = Date.now() - leadersStart
149
- if (leadersDuration > 100) {
150
- this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)
151
- }
173
+ // const leadersStart = Date.now()
174
+ // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)
175
+ // const leadersDuration = Date.now() - leadersStart
176
+ // if (leadersDuration > 100) {
177
+ // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)
178
+ // }
152
179
  // TODO: Should we propose block if creator committee is empty?
153
180
  // TODO: Handle the case where we're not the 1st leader but they're not responding
154
181
  // at a higher level than here as that's a network issue
155
- if (!leaders.includes(this.address)) return
156
- return this.proposeNextValidBlock(head)
182
+ // if (!leaders.includes(this.address)) return
183
+ return await this.proposeNextValidBlock(head)
184
+ }
185
+
186
+ async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>
187
+ async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>
188
+ async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {
189
+ assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')
190
+ const result = await this.proposeNextValidBlock(head)
191
+ return force ? assertEx(result, () => 'Failed to produce next block') : result
157
192
  }
158
193
 
159
194
  protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {
@@ -161,7 +196,7 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
161
196
  // TODO: Adjust to allow for genesis block reward vs. normal block reward
162
197
  this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({
163
198
  account: 'random',
164
- blockRewardService: this.rewardService,
199
+ blockRewardViewer: this.blockRewardViewer,
165
200
  config: {
166
201
  rewardAddress: this.rewardAddress,
167
202
  rewardPercentageRatio: defaultRewardRatio,
@@ -169,8 +204,8 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
169
204
  },
170
205
  })
171
206
  }
172
- const blockHex = assertEx(toHex(block), () => 'Failed to convert block to hex')
173
- const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block: blockHex }).build()
207
+
208
+ const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()
174
209
  const rewards = await this._blockRewardDiviner.divine([blockId])
175
210
  return rewards as Transfer[]
176
211
  }
@@ -180,30 +215,31 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
180
215
  * @param head The current head block
181
216
  * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
182
217
  */
183
- protected async getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promise<ChainStakeIntent | undefined> {
218
+ protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {
219
+ // TODO: Do not redeclare on every block
184
220
  // Decide if we should redeclare intent
185
221
  if (this.params.config.producer.disableIntentRedeclaration) return
186
222
  // Decide if we need to redeclare intent
187
- const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')
223
+ // const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')
188
224
  // TODO: This doesn't handle the case where the producer had declared a range for the future
189
225
  // but we're in a range that's not the future
190
226
  // Sort in ascending order based on ending range to get range with highest ending block
191
- const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)
192
- if (!lastRange) return
193
- const [, currentDeclarationEnd] = lastRange
227
+ // const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)
228
+ // if (!lastRange) return
229
+ // const [, currentDeclarationEnd] = lastRange
194
230
  const currentBlock = head.block
195
- const timeToProducerExpiration = currentDeclarationEnd - currentBlock
196
- if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return
197
- return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + BaseBlockProducerService.RedeclarationDuration)
231
+ // const timeToProducerExpiration = currentDeclarationEnd - currentBlock
232
+ // if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return
233
+ return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)
198
234
  }
199
235
 
200
- protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false): Promise<HydratedBlockWithHashMeta | undefined> {
236
+ protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {
201
237
  return await this.spanAsync('proposeNextValidBlock', async () => {
202
238
  // Calculate the next block components
203
239
  const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')
204
240
  const nextBlock = previousBlock + 1
205
241
  const nextBlockTransactionsStart = Date.now()
206
- const nextBlockTransactions = await this.pendingTransactionsService.pendingTransactions({ limit: BaseBlockProducerService.DefaultBlockSize })
242
+ const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })
207
243
  const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart
208
244
  if (nextBlockTransactionsDuration > 200) {
209
245
  this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`)
@@ -216,7 +252,7 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
216
252
  if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)
217
253
 
218
254
  // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block
219
- if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) return
255
+ if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return
220
256
 
221
257
  // Calculate the optional block reward transfer and add if necessary
222
258
  const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)
@@ -237,25 +273,26 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
237
273
  // Build the block
238
274
  this.logger?.info(`Building block ${head.block + 1}`)
239
275
  const startBuild = Date.now()
240
- const stepRewardPoolBalance = (await this.balanceService.accountsBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]
276
+ const stepRewardPoolBalance = (await this.balanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]
241
277
  const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance)
242
278
 
243
279
  this.logger?.info(
244
280
  `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,
245
281
  )
246
282
 
247
- this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)
248
- const startValidate = Date.now()
249
- const errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceService })
250
- this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)
251
-
252
- if (errors.length > 0) {
253
- this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)
254
- const rejectedTransactions = block[1]
255
- await this.rejectedTransactionsArchivist.insert(rejectedTransactions)
256
- } else {
257
- return block
258
- }
283
+ // this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)
284
+ // const startValidate = Date.now()
285
+ // const errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceViewer })
286
+ // this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)
287
+
288
+ // if (errors.length > 0) {
289
+ // this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)
290
+ // const rejectedTransactions = block[1]
291
+ // await this.rejectedTransactionsArchivist.insert(rejectedTransactions)
292
+ // } else {
293
+ await this.mempoolRunner.submitBlocks([block])
294
+ return block
295
+ // }
259
296
  })
260
297
  }
261
298
 
@@ -272,7 +309,7 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
272
309
  if (!transfer) return
273
310
  const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)
274
311
  if (validateBalances) {
275
- const balance = (await this.balanceService.accountsBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)
312
+ const balance = (await this.balanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)
276
313
  if (balance >= totalTransferCost) {
277
314
  fundedTransfers.push(transfer)
278
315
  return tx
@@ -0,0 +1 @@
1
+ export * from './SimpleBlockRunner.ts'