@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.
- package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts +1 -1
- package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts.map +1 -1
- package/dist/neutral/AccountBalance/index.d.ts +0 -1
- package/dist/neutral/AccountBalance/index.d.ts.map +1 -1
- package/dist/neutral/BaseService.d.ts +0 -3
- package/dist/neutral/BaseService.d.ts.map +1 -1
- package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts +17 -0
- package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -0
- package/dist/neutral/BlockReward/index.d.ts +1 -3
- package/dist/neutral/BlockReward/index.d.ts.map +1 -1
- package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts +4 -2
- package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
- package/dist/neutral/ChainService/Evm/Evm.d.ts +2 -1
- package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
- package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -0
- package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
- package/dist/neutral/ChainValidator/XyoValidator.d.ts +2 -16
- package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +7 -6
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +5 -4
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
- package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -1
- package/dist/neutral/implementation/accountBalance.d.ts +7 -0
- package/dist/neutral/implementation/accountBalance.d.ts.map +1 -0
- package/dist/neutral/implementation/blockViewer.d.ts +7 -0
- package/dist/neutral/implementation/blockViewer.d.ts.map +1 -0
- package/dist/neutral/implementation/chain/evm.d.ts +7 -0
- package/dist/neutral/implementation/chain/evm.d.ts.map +1 -0
- package/dist/neutral/implementation/chain/index.d.ts +7 -0
- package/dist/neutral/implementation/chain/index.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/index.d.ts +2 -0
- package/dist/neutral/implementation/evm/index.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initChainId.d.ts +4 -0
- package/dist/neutral/implementation/evm/initChainId.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initEvmProvider.d.ts +11 -0
- package/dist/neutral/implementation/evm/initEvmProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initInfuraProvider.d.ts +6 -0
- package/dist/neutral/implementation/evm/initInfuraProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts +6 -0
- package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createBootstrapHead.d.ts +5 -0
- package/dist/neutral/implementation/head/createBootstrapHead.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +8 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +9 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts +4 -0
- package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
- package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +13 -0
- package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/index.d.ts +2 -0
- package/dist/neutral/implementation/head/createForkedHead/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/getForkFromBlock.d.ts +12 -0
- package/dist/neutral/implementation/head/getForkFromBlock.d.ts.map +1 -0
- package/dist/neutral/implementation/head/head.d.ts +11 -0
- package/dist/neutral/implementation/head/head.d.ts.map +1 -0
- package/dist/neutral/implementation/head/index.d.ts +2 -0
- package/dist/neutral/implementation/head/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/submitNewChain.d.ts +10 -0
- package/dist/neutral/implementation/head/submitNewChain.d.ts.map +1 -0
- package/dist/neutral/implementation/index.d.ts +13 -0
- package/dist/neutral/implementation/index.d.ts.map +1 -0
- package/dist/neutral/implementation/mempoolRunner.d.ts +7 -0
- package/dist/neutral/implementation/mempoolRunner.d.ts.map +1 -0
- package/dist/neutral/implementation/mempoolViewer.d.ts +7 -0
- package/dist/neutral/implementation/mempoolViewer.d.ts.map +1 -0
- package/dist/neutral/implementation/pendingTransactions.d.ts +9 -0
- package/dist/neutral/implementation/pendingTransactions.d.ts.map +1 -0
- package/dist/neutral/implementation/producer.d.ts +5 -0
- package/dist/neutral/implementation/producer.d.ts.map +1 -0
- package/dist/neutral/implementation/reward.d.ts +14 -0
- package/dist/neutral/implementation/reward.d.ts.map +1 -0
- package/dist/neutral/implementation/time.d.ts +6 -0
- package/dist/neutral/implementation/time.d.ts.map +1 -0
- package/dist/neutral/implementation/validator.d.ts +5 -0
- package/dist/neutral/implementation/validator.d.ts.map +1 -0
- package/dist/neutral/index.d.ts +2 -2
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +1565 -1140
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/simple/block/index.d.ts +2 -0
- package/dist/neutral/simple/block/index.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts +117 -0
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/generateTransactionFeeTransfers.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/index.d.ts +2 -0
- package/dist/neutral/simple/block/runner/index.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts +2 -0
- package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts.map +1 -0
- package/dist/neutral/simple/index.d.ts +2 -0
- package/dist/neutral/simple/index.d.ts.map +1 -0
- package/package.json +30 -27
- package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +35 -8
- package/src/AccountBalance/index.ts +0 -1
- package/src/BaseService.ts +0 -13
- package/src/BlockReward/EvmBlockRewardViewer.ts +50 -0
- package/src/BlockReward/index.ts +1 -3
- package/src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts +14 -2
- package/src/ChainService/Evm/Evm.ts +5 -4
- package/src/ChainService/Memory/Memory.ts +5 -0
- package/src/ChainValidator/XyoValidator.ts +25 -30
- package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +18 -18
- package/src/PendingTransactions/BasePendingTransactions.ts +10 -5
- package/src/Schemas/BaseSchemasService.ts +1 -1
- package/src/StakeIntent/XyoStakeIntentService.ts +18 -8
- package/src/StepStake/BaseStepStakeService.ts +2 -2
- package/src/blockViewerFromChainIteratorAndArchivist.ts +8 -1
- package/src/implementation/accountBalance.ts +29 -0
- package/src/implementation/blockViewer.ts +29 -0
- package/src/implementation/chain/evm.ts +39 -0
- package/src/implementation/chain/index.ts +46 -0
- package/src/implementation/evm/index.ts +1 -0
- package/src/implementation/evm/initChainId.ts +20 -0
- package/src/implementation/evm/initEvmProvider.ts +24 -0
- package/src/implementation/evm/initInfuraProvider.ts +26 -0
- package/src/implementation/evm/initJsonRpcProvider.ts +20 -0
- package/src/implementation/head/createBootstrapHead.ts +31 -0
- package/src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
- package/src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +19 -0
- package/src/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
- package/src/implementation/head/createForkedHead/config/index.ts +3 -0
- package/src/implementation/head/createForkedHead/createForkedHead.ts +29 -0
- package/src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +42 -0
- package/src/implementation/head/createForkedHead/getBridgeIntent.ts +51 -0
- package/src/implementation/head/createForkedHead/getBridgeSourceObservation.ts +46 -0
- package/src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +41 -0
- package/src/implementation/head/createForkedHead/index.ts +1 -0
- package/src/implementation/head/getForkFromBlock.ts +43 -0
- package/src/implementation/head/head.ts +49 -0
- package/src/implementation/head/index.ts +1 -0
- package/src/implementation/head/submitNewChain.ts +27 -0
- package/src/implementation/index.ts +12 -0
- package/src/implementation/mempoolRunner.ts +29 -0
- package/src/implementation/mempoolViewer.ts +29 -0
- package/src/implementation/pendingTransactions.ts +36 -0
- package/src/implementation/producer.ts +16 -0
- package/src/implementation/reward.ts +53 -0
- package/src/implementation/time.ts +26 -0
- package/src/implementation/validator.ts +15 -0
- package/src/index.ts +2 -2
- package/src/simple/block/index.ts +1 -0
- package/src/{BlockProducer/BaseBlockProducerService.ts → simple/block/runner/SimpleBlockRunner.ts} +111 -74
- package/src/simple/block/runner/index.ts +1 -0
- package/src/simple/block/runner/spec/SimpleBlockRewardViewer.ts +413 -0
- package/src/simple/index.ts +1 -0
- package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts +0 -35
- package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +0 -1
- package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts +0 -13
- package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts.map +0 -1
- package/dist/neutral/AccountTransfers/index.d.ts +0 -2
- package/dist/neutral/AccountTransfers/index.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +0 -85
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/generateTransactionFeeTransfers.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/index.d.ts +0 -2
- package/dist/neutral/BlockProducer/index.d.ts.map +0 -1
- package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts +0 -10
- package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +0 -1
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +0 -18
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +0 -1
- package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts +0 -23
- package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts.map +0 -1
- package/src/AccountBalance/BaseAccountBalanceService.ts +0 -98
- package/src/AccountTransfers/BaseAccountTransfersService.ts +0 -36
- package/src/AccountTransfers/index.ts +0 -1
- package/src/BlockProducer/index.ts +0 -1
- package/src/BlockReward/BaseBlockRewardService.ts +0 -17
- package/src/BlockReward/EvmBlockRewardService.ts +0 -49
- package/src/BlockReward/MemoryBlockRewardService.ts +0 -72
- /package/dist/neutral/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.d.ts +0 -0
- /package/src/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.ts +0 -0
package/src/{BlockProducer/BaseBlockProducerService.ts → simple/block/runner/SimpleBlockRunner.ts}
RENAMED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
1
|
import {
|
|
3
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
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
|
|
94
|
-
return assertEx(this.params.
|
|
113
|
+
protected get balanceViewer() {
|
|
114
|
+
return assertEx(this.params.balanceViewer, () => 'balanceViewer is required')
|
|
95
115
|
}
|
|
96
116
|
|
|
97
|
-
protected get
|
|
98
|
-
return assertEx(this.params.
|
|
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
|
-
|
|
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
|
|
110
|
-
return assertEx(this.params.
|
|
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
|
|
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
|
|
122
|
-
|
|
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
|
-
|
|
135
|
-
}
|
|
157
|
+
// protected get validateHydratedBlockState() {
|
|
158
|
+
// return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')
|
|
159
|
+
// }
|
|
136
160
|
|
|
137
|
-
static override async paramsHandler(params?: Partial<
|
|
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
|
-
|
|
140
|
-
|
|
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<
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
173
|
-
const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block
|
|
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
|
|
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 +
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
} else {
|
|
257
|
-
|
|
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.
|
|
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'
|